binder学习概述篇和路线图

来源:互联网 发布:游戏美工培训学费 编辑:程序博客网 时间:2024/05/19 12:25


Linux内核支持的进程间通信机制:

a.管道pipe

/*管道  

2.  可以把管道想象为两个实体之间的单向连接器。注意,管道是半双工的,  

3.  如果需要全双工通讯,应该转而考虑套接字。  

4.  匿名管道又称管道,提供了一个进程与它的兄弟进程通讯的方法,只存在于父进程中;  

5.  命名管道,可以存在与文件系统中,任意进程都可找到它,使得不同先祖的进程也可以通讯。  

6.  #include <unistd.h>  

7.  int pipe( int dfs[ 2 ] );创建匿名管道  

8.  int dup(int oldfd );创建一个文件描述符的副本  

9.  int dup2(int oldfd, int targetfd);  

10.  dup/dup2提供了复制文件描述符的功能。他们常用于stdin(0)stdout(1)stderr(2)的重定向;  

11.  #include <sys/types.h>  

12.  #include <sys/stat.h>  

13.  int mkfifo(const char* pathname,mode_t mode  );创建一个命名管道  

14.  记住:管道只不过是一对文件描述符因此所有能够操作文件描述符的函数都可用于管道。这些函数  

15.  包括但不限于select,read,write,fcntl,freopen。  

16. */

一个匿名管道或者说单向管道,为一个进程提供了和它的一个子进程(匿名的种类)进行通信的方法。这是因为没有可以在操作系统当中找到一个匿名进程的方法。它的最通常的用法是在父进程建立一个匿名管道,然后将这个管道传递给它的子进程,然后它们就可以进行通信了。注意,如果需要双向通信的话,我们考虑使用的API就应该是套接字(socketsAPI了。

管道的另一种类型是有名管道。一个有名管道其功能和匿名管道差不多,差别就在于它是可以在文件系统中存在的并且所有进程都可以找到它。这意味着没有血缘关系的进程之间可以使用它来进行通信。

 

b.信号signal

c.消息队列message queue,

消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式。

就是一个消息的链表,可以把一条消息看做一个记录,用户可以从中读取读取消息或者向其中添加消息。

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。消息队列存在于内核中,由“队列ID”来进行标识。

消息队列的实现包括创建,添加信息,读取信息和控制信息队列。

msgget函数

该函数作用是创建和访问一个消息队列

msgsnd函数用来把消息添加到消息队列中

msgrcv函数从一个消息队列中获取消息

msgctl与共享内存的控制函数类似

 

D.内存共享shared memory

共享内存的机制允许两个或多个进程共享一个给定的内存区域。

 

共享内存,是分配一块能被其他进程访问的内存,实现是通过将内存去映射到共享它的进程的地址空间,使进程间的数据传送不再涉及内核,即进程间通信不需要通过进入内核的系统调用来实现。

 

共享内存与其他的进程间通信最大的优点是:数据的复制只有两次,一次是从输入文件到共享内存区,一次从共享内存区到输出文件。而其他的方式则是需要复制4次:服务器将输入文件读入自己的进程空间,再从自己的进程空间写入管道/消息队列等;客户进程从管道/消息队列中读出数据到自己的进程空间,最后输出到客户指定的文件中。

 

通常,进程间信号量会被用来实现共享内存时的访问同步问题

 

e.套接字socket

程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进

程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如

UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal

UNIX system V有:消息(message)、共享存储区(shared memory)和信号量(semaphore).

他们都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。 其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。 

其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。

使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX  BSD的套接字(socket)和UNIX System VTLI(已经被淘汰),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。

 

 

Android系统是在LINUX内核基础上开发而来的,它自己开了一个专用进程间通信机制叫做binder

Binder进程间通信机制在进程间传输数据时,只需要执行一次拷贝操作,因此,它不仅提高了效率,而且节省了内存空间。

 

 

binder学习路图:阅读下面博客顺顺序阅读

Android进程间通信(IPC)机制Binder简要介绍和学习计划http://blog.csdn.net/luoshengyang/article/details/6618363

 

Android深入浅出之Binder机制:http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html

 

Android Binder设计与实现 – 设计篇:http://www.cnblogs.com/angeldevil/p/3296381.html

 

浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路:http://blog.csdn.net/luoshengyang/article/details/6621566

 

浅谈Android系统进程间通信(IPC)机制Binder中的ServerClient获得Service Manager接口之路 :http://blog.csdn.net/luoshengyang/article/details/6627260

 

Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析:http://blog.csdn.net/luoshengyang/article/details/6629298

 

Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析:http://blog.csdn.net/luoshengyang/article/details/6633311

 

Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析:http://blog.csdn.net/luoshengyang/article/details/6642463

  

 

 

 

 

 

 

 

原创粉丝点击