1

GATE 考试中提出了以下问题:
用于实现流程关键部分的 enter_CS() 和 leave_CS() 函数使用 test-and-set 指令实现,如下所示:

void enter_CS(X)
{
    while test-and-set(X) ;
}
void leave_CS(X)
{
   X = 0;
}

在上述解决方案中,X 是与 CS 关联的内存位置,并被初始化为 0。现在考虑以下语句:
I. 上述 CS 问题的解决方案是无死锁
II。该解决方案是无饥饿的。
三、进程按 FIFO 顺序进入 CS。
IV 多个进程可以同时进入CS。
以上哪些说法是正确的?

正确答案是选项 I。
虽然 I 和 IV 选项对我来说很清楚,但我无法理解这里的饥饿是如何可能的。
如果有人可以帮我解释一下,那就太好了。谢谢。

4

2 回答 2

2

当一个进程在这个方法内执行while循环时,它会在每次调用之间有一个时间间隔enter_CS不断地调用该方法。test-and-set(这个时间间隔可能取决于操作系统如何调度每个进程使用 CPU)

while假设 process_1已经在临界区内时process_0 开始执行循环。如果 process_1 总是在这个时间间隔内退出并进入临界区,那么 process_0 将永远无法成功进入 cs。(当等待一个临界区的进程数量巨大时,情况会变得更糟)


彼得森算法提供了一个“标志”turn来避免这种饥饿情况。

于 2018-02-28T07:04:17.493 回答
0

上面的代码保证,如果多个进程试图获取锁,其中一个将获得锁。锁的获取不依赖于进程的到来。考虑一个场景,当总是有两个以上的进程尝试获取锁时,无法保证特定进程最终会获得锁。我希望您能清楚地了解按 FIFO 顺序进行的采集。

于 2015-12-14T06:30:46.500 回答