Linux 和Android中的IPC机制
Linux 中的IPC机制
Linux中提供了很多进程间通信机制,主要有: 管道(Pipe)、信号(Singal)、信号量(Semophore)、消息队列(Message)、共享内存(Share Memory) 和套接字(Socket)等。
管道:管道的主要思想是在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息,这个共享文件比较特殊,它不属于文件系统并且只能存在于内存中。此外,管道采用半双工通信方式,数据只能在一个方向上流动。
信号:信号是软件层上对中断机制的一种模拟,信号是一种异步通信方式,进程不必通过任何操作来等待信号的到达。内核可以利用信号来通知用户空间的进程发生了哪些系统事件。但是,信号不适合信息交换,比较适用于进程中断控制。
信号量:信号量是一个计数器,用来控制多个进程对共享资源的访问。信号量常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。信号量主要用于进程间以及同一进程内不同线程之间的同步手段。
消息队列:消息队列是消息的链表,具有特定格式,允许一个或者多个进程向它写入与读取消息。使用消息队列会使信息复制两次,因此对于频繁通信或者信息量大的通信不宜使用消息队列。
共享内存:共享内存的多个进程可以直接读写一块内存空间,是针对其他通信机制运行效率较低而设计的。为了在多个进程间交换信息,内核专门留出一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。这样进程就能直接读写这块内存而不需要进行数据复制。
Android中的IPC机制
序列化:Serializable 和 Parcelable 。
Messenger:是一种轻量级的IPC方案,对AIDL进行封装,它是以串行的方式来处理客户端发送的信息的,如果有大量消息发送到服务端,那么服务端仍然逐个处理在响应客户端明显是不合适的。并且,虽然能够跨进程数据传递,但Messenger不能跨进程方法调用。
AIDL:相对Messenger,可以并发处理客户端发来的消息,能够进行跨进程方法调用。
Bundle、文件共享、ContentProvider 以及 BroadcastReceiver 则略过。
开启多进程
Android中开启多进程的原因主要有以下几点:
- 单进程内存分配不够,需要更多内存。尤其是早期的Android系统只为一个单进程分配 16MB 的可用内存。
- 独立运行的组件,比如个推,它的服务会另外开启一个进程。
- 运行一些”不可见人“的操作,比如获取用户的隐私信息,比如防止双守护进程被用户杀掉