测试和设定指令中的饥饿

时间:2015-12-13 06:42:15

标签: concurrency operating-system semaphore binary-semaphore

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问题的解决方案是无死锁的。解决方案是免费的。
三。进程按FIFO顺序进入CS。
IV多个进程可以同时进入CS。
以上哪项陈述是正确的?

正确答案作为选项I给出。
虽然I和IV选项对我来说很清楚,但我无法理解饥饿是如何在这里实现的。
如果有人能帮我解释,那就太好了。感谢。

2 个答案:

答案 0 :(得分:1)

当一个进程在此while方法中执行enter_CS循环时,它会在每个调用之间以一段时间间隔调用test-and-set方法。 (此时间间隔可能取决于操作系统如何安排每个进程使用CPU)

假设当process_1已经在临界区内时,process_0开始执行while循环。如果process_1始终退出并在此时间间隔内进入临界区,则process_0将永远不会成功输入cs。 (当等待一个关键部分的进程数量很大时,情况会变得更糟)

Peterson Algorithm提供了一个标记' turn以避免这种饥饿情况。

答案 1 :(得分:0)

上面的代码保证如果多个进程试图获取锁,其中一个将获得锁。获取锁定并不取决于进程的到来。考虑一种情况,当总有两个以上的进程尝试获取锁时,无法保证特定进程最终会获得锁。我希望你能清楚地了解以FIFO顺序进行的收购。