操作系统学习笔记 12进程间通信
200 Words|Read in about 1 Min|本文总阅读量次
熟悉完操作系统的第十一篇章,开始学习第十二篇章,关于操作系统的进程间通信。
0猜你喜欢
操作系统系列文章
12进程间通信
-
概述
通信模型
直接及间接通信
阻塞与非阻塞
通信链路缓冲
-
信号
-
管道
-
消息队列
-
共享内存
12.1概述
12.1.1通信模型
进程通信的机制及同步
-
不使用共享变量的进程通信
-
IPC facility提供2个操作
send(message)-消息大小固定或可变
receive(message)
-
如果P和Q想通信
需要在它们之间建立链路
通过send/receive交换消息
-
通信链路的实现
物理(例如共享内存,硬件总线)
逻辑(例如逻辑属性)
如下图12-1所示,显示了两种不同的IPC。左边的是进程A和进程B通过内核来完成进程间的间接通信。右边的是进程A和进程B通过共享区域来完成进程间的直接通信。
12.1.2直接间接通信
直接通信
- 进程必须正确的命名对方
- send(P,message)-发送消息到进程P
- receive(Q,message)-从进程Q收到消息
通信链路的属性
- 自动建立链路
- 一条链路恰好对应一对通信进程
- 每对进程之间只有一个链路存在
- 链路可以是单向的,但通常为双向的
间接通信
- 创建一个新的消息队列
- 通过消息队列发送和接收消息
- 销毁消息队列
原语的定义如下
- send(A,message)-发送消息到队列A
- receive(A,message)-从队列A接收消息
12.1.3消息传递可以是阻塞或非阻塞
阻塞被认为是同步的
- Blocking send has the sender block until the message is received
- Blocking receive has the receiver block until a message is available
非阻塞是认为异步的
- Non-blocking send has the sender send the message and continue
- Non-blocking receive has the receiver receive a valid message or null
12.1.4通信链路缓冲
队列的消息被附加到链路,可以是以下3种方式之一
-
0容量-0message
发送方必须等待接收方
-
有限容量-n message的优先长度
发送方必须等待,如果队列满
-
无限容量-无限长度
发送方不需要等待
12.2信号
signal
- 软件中断通知事件处理
- Example:
SIGFPE
,SIGKILL
,SIGUSR1
,SIGSTOP
,SIGCONT
接收到信号时会发生什么
- Catch:指定信号处理函数被调用
- Ignore:依靠操作系统的默认操作,比如Abort,memory dump,suspend or resume process
- Mask:闭塞信号因此不会传送,可能是暂时的(当初里同样类型的信号)
不足
- 不能传输要交换的任何数据
如何实现信号
- 程序运行的时候需要对某个信号做单独处理的话,在程序开始的时候需要注册一个Signal handlers,把这个作为系统调用发给操作系统
- 当产生某一个信号的时候,操作系统把系统调用返回用户空间的堆栈进行修改,使得本来应该返回系统调用的后一条语句执行,变成信号函数处理入口,同时把信号函数处理之后的地址作为栈帧的地址。
- 应用程序处理产生信号
12.3管道
管道
子进程从父进程继承文件描述符(父子关系进程,字节流)
file descriptor 0 stdin
,1 stdout
,2stderr
进程不知道(或不关心)从键盘,文件,程序读取或写入到终端,文件,程序
shell
- 创建管道
- 为
ls
创建一个进程,设置stdout
为管道写端 - 为
more
创建一个进程,设置stdin
为管道读端
12.4消息队列
消息队列是按FIFO的来管理消息
- message作为一个字节序列存储
- message queues,消息数组
- FIFO&FILO configuration
12.5共享内存
直接通信方式
-
进程
每个进程都有私有地址空间
在每个地址空间内,明确地设置了共享内存段
-
优点
快速、方便地共享数据
-
不足
必须同步数据访问
同一块物理内存映射到不同进程相同或者不同的地址空间去。映射完成之后,访问不同进程的虚拟地址的时候,实际上访问的是同一块物理内存空间。