一、完整题目
有四个进程S1、S2、R1和R2,其中S1、S2向缓冲区BUFF发送消息,R1和R2从缓冲区中接收消息。发送和接收的规则如下:
(1) 缓冲区BUFF任何时候只能存放2个消息;
(2) R1、R2每次同时取S1和S2存放在缓冲区中的消息;
(3)每个存放在缓冲区中的消息必须被R1和R2均接收后才能清除;
(4)缓冲区BUFF不能同时存放2个S1的消息或2个S2的消息。 请用信号量机制来实现这4个进程间的同步
二、过程实现
//用伪代码实现
//首先设置Empty信号量,用于S1、S2进程判断是否可以发送消息
//然后设置FULL信号量,用于R1、R2进程判断是否可以接收消息
EmptyS1R1 = EmptyS1R2 = EmptyS2R1 = EmptyS2R2 = 1;
FullS1R1 = FullS1R2 = FullS2R1 = FullS2R2 = 0;
Process(S1){
while(1){
P(EmptyS1R1);//判断S1发送给R1的消息是否被R1接收
P(EmptyS1R2);//判断S1发送给R2的消息是否被R2接收
SetMessage();
V(FullS1R1);//提醒R1接收消息
V(FullS1R2);//提醒R2接收消息
}
}
Process(S2){
while(1){
P(EmptyS2R1);//判断S2发送给R1的消息是否被R1接收
P(EmptyS2R2);//判断S2发送给R2的消息是否被R2接收
SetMessage();
V(FullS2R1);//提醒R1接收消息
V(FullS2R2);//提醒R2接收消息
}
}
Process(R1){
while(1){
P(FullS1R1);//判断S1是否发送给R1的消息
P(FullS2R1);//判断S2是否发送给R1的消息
ReciveMessage();
V(EmptyS1R1);//提醒S1发送消息
V(EmptyS2R1);//提醒S2发送消息
}
}
Process(R2){
while(1){
P(FullS1R2);//判断S1是否发送给R2的消息
P(FullS2R2);//判断S2是否发送给R2的消息
ReciveMessage();
V(EmptyS1R2);//提醒S1发送消息
V(EmptyS2R2);//提醒S2发送消息
}
}