前言
进程间通信的本质
因为进程间有隔离,每个进程都有自己独立的用户空间,互相看不到对方,它们之间要想交流信息是没有办法的,但是它们都和内核是连着的,通过一些特殊的系统调用和内核沟通从而达到和其它进程通信的目的
进程间通信的框架
两部分:1:内核的通信中枢,2:用户空间的通信接口
通信机制:
1 共享内存式
通信中枢建立通信信道后就不管了, 由进程间协调,保证数据读写一致性。
2 消息传递式
每次通信都需要通信中枢参与协助,不需要通信进程间同步,
又分:
无边界消息,发过来为字节流,靠进程自己设计如何区分消息的边界
有边界消息 :进程间通信的发送和接收都是以消息为基本单位的
3 进程间通信机制的接口设计
根据通信双方的关系,分:
对称型通信: 关系平等--- 共享内存,或消息传递
非对称型通信:比如客户服务关系,生产消费关系--一般用消息传递
3.1 通信信道建立
对称型:谁建立都可以。
非对称型:一般式服务端,消费端建立,由客户端,生产者加入
3.2 后来者如何加入通信信道
双方约定好信道名字,从而找到信道句柄,根据句柄加入信道
通过继承传递给对方
通过信道名字直接加入信道
进程间通信传递信道句柄
3.3 怎么用通信信道
消息传递式:使用接口
共享内存:直接访问
进程间通信机制简介
共享内存:就是通过修改页表,使得两个虚拟进程空间的一部分虚拟内存对应到相同的物理内存上
消息传递式 | 无边界消息-字节流 | 匿名管道 | 只能父子进程或者亲属进程之间使用,因为要传递信道句柄fd | |
命名管道 | 管道有了名称之后,其它进程就可以通过名称找到信道句柄从而加入信道了 | |||
数据流套接字 | ||||
有边界消息 | SysV消息队列 | 创建接口是msgget | ||
POSIX 消息队列 | 创建接口是mq_open,它的参数和open是类似的 | |||
报文套接字 | 套接字是分为网络套接字和UNIX local套接字,。两者都分为流式套接字和数据报套接字,前者是无边界消息传递式进程间通信,后者是有边界消息传递式进程间通信。 | |||
信号机制 | 内核用来处理程序运行时发生错误的一种方法,也是给进程发送一些简单特定的消息的方法 | |||
Android Binder | 谷歌为Android开发的RPC | |||
伪终端 | 伪终端 | |||
共享内存式 | 共享内存 | SysV 共享内存 | 古老,使用接口shmget,用一个整数当做通信信道名称不安全 | |
POSIX 共享内存 | 使用接口shm_open,一个路径名作为通信信道的名称 | |||
共享式内存映射 | 匿名共享内存映射 | 共享匿名映射,是通过fork之后在父子进程之间共享内存的 | ||
文件共享内存映射 | 两个进程映射相同的文件就可以达到共享内存的目的,文件名就是通信信道的名称,由名称直接加入信道,没有信道句柄 | |||
Android ION | buffer sharing框架 | |||
dma-buf heap | dma-buf heaps是ION的替代品,已经合入了标准内核 | |||
进程间同步 | 信号量 | SysV 信号量 | ||
POSIX 信号量 |