概要
进程间通信(Inter-Process Communication, IPC), 指至少两个进程之间的传送数据或信号的技术.
常见方法有: 管道, 消息队列, 共享内存, 信号量, 信号, 套接字.
管道技术
- 管道分为匿名管道和命名管道, 匿名管道主要用于父子进程之间的通信在, 命名管道可以实现不同进程之间通信,需建立格式为P的设备文件;
- 数据是无格式的流且大小受限; 通信的方式是单向的; 通信数据遵循先进先出原则;
消息队列
- 消息队列克服了管道通信的数据是无格式的字节流问题, 消息队列实际上是保存在内核中的消息链表,消息队列的消息体可以是用户可以自定义的数据类型;
- 缺点: 每次数据的写入与读取, 需要经过用户态与内核态之间的拷贝过程, 效率一般.
共享内存
- 共享内存在开辟一个共享的内存空间, 不同进程可以访问.解决了消息队列数据拷贝带来的开销. 是最快的进程间通信方法.
- 共享内存带来的问题就是要控制好不同进程间访问共享资源的的同步互斥问题. 那么就引入了信号量.
信号量
- 信号量其实是一个计数器, 表示的是资源的个数, 其值可以通过两个原子操作来控制, 分别是 : P操作 和 V 操作;
信号
- 信号与信号量的关系就像Java 与 JavaScript 的关系一样, 没有什么联系;
- 信号是IPC中唯一的异步通信机制, 信号可以直接在应用进程和内核之间进行交互;
- 信号的来源主要有硬件来源(如键盘 Ctrl + C) 和 软件来源(如KILL命令);
- 进程有三种方式响应信号: 1. 执行默认操作, 2. 捕捉信号, 3. 忽略信号, 有两个信号是进程无法捕捉和忽略的:SIGKILL 和 SIGSTOP.
套接字
- 前面所说的通信机制, 都是工作在同一台主机, 而套接字不仅可以实现本地进程间的通信, 还可以实现网络中不同进程间的通信;
- 根据socket类型的不同, 分为三种通信方式: 1. 基于TCP协议的通信方式, 2. 基于UDP协议的通信方式, 3. 本地进程间的通信机制.