进程调度信号量:生产者与消费者

编程

题目:妈妈在桌上放一个苹果,儿子拿走一个苹果。并且不能同时进行。桌上最多只能放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

回到顶部