有3个并发进程R、M、P,它们共享同一个缓冲区,假定缓冲区只能存放一条记录。进程R负责从输入设备读信息,每读入一个记录后,就把它放进缓冲区;进程M在缓冲区中加工读入的记录;进程P把加工后的记录打印输出。读入的记录经加工输出后,缓冲区又可以存放下一个记录。试写出他们能够正确执行的并发程序。
参考答案:此题类似与生产者消费者问题
由图中可知有三个同步关系:①读进程与加工进程的同步,②加工进程与打印进程的同步,③打印进程与读进程之间的同步,每一个同步设置一个同步信号量。①设置一个信号量m1,表示缓冲区是否有未被处理的记录,初值为0,未被处理则由进程M进行处理,在加工进程加工之前加P操作,在读进程加入未处理记录之后加V操作;②设置一个信号量m2,表示缓冲区是否有被处理过的记录,初值为0,如果有处理过的记录则由进程P取走记录进行打印,在打印进程取数据之前加P操作,在加工进程处理完记录之后加V操作;③设置一个信号量empty表示缓冲区是否有数据,其初值是1,如果为无数据则进程R可读入数据,在打印数据取走记录之后加V操作,在读入进程放记录之前加P操作。
设置一个互斥信号量mutex,使各进程互斥的访问缓冲区,初值为1。其P,V操作加在各自访问缓冲区的代码的前后。
注意对于P操作先同步后互斥。
[答案]
Semaphmre m1=0,m2=0:
Semaphore empty=1;
Semaphore mutex=1:
Main()
Cobegin{
P(R):(读入进程)
Begin
Repeat
读入一个记录
P(empty);
P(mutex);
将记录放入缓冲区;
V(mutex);
V(m1)
Until false:
End
P(M):(加工进程)
Begin
Repeat
P(m1);
P(mutex);
在缓冲区中加工记录;
V(mutex);
V(m2)
Until false;
End
P(P):(打印进程)
Begin
Repeat
P(m2);
P(mutex);
将缓冲区中记录取出;
V(mutex);
V(empty);
打印记录;
Until false;
End
}