【正确答案】正确答案:题中没有给出两个进程执行顺序之间的制约关系,只给出了一个数量上的制约关系,即m≤[buf]数据个数一bur2数据个数J≤n。不需要考虑缓冲区的大小,只需要考虑两个进程的同步和互斥。p2向buf2写数据比p1向buf1写数据的次数最少不超过m次,最多不能超过n次,反之也成立。所以是一个生产者和消费者问题。将等式展开得1)m≤(buf1数据个数一bur2数据个数)≤n;2)m≤(buf2数据个数一buf1数据个数)≤n;由于m、n都是正数,等式只有一个成立,不妨设1)成立。在进程p1和p2都没有运行时,两个缓冲区数据个数之差为0,因此,p1必须先运行,向buf1至少写m+1个数据后再唤醒p2运行。信号量s1表示p1一次写入的最大量,初值为n,s2表示p2一次写入的最大量,初值为一m。 semaphore mutex1=1,mutex2=1,S1=n,s2=一m; P1() { while(1){ get data; P(S1); P(mutex1), 写数据到buf1; v(mutex1); v(s2); } } p2() { while(1){ get data; P(S2); P(mutex2); 写数据到buf2, v(mutex2); V(S1); } } 注tpl和p2每次执行时需要进行一些额外的操作。对于p2来说,它首先必须在自己的缓冲区buf2中写入至少m个数据,此后p1和p2的同步可简单地通过两个信号量来控制。题目的一个变形是要求:一m≤(buf2数据个数-buf1数据个数)≤n,那么信号量的初值就变成m和n,若只有p1向buf1放入数据,而p2不放入数据到bur2中,则p1最多可放m次。因此,设置信号量s1,初值为m,此外,每当p2放入一个数据到bur2中时,则使信号量s1增1,即p1增加一次放入数据到buf1的机会。反之,若只有p2向buf2放入数据而p1不放入数据到buf1中,则p2最多可放n次。因此,设置信号量s2初值为n,此外,每当p1放入一个数据到buf1中时,则使信号量s2增1,即p2增加一次放入数据到bufl的机会。
【答案解析】