2.5信号量习题

1.黑白棋子问题
两种情况;
1)执黑子一方先下
2)双方都可以先下,谁先抢到棋盘谁先下。然后开始轮流下子。
执黑子一方先下 信号量:b=1,w=0
黑:
while(没结束){
wait(b);
下一黑棋;
signal(w);
}
白:
while(没结束){
wait(w);
下一白棋;
signal(b);
}
先抢到棋盘者先下,然后轮流下子
无法用单纯的信号量操作完成,因为初始值无法设置固定值。
争抢棋盘需要一个互斥信号m;加入if控制与标志判断。利用互斥信号量与特殊标志变量的结合使用实现有序控制。
Semaphore m=1; turn=0;

while(没结束){ p(m); if (turn<>2)
下一黑子;
turn=2;
v(m)
}
白:
while(没结束){
p(m);
if (turn<>1)
下一白子;
turn=1;
v(m)
}
2.嗜睡的理发师问题
一个理发店有N个沙发,1个理发椅;
理发师:
持续睡觉,理发,收钱的动作
顾客:
若有沙发,进入等待;否则离开。
理发椅空,一顾客放弃沙发,去唤醒它理发;
理发后付费,付费完毕离开理发椅,离店。
顾客
Repeat

顾客坐上椅子
singal(full)(叫理发师)
wait(cutok)(享受理发中)
付费
signal(payment)
wait(receipt)
离开椅子
离开店

Until false
repeat
wait(full)(阻塞就是在睡觉)
理发
signal(cutok)
wait(payment)
收费找零
Signal(receipt)
Until false

顾客
Repeat
if count>N then
离开店
else
count=count+1
if count=1 then
wait(empty)等椅子
else
wait(sofa)
坐入沙发
wait(empty)等椅子
离开沙发
signal(sofa)
end if

顾客坐上椅子
…(与理发师的关系)
离开椅子

离开店
end if

Until false
3.生产与销售问题
设一无限大仓库。就1个门,不允许同时入库,也不允许边入库边出库。
1)两个生产者A,B生产各自的产品入库;但要求满足关系Sa-Sb在限定的[-n,m]差值范围内。
2)一个销售者取产品销售,但对两种产品的卖出进度要把握在Ma-Mb也在[-n,m]范围内。
同步关系分析
互斥:三人在对仓库的使用上必须互斥(mutex=1)
顺序关系:
1)生产者AB之间:因为假设仓库无限大,不需考虑空的限制。控制其能否生产的关键是再生产一个能否满足Sa-Sb在限定的[-n,m]范围内。
A、B关心的都是各自的生产指标数量,即A关心x=A-B这个变量的值,同样B关心y=B-A。
初值:初始若无产品,A最多可生产m个,B最多可生产n个。自己生产一个必然使对方可以多生产一个。
2)生产与消费之间
关心卖出的A、B间的差值
1)生产者间关系 定义资源信号量Sab,Sba表示A、B各自允许生产的数量 初始:Sab=m,Sba=n(注意Sab,Sba之间的关系,和始终是m+n。)
生产者A:
Repeat
wait(Sab)
生产A
signal(Sba)
wait(mutex)
入库
signal(mutex)
Signal(SA)
Signal(S)
Until false

生产者B:
Repeat
wait(Sab)
生产B
signal(Sba)
wait(mutex)
入库
signal(mutex)
Signal(SB)
Signal(S)
Until false

你可能感兴趣的:(2.5信号量习题)