进程同步问题的几个案例

1、设公共汽车上,司机和售票员的活动分别是: 

司机的活动:

启动车辆;             

正常行车;             

到站停车; 

售票员的活动: 

关车门;             

售票;             

开车门; 

 

在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用PV操作实现它们的同步。   

 

解:设两个信号量S和C,初值为S=0;C=0; 

司机: L1:正常行车                   售票员:  L2: 售票 

到站停车                                               P(S) 

V(S)                                                          开车门

P(C)                                           关车门 

启动开车                                         V(C) 

GO TO L1                                          GO TO L2 

 


 

2、桌子上有一个空盘子,允许存放一只水果,爸爸可以向盘中放苹果,妈妈向盘子中放橘子,女儿专门吃盘子中的苹果,儿子专门吃盘子中的橘子。规定当盘子空的时候一次只能放一只水果,请用信号量实现他们之间的同步与互斥。 

 

S, S1, S2 :semaphore=1,0,0; 

Cobegin: 

Process Father: 

Begin: 

L1: P(S);      

Put Apple;      

V(S1);      

GO TO L1; 

End; 

 

Process Mother: 

Begin: 

                     L2: P(S); 

                     Put Orange;      

                     V(S2);      

                     GO TO L2; 

              End; 

 

       Process Son: 

              Begin: 

                     L3: P(S2); 

                     Get  Orange;      

                     V(S);

                     GO TO L1; 

              End; 

 

       Process Daughter: 

              Begin: 

                     L4: P(S1);      

                     Get Apple;      

                     V(S); 

                     GO TO L4; 

              End; 
CoEnd; 

 


 

4、有一个仓库,可以存放A、B两种产品,但要求: 

       ① 每次只能存入一种产品(A或B); 

       ② A产品数量-B产品数量<M; 

       ③ B产品数量-A产品数量<N; 

其中M、N是正整数,使用P、V操作描述产品A与产品B的入库过程。  

 

Mutex,Sa,Sb: Semaphore; 

Mutex =1; 

Sa=M-1; 

Sb=N-1; 

 

CoBegin: 

       Process  PA:    

              Begin    

                     Loop: 

                                   P(Sa);        

                            P(Mutex); 

                                   产品A入库;        

                            V(Mutex);        

                            V(Sb);        

                     Goto Loop;    

              End;  

   

       Process  PB:    

              Begin    

                     Loop: 

                                   P(Sb);        

                            P(Mutex); 

                                   产品B入库;        

                            V(Mutex);        

                            V(Sa); 

                            Goto Loop;    

              End; 

CoEnd;

 


 

6、理发师问题:一个理发店有N张沙发和一张理发椅,没有顾客要理发时,理发师便去睡觉;当一个顾客走进理发店时,如果所有的沙发都已被占用,他便离开理发店;否则,如果理发师正在为其他顾客理发,则该顾客就找一张空沙发坐下等待;如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。在理发完成后,顾客必须付费,直到理发师收费后才能离开理发店。使用信号量实现这一同步问题。 

解答:为解决上述问题,需要设置一个整形变量count用来对理发店中的顾客进行计数,再设置7个信号量:mutex用来实现顾客进程对count变量的互斥访问,其初值为1;sofa是对应于等候室中N张沙发的资源信号量,其初值为N;empty表示是否有空闲的理发椅,其初值为1;full表示理发椅上是否坐有等待理发的顾客,其初值为0;cut用来等待理发的完成,其初值为0;payment用来等待付费,其初值为0;receipt用来等待收费,其初值为0。  

Int  count =0; 

Mutex,sofa,empty,full,cut,payment,receipt: semaphore =1,N,1,0,0,0,0; 

 

CoBegin: 

Process  Guest: 

       Begin: 

              P (mutex); 

              If(count>N) then           

              {      v(mutex);               

                     exit shop;           

              }      

              else           

              {      count ++; 

                            if ( count >1)then               

                     {      p(sofa);                   

                            sit on sofa;                   

                            p(empty); 

                            get up from sofa;                   

                            v(sofa);               

                     } 

                            else    //count=1               

                     {      p(empty); 

                            sit on the baber_chair; 

                              v(full);                   

                            p (cut);                   

                            pay; 

                            v(payment);                   

                            p(receipt); 

                            get up from the baber_chair;                   

                            v(empty);                   

                            p(mutex)                   

                            count--;                   

                            v(mutex);                   

                            exit shop;          

       End; 

      

Process  Barber:          

       Begin          

              Loop: 

                     P(full);              

                     Cut hair;              

                     V(cut); 

                     P(payment);              

                     Accept payment;              

                     V(receipt);          

              Goto Loop;    

CoEnd; 

 

 


 

15、有一个阅览室,共有100个座位。读者进入阅览室时必须在入口处进行登记;离开阅览室时必须进行注销。试用PV操作描述读者进入/离开阅览室的同步与互斥关系。 

 

参考答案: 

第一步:确定进程 

       可以进入阅览室的读者可以有很多,这里设为n,即 n个Reader(读者)进程 

Reader进程:   

l  登记 

l  进入阅览室

l  读书 

l  离开阅览室

l  注销 

第二步:确定进程的同步、互斥关系 

l  同步:当教室内有空座位时,读者才可以登记,并进入阅览室

l  互斥:同时只能有一个读者在入口处进行登记

l  互斥:同时只能有一个读者在出口处进行注销 

第三步:设置信号量 

l  教室内空座位数量,seat,初值100 

l  为入口处进行登记设置互斥信号量Sin,初值 1,表示当前可用 

l  为出口处进行注销设置互斥信号量Sout,初值 1,表示当前可用 

第四步:用伪代码描述 

       begin  

              Sin, Sout, seat:semaphore;    

              seat :=100; 

              Sin := 1;    

              Sout := 1; 

cobegin 

       process Reader-i ( i = 1,2,…,n );  

              begin 

                     P(seat);   

                     P(Sin); 

                     登记;   

                     V(Sin);   

                     进入阅览室;   

                     读书; 

                     离开阅览室;   

                     P(Sout);   

                     注销; 

                     V(Sout); 

                     V(seat);  

              end 

       coend; 

end;

 

18. 有三个进程PAPBPC合作解决文件打印问题:PA将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的记录复制到缓冲区2,每执行一次复制一个记录;PC打印缓冲区2中的记录,每执行一次打印一个记录。每个缓冲区只能存放一个记录。请用信号量机制实现文件的正确打印。 

解:本题中,进程PA、PB、PC之间的合作关系如图所示:

       当缓冲区1为空时,PA可将记录读入其中,否则,PA需等待;

       当缓冲区1有记录而缓冲区2为空时,PB可进行复制工作,否则PB需等待;

       当缓冲区2有记录时,PC可打印记录,否则PC需等待。

       为此,设置4个信号量empty1、empty2、full1、full2,其中empty1、empty2分别表示缓冲区1和缓冲区2是否为空,初值均为“1”;full1、full2分别表示缓冲区1和缓冲区2中是否有记录,其初值均为“0”。算法描述如下:

没有更多推荐了,返回首页