进程间通信IPC
1.进程通信(IPC, Inter-Process Communication)
1.1直接通信
1.2间接通信
1.3阻塞通信
1.4非阻塞通信
2.信号(Signal)
3.管道(pipe)
4.消息队列
5.共享内存
1.进程通信(IPC, Inter-Process Communication)
进程通信是进程进行通信和同步的机制
IPC提供2个基本操作 发送操作:send(message) 接收操作:receive(message)
进程通信流程 在通信进程间建立通信链路 通过 send/receive交换消息
通信方式
通信方式大致分为直接通信和间接通信。直接通信使用共享信道来通信,间接通信使用内核来间接通信。
1.1直接通信
进程必须正确的命名对方
send (P, message) – 发送信息到进程P
receive(Q, message) – 从进程 Q接受消息
通信链路的属性
自动建立链路,一条链路恰好对应一对通信进程,每对进程之间只有一个链接存在,链接可以是单向的,但通常为双向的
1.2间接通信
通过操作系统维护的消息队列实现进程间的消息接收和发送,每个消息队列都有一个唯一的标识,只有共享了相同消息队列的进程,才能够通信。
通信链路的属性
只有共享了相同消息队列的进程,才建立连接,连接可以是单向或双向,消息队列可以与多个进程相关联,每对进程可以共享多个消息队列
1.3阻塞通信
阻塞发送 发送者在发送消息后进入等待,直到接收者成功收到
阻塞接收 接收者在请求接收消息后进入等待,直到成功收到一个消息
1.4非阻塞通信
非阻塞发送 发送者在消息发送后,可立即进行其他操作
非阻塞接收 没有消息发送时,接收者在请求接收消息后,接收不到任何消息
IPC通信方式主要由信号,管道,消息队列和共享内存等。
2.信号(Signal)
进程间的软件中断通知和处理机制
信号的接收处理
捕获(catch):执行进程指定的信号处理函数被调用
忽略(Ignore):执行操作系统指定的缺省处理
屏蔽(Mask):禁止进程接收和处理信号
信号的实现
3.管道(pipe)
进程间基于内存文件的通信机制
子进程从父进程继承文件描述符 缺省文件描述符:0 stdin, 1 stdout, 2 stderr
进程不知道(或不关心)的另一端
与管道相关的系统调用
读管道:read(fd, buffer, nbytes)
写管道: write(fd, buffer, nbytes)
创建管道:pipe(rgfd) rgfd是2个文件描述符组成的数组 rgfd[0]是读文件描述符 rgfd[1]是写文件描述符
shell
创建管道
为ls创建一个进程 , 设置 stdout为 管道写端
为more 创建一个进程, 设置 stdin 为管道读端
4.消息队列
消息队列是由操作系统维护的以字节序列为基本单位的间接通信机制.
每个消息(Message)是一个字节序列
相同标识的消息组成按先进先出顺序组成一个消息队列(Message Queues)
消息队列的系统调用
msgget ( key, flags) 获取消息队列标识
msgsnd ( QID, buf, size, flags )发送消息
msgrcv ( QID, buf, size, type, flags )接收消息
msgctl( … ) 消息队列控制
5.共享内存
共享内存是把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制。
每个进程都有私有内存地址空间,每个进程的内存地址空间需明确设置共享内存段。
同一进程中的线程总是共享相同的内存地址空间。
快速、方便地共享数据;必须用额外的同步机制来协调数据访问
共享内存的实现
利用逻辑地址到物理地址的映射来完成
共享内存系统调用
shmget( key, size, flags)创建共享段
shmat( shmid, *shmaddr, flags)把共享段映射到进程地址空间
shmdt( *shmaddr)取消共享段到进程地址空间的映射
shmctl( …)共享段控制
需要信号量等机制协调共享内存的访问冲突
参考:清华大学 操作系统 陈渝 http://os.cs.tsinghua.edu.cn/oscourse/OS2015/