信号量是否满足有限等待或它们只是为了提供互斥?
答案 0 :(得分:2)
<强>答案强>
理论上它可能会打破有限的等待条件,如下所示。实际上,它在很大程度上取决于使用哪种调度算法。
wait()
和signal()
原语的经典实现如下:
//primitive
wait(semaphore* S)
{
S->value--;
if (S->value < 0)
{
add this process to S->list;
block();
}
}
//primitive
signal(semaphore* S)
{
S->value++;
if (S->value <= 0)
{
remove a process P from S->list;
wakeup(P);
}
}
当进程调用wait()
并且未通过“if”测试时,它会将自己置于等待列表中。如果在同一个信号量上阻止了多个进程,则它们都被放入此列表中(或者它们以某种方式链接在一起,如您所想)。当另一个进程离开临界区并调用signal()时,将选择等待列表中的一个进程唤醒,准备再次竞争CPU。但是,调度程序决定从等待列表中选择哪个进程。例如,如果以LIFO(后进先出)方式实施调度,则某些进程可能会被饿死。
示例强>
T1: thread 1 calls wait(), enters critical section
T2: thread 2 calls wait(), blocked in waiting list
T3: thread 3 calls wait(), blocked in waiting list
T4: thread 1 leaves critical section, calls signal()
T5: scheduler wakes up thread 3
T6: thread 3 enters critical section
T7: thread 4 calls wait(), blocked in waiting list
T8: thread 3 leaves critical section, calls signal()
T9: scheduler wakes up thread 4
..
正如您所看到的,虽然您正确地实现/使用了信号量,但线程2具有无限制的等待时间,甚至可能是由于持续输入新进程而导致的饥饿。