进程调度信号量:生产者与消费者
题目:妈妈在桌上放一个苹果,儿子拿走一个苹果。并且不能同时进行。桌上最多只能放10个苹果。
生产者、消费者的特点:
- 容器 <= 容量
- 生产者 关注 【剩余空间】
- 消费者 关注 【占用空间】
- 互斥:对容器进行修改,需要保证互斥
剩余空间、占用空间分别需要一个信号量。由于不能同时进行,保证互斥需要一个信号量
解题步骤:
- 画图理解题目
- 判断题目类型
- 分析进程数量,填写进程模板
- 补充基本代码
- 补充PV操作
- 检查调整
妈妈
semaphore full = 0; // 占用空间semaphore empty = 10; // 剩余空间
semaphore s = 1; // 保证互斥
mom() {
while (true) {
p(empty); // 检查剩余空间,没有则阻塞
p(s) // 保证互斥
放苹果
v(s) // 保证互斥
v(full); // 检查是都由等待 full并唤醒
}
}
儿子
son() { while (true) {
p(full); // 检查占有空间, 没有就等待
p(s) // 保证互斥
拿苹果
v(s) // 保证互斥
v(empty); // 剩余空间+1,检查mon是否等待并唤醒
}
}
题目:桌上有个盘子,每次只能放一个水果,妈妈放苹果,爸爸放橘子,儿子吃苹果,女儿吃橘子。只有盘子空的时候才能放水果。
消费者:儿子,关注 苹果占用量
消费者:女儿,关注 橘子占有量
生产者:妈妈,关注 盘子空间
生产者:爸爸,关注 盘子空间
semaphore apple = 0;semaphore orange = 0;
semaphore plate = 1; // 盘子为空
semaphore mutx = 1; // 保证操作容器互斥 这里 不加也是可以的因为 盘子的容量就是1。已经保证互斥
题目三
有A、B两人通过信箱进行辩论,每个人都从自己的信箱中取得对方的问题。将答案和向对方提出的新问题组成一个邮件放入对方的邮箱中。假设A的信箱最多放M个邮件,B的信箱最多放N个邮件。初始时A的信箱中有x个邮件(0<x<M),B的信箱中有y个(0<y<N)。每次只取一封邮件,使用PV操作实现,说明初始值含义
消费者A:关注 A邮箱占有量
消费者B:关注 B邮箱占有量
生产者A:关注 B邮箱剩余空间
生产者B:关注 A邮箱剩余空间
进程数:2个
信号量:
full_a = x;full_b = y;
empty_a = m - x;
empty_b = n - y;
mutx = 1;
题目四
系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放人其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取走10件产品后,其他消费者进程才可以取产品。请使用信号量的P,V(wait()、signal())操作实现进程间的互斥与同步,要求写出完整的过程,并说明所用信号量的含义和初值。
以上是 进程调度信号量:生产者与消费者 的全部内容, 来源链接: utcz.com/z/517106.html