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]
-
三個飲料廠 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);
生産橙汁;}}
- 有一座東西方向的獨木橋,針對以下三種情況,用 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);
}