这是两个过程解决方案算法1:
turn = 0;
i = 0, j = 1;
do
{
while (turn != i) ; //if not i's turn , wait indefinitely
// critical section
turn = j; //after i leaves critical section, lets j in
//remainder section
} while (1); //loop again
我理解互斥是满意的。因为当P0处于临界区时,P1会等待它离开临界区。在P0更新转向后,P1进入临界区。我不明白为什么这个算法不能满足进度。
进展是否在临界区等待过程中没有进程应该能够进入关键部分而无需等待。
P0更新在离开临界区后转弯,因此在循环中等待的P1应该能够进入临界区。你能否告诉我为什么没有进展呢?
答案 0 :(得分:2)
前进进度定义如下:
如果没有进程在其CS中执行并且存在一些希望进入其CS的进程,则无法无限期地推迟将进入CS的进程的选择。
在线程不平衡的情况下,上面编写的代码不满足此要求,请考虑以下情形:
换句话说,该算法不能支持其中一个进程运行得更快的系统。它强制关键部分由P0 -> P1 -> P0 -> P1 -> ..
平等拥有。对于前进进展,我们希望允许一个场景,例如以下列方式P0 -> P1 -> P1 -> ..
拥有它,并继续P1,而P0不准备再次进入。否则P1可能会饿死。
Petersons' algorithm通过添加标记来解决此问题,以指示线程准备好何时进入关键部分,基于回合制的公平性。这保证了没有人因其他线程效率低下而停滞不前,并且没有人可以连续多次进入,除非另一方允许。
答案 1 :(得分:1)
您无法确定两个进程中的代码的运行顺序。当第一个P1运行并尝试进入临界区时,不允许进入,因为它是P0的转弯。因此,即使没有其他过程,P1也无法进入临界区。因此,没有实现进步。
答案 2 :(得分:0)
这里的问题是这完全取决于较低级别的进程调度。操作系统通常需要一点时间来唤醒休眠进程,这是在当前在CPU上运行的进程通过执行某些阻塞系统调用自动放弃控制或在时间量子到期时超出定时器中断的时刻完成的。在完整的SMP系统上,这也需要一些非平凡的内核同步和信令。
这意味着进程0可以循环离开并再次进入关键部分,而进程1没有机会运行。
另外,我希望你也不依赖于裸整数变量进行互斥。这些可能会被编译器缓存在寄存器中,如果没有,处理器缓存就会起作用。这应该通过特殊的CPU指令来完成,例如test-and-set。