信号量的两种 wait() 类型。哪一个是真的?

Two type of wait() for semaphore . which one is True ?

我正在阅读 Silberschatz 的书和信号量,我看到了一些令人困惑的东西。

在 Silberschatz 的书中有两种类型的 wait() 定义。

第一个是:

wait(S) { 
    while (S<= 0)
        ; //busy-wait
    S--; 
}

第二个是:

wait(semaphore *S) {
S->value--;
if (S->value < 0) {
    add this process to S->list;
    block();
    }
}

哪个是真的? 当我们调用 wait for semaphore 时,我们首先应该做什么?检查信号量值或减少其值的数量?

两者都是正确的,但正如书中明确提到的那样,第一个定义存在busy-waiting的问题。这意味着它使 CPU 保持忙碌但不工作,因此浪费了 CPU 个周期。

而第二种定义不存在忙等待的问题,因为每当信号量的值不大于0时,进程就会被阻塞,从而进入等待状态,即被占用关闭 CPU,不能再浪费 CPU 个周期。