天天看点

进程同步与互斥问题纠错

1.生产者- 消费者问题m个消费者 n 个生产者

empty [-n,k]

生产者进程都执行,k到0 ,继续执行,互斥冲突,堵塞到-n

full [-m,k]

同生产者,假若缓冲区都满,消费者进程执行,同上

当k>=m+n

mutex[-(n+m-1),1]

生产者和消费者进程同时进行,k不会受限,最小值即生产者与消费者进程同时等待堵塞

当k<m+n

mutex[-(k-1),1]

生产者和消费者进程同时进行,但是受k限制,生产者消费者进程并不会都执行

为什么和m+n比较

因为两个进程中empty+full=k

2.1. 假定某小学有 600 人,只有一个阅览室可供 100 个人同时阅读。读者进入和

离开阅览室时都必须在阅览室入口处的一个登记表上登记,阅览室有 100 个

座位,规定每次只允许一个人登记或注销登记。

要求:(1)用 P、V 操作描述读者进程间关系的算法.

(2)指出算法中所用信号量的名称、作用、初值及变化范围

semaphore mutex=1,seat=100;
parbigin
process readeri(i=1,2,3...)
	begin
	读者来到阅览室
	P(seat)
		P(mutex)
			在登记表上登记
		V(mutex)
		在阅览室阅览材料
		P(mutex)
			在登记表上注销
		V(mutex)
	V(seat)
	该读者离开

           

seat[-500,100]

mutex[-99,1]

  1. 三个饮料厂 P1、P2、P3 都要生产橙汁,他们各自已购得三种必需原料(水、

    糖、浓缩汁)中的两种,待购得第三种原料后即可配制出售。有一供应商能

    够不断供应这些原料,但每次只能拿出一种原料放入容器出售,当容器中有

    原料时需要该原料的饮料厂可取走,容器空时,供应商又可放入一种原料,

    假定:P1 已有糖和水,P2 已有水和浓缩汁,P3 已有糖和浓缩汁,试用 PV 操

    作写出供应商和三个饮料厂之间的同步互斥关系。

semaphore s=1,so=0,ss=0,sw=0;
enum{sugar,water,orange}container;
cobegin
process Provider{
while(true){
P(s)
	将原料装入容器内;
if(cantainer==suger)V(so);
else if(cantainer==water)V(ss);
else V(sw);
}}

process P2{
while (true){
	P(ss);
	从容器中取糖;
	V(s);
	生产橙汁;}}
process P1{
while (true){
	P(so);
	从容器中取浓缩汁;
	V(s);
	生产橙汁;}}

process P3{
while (true){
	P(sw);
	从容器中取水;
	V(s);
	生产橙汁;}}
           
  1. 有一座东西方向的独木桥,针对以下三种情况,用 P,V 操作分别实现行人的 同步互斥关系: (1)每次只允许一个人过桥; (2)当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须 等待。 (3)独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东 的方向,只允许一个人单独过桥。
(2)
设信号量: mutex=1 //东西方向互斥
		MD=1//东向西使用计数变量互斥
		MX=1//西向东使用计数变量互斥
设整形变量 CD=0//东向西以上桥人数
		CX=0//西向东已上桥人数
process traveler j(){
//从东向西
//上桥
P(MD);
	CD++;
	if(CD==1)P(mutex);这时起桥上东向西有人,西向东到这个地方会互斥堵塞
V(MD);
过桥
//下桥
P(MD);
	CD--;
	if(CD==0)V(mutex);
V(MD);
}


(3)
此问题与读者写者问题相同
int read=0;//计数器
semaphore ws=1 ,mutex=1;
cobegin
process EtoW(){
P(mutex);
read++;
if(read==1)P(ws); //这个时候,西向东会冲突
V(mutex);
过桥;
P(mutex);
read--;
if(read==0)V(ws);
V(mutex);}
coend;

process WtoE()
{
P(ws);
过桥
V(ws);
}