我有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
那时两个进程都陷入僵局。