问题
问答题
如下图所示,get、copy和put三进程共用两个缓冲区s、t(其大小为每次存放一个记录)。get进程负责不断地把输入数据送入缓冲区s中,copy进程负责从缓冲区s中取出记录然后复制到缓冲区t中,put进程负责从缓冲区t中取出然后打印。试用p、v操作实现这三个进程的同步,写出程序描述。
答案
参考答案:该题可以分成两部分,一部分是get进程与copy进程共享单缓S,另一部分copy进程与put进程共享单缓t,对于第一部分存在两个同步:get进程放入数据,copy进程才可以取数据,copy进程取走数据,get进程才可以放,所以需两个信号量,Sin表示s缓冲区中是否有空位置,Sout表示S缓冲区中是否有数据。第二部分同理。
设置四个信号量sin表示s缓冲区中是否有空位置初值为1,Sout表示S缓冲区中是否有数据初值为0;Tin表示T缓冲区中是否有空位置初值为1,Tout表示T缓冲区中是否有数据初值为0;
semaphore Sin=1,Sout=0;
semaphore Tin=1,Tout=0:
main()
cobegin
{
get:
while(1)
{
P(Sin);
将数放入S;
V(Sout);
}
copy:
while(1)
{
P(Sout);
P(Tin);
将数从S取出放入T;
V(Tout);
V(Sin);
}
put:
while(1)
{
P(Tout);
将数从T取走;
V(Tin);
}
}