正确的分析如下:
在这里,因为只有两个进程,所以不必要设置互斥访问信号量,只需要设置两个同步信号量即可(两个同步信号量即可保证这两个进程对管道的互斥访问):empty,表示空管道个数,初值显然为1;full,表示满管道个数,初值显然为0。
其进程语句如下:
PA进程:
while (true)
{
P(empty);
写数据到管道;//进入临界写读数据
V(full);
}
PB进程:
while(true)
{
P(full);
从管道读数据;//进入临界区读数据
V(empty)
}
现在如果PA企图要连续两次写数据,第一次写完之后empty=0,第二次进入PA内再执行P(empty);使得empty=-1,于是PA被阻塞在临界区这个地方,将PA置入阻塞在empty的等待队列。它必须等到执行PB中的V(empty)才可以第2次写入,因为执行PB中的V(empty)之后,empty=0,表明有进程被阻塞在empty信号量上,系统查询empty信号量的等待队列,发现PA,于是调入PA执行临界区操作,注意,因为PA中临界区在“P(empty);”语句之后,继续执行PA时不能又一次执行“P(empty);”,而是直接从临界区“写数据到管道;”开始继续执行。
这里有两个关键点:(1)两个同步量即可保证互斥访问,理由是只有两个进程PA、PB。(2)在唤醒某一个进程时是接着从临界区执行的,而不是让该进程从头开始执行。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页
责任编辑:虫虫