操作系统习题

三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getOdd()从该缓冲区中取出一个奇数

操作系统习题_第1张图片

这个问题较为简单:与生产者一消费者问题非常类似,只不过涉及的进程多了一个。因此,我们可以用类似于生产者一消费者的解决方法来解决这个问题。不过,由于本问题的范围在生产者~消费者问题上进行了线性扩展,我们也需要对生产者~消费者的解决方案进行线性扩展,即增加适当数量的信号量。
解决要点如下:
(1)由于缓冲区是共享空间,我们设置一个互斥信号量来保护它。设信号量为mutex。
(2)P1、P2共享缓冲区的奇数数值,设同步信号量为odd。
(3)P1、P3共享缓冲区的偶数数值,设同步信号量为even。
(4)P1、P2、P3共享缓冲区的空位,设同步信号量为empty。
(5)所有进程均需进行down(mutex)和up(mutex)操作。
(6)P1需要进行down(empty)和up(odd)/up(even)之一的操作。
(7)P2需要进行down(odd)和up(empty)的操作。
(8)P3需要进行down(even)和]up(empty)的操作。

三个进程的实现如下:
P1:
while(true) {
integer=prodlace();//此行以下5行与生产者问题解答一样
down(empty);
down(mutex);
put();
up(mutex);
if(integer%2==0)//此处与生产者方案略有不同,需要进行判断,以决定唤醒P2、P3中的哪一个进程
up(even);
else
up(odd);
}
P2: 与消费者问题的解答几乎完全一样。
while(true) {
down(odd);
down(mutex);
getodd();
up(mutex);
up(empty);
countOdd();
}
P3: 与消费者问题的解答几乎完全一样。
while(true) {
down(even);
down(mutex);
getEven();
up(mutex);
up(empty);
countEven();
}

 

你可能感兴趣的:(#,操作系统,操作系统)