进程同步练习
1.有一阅览室,共有100个座位。
读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名。
读者离开时要消掉登记内容。
试用P、V操作描述读者进程的同步结构。
var
mutex : semaphere;信号量,用于互斥
full : semaphere; 信号量,用于同步
table : array 0..n-1 of item; 登记表
procedure reader; 读者进程
begin
P(full);
P(mutex);
Register_name(table);
V(mutex);
Reading;
P(mutex);
Delet_name(table);
V(mutex);
V(full)
end;
begin
seminitsal(mutex.v,1; full.v,100); 初始化
cobegin
reader;
reader;
...
coend
end.
2.设公共汽车上有一位司机和一位售票员,它们的活动如下:
司机:售票员:
请分析司机与售票员之间的同步关系,如何用PV操作实现。
答:为了安全起见,显然要求:关车门后才能启动车辆;到站停车后才能开车门。
所以司机和售票员在到站、开门、关门、启动车辆这几个活动之间存在着同步关系。
用两个信号量S1、S2分别表示可以开车和可以开门,S1的初值为1,S2的初值为0。
用PV操作实现司机进程和售票员进程同步的算法描述如下:司机:售票员:
)
)
到站停车关车门
V(S2)V(S1)
另外,程序中PV操作出现的顺序与信号量的初值设置有关,以本题为例,算法如下描述时,S1、S2的初值均应为0。
司机:售票员:
)
)
)
S1)
14、进程之间存在哪几种制约关系?各是什么原因引起的?下列活动分别属于哪种制约关系?
–(1)若干同学去图书馆借书。
–(2)两队举行篮球比赛。
–(3)流水线生产的各道工序。
–(4)商品生产和社会消费。
解:(1)间接制约,书是临界资源
(2)间接制约,篮球是临界资源。
(3)直接制约。
(4) 直接制约。
例题:一个理发店由一个有N张沙发的等候室和一个放有一张理发椅的理发室组成。
要求:
(1)没有顾客要理发时,理发师便去睡觉。
(2)当一个顾客走进理发店时,如果所有的沙发都已经被占用,他便离开理发店;否则如果理发师正在为其他顾客理发,则该顾客就找一张空沙发坐下等待。
(3)如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。
(4)理发完成后,顾客必须付费,直到理发师收费后才能离开理发店。
试用信号量解决这一同步问题。
答:设置一个整形变量count用来对理发店中的顾客进行计数,并需设置6个信号量。
其中:mutex 用来实现顾客进程对count变量的互斥访问,其初值为1;
Sofa是对应于等候室中N张沙发的资源信号量,其初值为N;
Empty表示是否有空闲的理发椅,其初值为1;
full表示理发椅上是否坐有等待的顾客,其初值为0;
payment 表示等待付费,初值为0;
receipt 用来等待收费,初值为0。
具体算法如下:
var count:=integer:=0;
mutex,sofa,empty,full:semaphore:=1,N,1,0;
cut,payment,receipt:semaphore:=0,0,0;
begin
parbegin
guest:begin
wait(mutex);
if(count>N) then
begin
signal(mutex);
离开理发店;
end
else
begin
count:=count+1;
if(count>1) then
begin
wait(sofa);
在沙发上就座;
wait(empty);
从沙发上起来;
signal(sofa);
end
else/*count=1*/
wait(empty);
在理发椅上就座;
signal(full);
理发;
付费;
signal(payment);
wait(receipt);
从理发椅上起来;
signal(empty);
wait(mutex);
count:=count-1;
signal(mutex);
离开理发店;
end
end
barber: begin
repeat
wait(full);
替顾客理发;
wait(payment);
收费;
signal(receipt);
until false
end
parend
end。