进程A1、A2、…Anl通过m个缓冲区向进程B1、B2、…Bn2不断地发送消息。发送和接收工作遵循如下规则:
(1)每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小与消息长度一样。
(2)对于每一个消息,B1、B2、…Bn2都需各接收一次,读入自己的数据区内。
(3)m个缓冲区都满时,发送进程等待;没有可读的消息时,接收进程等待。 试用wait、signal操作描述它们的同步关系。
这个题目有n1个写进程,m个缓冲区,n2个读进程。写进程发送一次消息占用一个缓冲区,同时这些消息向每个读进程发送。
信号量分析:
(1)对于缓冲区的读写互斥访问需要一个信号量:mutex = 1。
(2)每个读进程需要一个表示剩余多少可读的信号量full[i] = 0,一个表示空缓冲区数量的信号empty[i] = m(最多空出m个)。
empty[s2] = m;
full[s2] = 0;
while(1)//写进程
{
for(i = 0; i< s2; i++)
{
P(empty[i]);
}
P(mutex);
消息放入缓冲区;
V(mutex);
for(i = 0; i< s2; i++)
{
V(full[i]);
}
}
while(1)//读进程
{
P(full[i]);
P(mutex);
读取缓冲区;
V(mutex);
V(empty[i]);
}