操作系统-进程通信 IPC
基本概念
进程间进行通信和同步的机制
基本操作
- send
- receive
流程
- 建立通信链路
- 通过send/receive交换消息
进程链路特征
- 物理(共享内存,硬件总线)
- 逻辑(逻辑属性)
通信方式
- 间接通信:如消息队列
- 直接通信:如共享信道
阻塞与非阻塞
- 阻塞发送:发送者在发送消息之后今日等待,直到接受者成功接收
- 阻塞接收:接收方在请求接收后进入等待,直到成功接收消息
通信链路缓冲
- 0容量:发送方必须等待接收方
- 有限容量:通信链路缓冲队列满时,发送方必须等待
- 无线容量:发送方无需等待
信号(Signal)
进程间的软件中断通知和处理机制
信号的接收处理
- 捕获:执行进程指定的信号处理函数
- 忽略:缺省处理,如中止,挂起
- 屏蔽:禁止接收和处理
不足
传送的信号量很小
信号的实现方式
向内核注册回调
管道(pipe)
进程间基于内存文件的通信机制
- 子进程从父进程继承文件描述符
- 缺省文件描述符:0 stdin;1 stdout;2 stderr
进程不关心另一端
- 可能从键盘,文件,程序读取
- 可能写入终端,文件,程序
常用函数
- read:读管道
- write:写管道
- pipe(rgfd):创建管道
消息队列
操作系统维护的以字节序列为基本单位的间接通信机制
- 消息是字节序列
- 多个消息按先进先出方式构成消息队列
常用函数
- msgget(key,flags):获取消息队列标识
- msgsend(QID,buf,size,flags):发送消息
- msgrcv(QID,buf,size,type,flags):接收消息
- msgctrl(…):消息队列控制
共享内存
把同一物理内存区域同时映射到多个进程的内存地址空间的通信机制
-
进程
-
每个进程都有私有的内存地址空间
-
每个进程的内存地址空间需明确设置共享内存段内存
-
线程
- 同一进程中的线程总是共享相同的内存地址空间
-
优点
- 快速,方便的共享数据
-
不足
- 必须用额外的同步机制来协调数据访问
系统调用函数
- shmget(key,size,flags):创建共享段
- shmat(shmid,*shmaddr,flags):把共享段映射到进程地址空间
- shmdt(*shmaddr):取消共享段到进程地址空间的映射
- shmctrl(…):共享段控制
##补充
需要信号量等机制协调共享内存的访问