天天看點

程序同步與互斥問題糾錯

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);
}