信号量满足有限的等待

Mis*_*thi 7 semaphore

信号量是否满足有限的等待或它们只是为了提供互斥?

Eri*_*c Z 2

回答

理论上它可能会打破有界等待条件,如下所示。实际上,这在很大程度上取决于使用哪种调度算法。

wait()and原语的经典实现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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当一个进程调用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
..
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,尽管您正确地实现/使用了信号量,但是线程2由于不断进入新进程而导致无限的等待时间,甚至可能出现饥饿。