【OS笔记10】:进程和线程8-进程通信
文章目录
- 八、进程通信
- 1. 进程通信机制
- 2. 直接通信——消息缓冲通信
- 2.1. 设计思想
- 2.2 相关数据结构
- 2.3 消息发送和接收过程
- 九、作业与习题
- 1. 司机与售票员同步问题
- 问题描述
- 解题分析
- 解决方案
- 2. 多级反馈队列调度问题
八、进程通信
1. 进程通信机制
- 高级通信机制:通常把进程之间可以进行大量数据交换的通信机制称为高级通信机制。
- 组成:高级通信机制由操作系统提供的原语和有关数据结构组成。
- 与P,V操作的区别:P,V操作一般只传送几个字节的信息,用以控制进程的执行速度,不包含任何实际数据。
2. 直接通信——消息缓冲通信
2.1. 设计思想
- 由系统管理一组缓冲区,其中每个缓冲区可以存放一个消息(即一组信息)。
- 当进程要发送消息时,先向系统申请一缓冲区,然后把消息写进去。
- 接着把该缓冲区连到接收进程的消息队列中,并用 V操作 通知接收者。
- 接收进程可以在适当时候从消息队列中取出消息,并释放该缓冲区。
2.2 相关数据结构
1) 消息缓冲区结构
一般包含下列几种信息:
- Name: 发送消息的进程名或标志号。
- Size: 消息长度。
- Text: 消息正文。
- Next: 下个缓冲区的地址。
2) 进程PCB中一般包含有下列项目
- mutex: 消息队列操作互斥信号量。
- Sm: 表示接收消息计数和同步的信号量。
- Pm: 指向该进程的消息队列中第一个缓冲区的指针。
图片说明:该图展示了PCB中的三个关键部分(两个信号量
mutex
、Sm
和一个指针Pm
),Pm
指针指向一个由多个消息缓冲区组成的链表(消息队列)。每个缓冲区都包含name
,
size
,text
,next
等字段。
2.3 消息发送和接收过程
图片说明:该图详细描述了:
- 发送进程A 在自己的内存空间设置发送区,调用
send
原语。- 操作系统将消息内容复制到一个内核缓冲区中,并将该缓冲区挂载到接收进程B的PCB消息队列的末尾。
- 接收进程B 调用
receive
原语,在自己的内存中设置消息接收区。- 操作系统从B的消息队列头部取下一个缓冲区,将其内容复制到B的接收区。
九、作业与习题
1. 司机与售票员同步问题
问题描述
设公共汽车上,司机和售票员的活动分别是:
- 司机的活动:
- 启动车辆
- 正常行车
- 到站停车
- 售票员的活动:
- 关车门
- 售票
- 开车门
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用信号量和P、V操作实现它们的同步。
解题分析
同步关系:
- A. 售票员关车门后,向司机发开车信号,司机接到开车信号后启动车辆。
- B. 到站时司机停车,并告诉售票员可以开车门让乘客上下车。
信号量映射:
- 关门 →
V
操作;P
操作 ← 开车 - 停车 →
V
操作;P
操作 ← 开门 - 因此,需要两个信号量,分别检测是否允许开车,是否允许开门。
解决方案
设置两个信号量:
dr
(drive): 表示是否允许司机启动汽车,其初值为 0。op
(open): 表示是否允许售票员开门,其初值为 0。
伪代码实现:
// 全局信号量
int dr = 0;
int op = 0;main() {cobegin // 并发执行driver();busman();coend
}driver() {while(1) {P(dr); // 启动汽车前检测是否允许开车启动车辆;正常行车;到站停车;V(op); // 到站停车后给售票员发信号,允许开门}
}busman() {while(1) {关车门;V(dr); // 关车门后,给司机发信号,允许启动汽车售票;P(op); // 开车门前,检测是否允许开门开车门;上下乘客;}
}
执行流程分析:
若司机进程先执行,则会因P(dr)
而阻塞。等到售票员进程执行,关门后执行V(dr)
,司机进程被唤醒。同样,售票员进程在开车门前会因P(op)
而阻塞,直到司机到站停车后执行V(op)
,售票员进程才被唤醒,打开车门。
2. 多级反馈队列调度问题
问题:
进程 P0, P2, P3, P4 分别在时刻 0, 5, 7, 12 到达,执行时间分别为 7, 4, 13, 9。采用三级反馈队列调度,三个队列的时间片分别为2, 4, 8。请写出各进程开始执行时刻及完成时刻。
参考答案:
进程 | 开始时刻 | 完成时刻 |
---|---|---|
A(P0) | 0 | 11 |
B(P2) | 5 | 19 |
C(P3) | 7 | 30 |
D(P4) | 12 | 33 |