GATE考试中询问了以下问题: 使用test-and-set指令实现enter_CS()和leave_CS()函数来实现进程的关键部分,如下所示:
void enter_CS(X)
{
while test-and-set(X) ;
}
void leave_CS(X)
{
X = 0;
}
在上面的解决方案中,X是与CS关联的内存位置,并初始化为0.现在考虑以下语句: I.上述CS问题的解决方案是无死锁的 II。解决方案是免费的。 III。进程按FIFO顺序进入CS。 IV多个进程可以同时进入CS。 以上哪项陈述是正确的? 正确答案作为选项I给出。 虽然I和IV选项对我来说很清楚,但我无法理解饥饿是如何在这里实现的。 如果有人可以帮我解释一下那会很棒。谢谢。
当一个进程在这个while
方法中执行enter_CS
循环时,它会一直调用test-and-set
方法,每个调用之间有一个时间间隔。 (此时间间隔可能取决于操作系统如何安排每个进程使用CPU)
假设当process_1已经在临界区内时,process_0开始执行while
循环。如果process_1始终退出并在此时间间隔内进入临界区,则process_0将永远不会成功输入cs。 (当等待一个关键部分的进程数量巨大时,情况会变得更糟)
Peterson Algorithm提供“旗帜”turn
以避免这种饥饿情况。
上面的代码保证如果多个进程试图获取锁,其中一个将获得锁。获取锁定并不取决于进程的到来。考虑一种情况,当总有两个以上的进程尝试获取锁时,无法保证特定进程最终会获得锁。我希望你能清楚地了解以FIFO顺序进行的收购。