互斥问题:
(一) 图书馆有100个座位,每位进入图书馆的读者要在登记表上登记,退出时要在登记表上注销。要几个程序?有多少个进程?
答:一个程序;为每个读者设一个进程
思路:先找到互斥的关系,当多个人来的时候,服务台只能为一个人进行登记或者是注销操作,所以需要为服务台的登记和注销操作设一个互斥量。至于100个作为如何安排是不重要的,我们只要关系能否让人进来就行。
这个时候就有两种情况:
(1) 当图书馆已经有100人了,当第101个人来时,他可以选择排队等待。
这种情况下,可以这样写代码
设信号量 s=100,代表可用座位
设信号量 M =1 ,代表当前服务台是否在使用,M=1表示没有人再用
登记代码:
P(s) // s--
P(M) // 保证互斥,这个时候,应该不能有其他人参与服务台
登记
V(M) //恢复
阅读
注销代码:
P(M)
注销
V(M)
V(s)
(2) 当图书馆人满以后,第101个人不再等待,直接离开
设 count =100,此时count 只是单纯的计数,不再做互斥信号量
设信号量M=1 ,意义和前面相同
这次不同的是当 count==0时,应该直接renturn
P(M)
if(count==0)
{
V(M);
return;
}
count-=1;
登记
V(M)
阅读
P(M)
注销
count++;
V(M)
return ;
(二) 有一座东西方向的独木桥;用P,V操作实现:
(1) 每次只允许一个人过桥;
(2) 当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。
(3) 当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。(此问题和读者与写者问题相同,东向西的为读者,西向东的为写者)。
解: 1. 直接设一个M=1,即可实现互斥
P(M)
过桥
V(M)
2. 几个关键点:(1)东西互斥,需要设置一个信号量
(2) 只有当东方的人数为0,时,西方才能进入(反之亦然),所以需要分别设置计数值
(3) 同一时间点,只能一个个按顺序进入,所以两边各设置一个管理进出的信号量
东西方互斥 Mux=1
从东向西的管理信号量 MD=1
从西向东的管理信号量 MX=1
从东向西的人数 NumD=0
从西向东的人数NumX=0
下面写从东向西的代码
P(MD)
if(NumD==0) //一开始NumD==0,所以进入判断Mux的值就行
{
P(Mux)
}
NumD++;
V(MD)
过桥
P(MD)
NumD--
if(NumD==0)
{
V(Mux) //当东到西的人数为0时,可以让西到东方向通过人
}
V(MD)
下面写从西向东的代码
P(MX)
if(NumX==0) //一开始NumD==0,所以进入判断Mux的值就行
{
P(Mux)
}
NumX++;
V(MX)
过桥
P(MX)
NumX--
if(NumX==0)
{
V(Mux) //当东到西的人数为0时,可以让西到东方向通过人
}
V(MX)
3. 从东到西和第二问的一样,从西到东呢,和第1问一样
(三) 有一个俱乐部,有甲乙两个服务员,当顾客有请求时,甲负责送烟,乙负责送火,无顾客请求时,服务员睡眠。顾客自己不能带烟和火,当顾客要抽烟时,可请求服务员送烟和火,烟和火还未送到时,顾客必须等待。
思路方式:考虑事件是怎么开始的,事件是怎么结束的,不同对象,都给它一个进程。
两组互斥关系: 1. 是否请求了送烟或送火请求。 2. 烟是否能抽(烟是否送达)
设信号量:SX表示是否有请求送烟请求,SY表示是否有送火请求,DX表示烟有没有送达,DY表示火有没有送达。
甲服务员
P(SX)
送烟
V(DX)
乙服务员
P(SY)
送火
V(DY)
顾客
V(SX)
V(SY)
等待
P(DY)
P(DX)
抽烟
(四)有一个超市,最多可容纳N个人进入购物,当N个顾客满员时,后到的顾客在超市外等待;超市中只有一个收银员。可以把顾客和收银员看作两类进程,两类进程间存在同步关系。写出用P;V操作实现的两类进程的算法(2003年系统设计员考试的题目)
分析:对于顾客来说,它关心的是,有没有空位能让他进去,还有当前服务员是否在为别人服务(当前能不能出去)
对于服务员来说,它关心的是,当前有没有人想出来
设 s表示是否有顾客要出去,c表示当前服务员是否空闲
s=0,c=0
num=n,表示剩下的位置个数
顾客
P(num)
进去
V(s)
P(c)
出去
V(num)
服务员
P(s)
收银
V(c)
(五)一家四人父、母、儿子、女儿围桌而坐;桌上有一个水果盘;
(1) 当水果盘空时,父亲可以放香蕉或者母亲可以放苹果,但盘中已有水果时,就不能放,父母等待。当盘中有香蕉时,女儿可吃香蕉,否则,女儿等待;当盘中有苹果时,儿子可吃,否则,儿子等待。
分析:放东西是一个互斥量,至于吃东西,各有各的分工,所以在分别设两个信号量就行。
Mux表示到盘里是否有东西
X表示是否有香蕉
Y表示是否 有 苹果
Mux=1,表示空盘,x=y=0,表示啥都没有
父亲:
P(Mux)
放香蕉
V(X)
母亲
P(Mux)
放苹果
V(Y)
女儿
P(X)
拿香蕉
V(Mux)
吃
儿子
P(Y)
拿苹果
V(Mux)
吃
(2) 把(1)改为:儿子要吃苹果时,请母亲放苹果,女儿要吃香蕉时,请父亲放香蕉,(还是盘子为空时才可以放)。
分析:相对于第1问,只要在加上请求苹果和请求香蕉的信号量就行。
Mux=1
qx=0,qy=0
sx=0,sy=0;
女儿:
v(qx)
p(sx)
拿香蕉
v(Mux)
吃
儿子
v(qy)
p(sy)
拿苹果
v(Mux)
吃
父亲
p(qx)
剥香蕉
p(Mux)
放香蕉
v(sx)
母亲
p(qy)
销苹果
p(Mux)
放苹果
v(sy)
(六)一个盒子,内有黑白两种棋子(数量相等),甲每次从盒子中取出一颗黑子,乙每次从盒子中取出一颗白子,一人取了棋子后,必须等另一方取过棋子方可再取,(可假设甲先取)。
设信号量:SJ=1,SY=0
甲
REPEAT
P(SJ)
取一颗黑子
V(SY)
UNTIL 盒子中无黑子
乙
REPEAT
P(SY)
取一颗白子
V(SJ)
UNTIL 盒子中无白子
(七)有一个理发店,店内共有20个座位供顾客等待理发,(进入理发店的顾客,都在此座位上等待理发,正在理发的顾客不占用此座位),当20个座位坐满了,后到的顾客不等待,立即回家。当没有顾客时,理发师睡眠等待。
解:设信号量:S=0.C=0,MUTEX=1
设整型变量 SM=20
理发师
REPEAT
P(S) -------如无顾客,理发师等待
V(C) 叫一个顾客理发
理发
UNTIL FALSE
顾客
P(MUTEX)
IF (SM=0)
{ V(MUTEX)――――满座,离开,回家
RETURN
ELSE
SM=SM-1―――――空座位数减 1
V(MUTEX)
}
V(S)――――――――通知理发师,增加了一个顾客,如理发师在等待则唤醒他
P(C) ———————等理发师叫自己理发
P(MUTEX)
SM=SM+1―――――被叫到,释放一个空的座位
V(MUTEX)
接受理发
总结:做同步互斥问题,第一步应该是想清楚,每个个体应该负责的事情,其次在分析存在哪些同步,互斥量。