我有2个进程P1和P2,它们共享3个信号量(s1,s2,s3),每个信号量的初始值均为1,并且还有3个变量(x,y,z)

P1:                  P2:
wait(s1);            wait(s2);
x = x + 1;           y = y * 2;
wait(s2);            wait(s3);
y = y - x;           z = z - y;
wait(s3);            signal(s2);
z = x + 2 * y - z;   wait(s1);
signal(s3);          x = x + 2;
signal(s2);          signal(s1);
signal(s1);          signal(s3);


如果要在具有单个CPU的计算机上同时运行它们,P1和P2是否有可能陷入僵局?

我的看法是,一旦它们开始运行,它们两个都将wait()导致它们坐下来,直到发出信号()。既然没有其他东西在运行,那么他们不是都陷入僵局吗?我觉得我缺少一些妨碍我理解的关键性简单知识。任何见识表示赞赏!

最佳答案

您的示例中的三个信号量都用1初始化,因此不会在每个进程的第一行阻塞。

现在考虑此示例运行:


P2一直运行到语句执行之前的wait(s1)。此时,信号量s2和s1的计数为1,s3的计数为0。
现在P1执行,直到由于值0而无法获取的wait(s3),但到那里为止,它已经拥有s1和s2的所有权
现在,P2恢复执行,但立即被阻塞,等待s1


那时两个进程都陷入僵局。

10-07 19:37
查看更多