一、共享内存
一种常用的进程间共享方式,两个线程可以共享访问同一块内存区域,减少了数据的复制操作,因此具有速度上的优势,一般情况下实现共享内存的步骤如下:
1.创建共享区域,进程1首先通过操作系统提供的API从内存上申请一块共享区域,生成的共享区域将与某个特定的key进行绑定;
2.映射共享内存,成功创建了共享区域,我们需要把它映射到进程1的空间中才能进一步操作。
3.访问共享区域,进程1已经创建了共享区域,进程2怎么才能访问到它呢?就是利用第一步中产生的key,通过操作系统API,传入通过一个key即可。然后将这块内存映射到进程2自己的空间中。
4.进程间通信,共享内存的各个进程都实现了内存共享之后,便可以利用该区域进行信息交换。由于内存共享本身没有同步机制,所以参与通信的诸进程需要自己写协商处理;
5.撤销内存映射区,完成了进程间通信后,各个进程都需要撤销之前的映射操作。
6.删除功效内存,最后都必须删除共享区域,以便回收内存。
二、管道
管道,这一次很形象的描述了参与通信的双方的行为,即进程A与进程B.
1.分立管道两边的,进行数据传输通信;
2.管道是单向的,所以一个管道如果既要读也要写的话,就必须建立两根管道。就像水管一样
3.一根水管同时具有读取端和写入端,比如进程A从write end写入数据,那么进程B就可以从read end读取到数据;
4.管道是有容量限制的。即当pipe满时,写操作将阻塞,反之,读操作阻塞。
三、Unix Domain Socket(UDS)
UDS是专门针对单机内的进程通信提出来的,优势也被称为IPC Socket.两个虽然在使用方式上类似,但是实现原理大不相同。Android中使用最多的一种IPC就是Binder,其次就是UDS。功能如下:
1.服务端监听IPC请求,
2.客户端发起IPC请求,
3.双方成功建立起IPC连接,
4.客户端向服务端 发送数据证明IPC通信是有效的,
四、RPC(Remote Procedure Calls)
RPC涉及的通信双方通常运行与两台不同的机器中,一般而言,一个完整的RPC通信需要实现以下几个步骤:
1.客户端进程调用Stub接口;
2.Stub根据操作系统的要求进程打包,并执行相应的系统调用;
3.由内核完成与服务端的交互,她负责将客户端的数据发给服务端的内核;
4.服务端Stub解包并调用与数据包匹配的进程;
5.进程执行操作;
6.服务器以上述步骤的逆向过程将结果返回给客户端;
5、Binder机制
其实Binder机制模型就是RPC,也就是说发送的进程向内核提交一个完整的ipc操作,该操作在接受的进程中被执行,当接收者执行时发送者可能被阻塞,使得结果可以返回,发送这也可以选择不阻塞,从而继续执行,与接收者并行。我们知道Android是基于linux内核的,因而她所依赖的Binder驱动也必须是一个标准的linux驱动,具体而言Binder driver会将自己注册成一个misc device,并向上层提供一个\dev\binder节点,值得一提的是binder节点并不对应具体的硬件设备。Binder驱动运行在内核态,可以提供open()、ioctl()、mmap()等常用的文件操作;