操作系统 同步互斥题目

互斥问题:

(一)   图书馆有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)
接受理发

 

总结:做同步互斥问题,第一步应该是想清楚,每个个体应该负责的事情,其次在分析存在哪些同步,互斥量。

 

 

猜你喜欢

转载自blog.csdn.net/qq_40774175/article/details/83472019
今日推荐