我刚刚读到二进制信号量保证互斥并且信号量可以被抢占。
二进制信号量的等待/关闭代码(取自https://www.javatpoint.com/os-binary-semaphore-or-mutex)
Down (semaphore S)
{
if (s.value == 1) // if a slot is available in the
//critical section then let the process enter in the queue.
{
S.value = 0; // initialize the value to 0 so that no other process can read it as 1.
}
else
{
put the process (PCB) in S.L; //if no slot is available
//then let the process wait in the blocked queue.
sleep();
}
}
那么如果一个进程 P1 正在运行并且它检查 down 函数中的条件并且即将将 s.value 的值更改为 0,但是在它之前它被抢占并且它的 PCB 被保存并且一个新进程 P2 开始运行它检查条件并将 s.value 更改为 0 并且其临界区开始。另一方面,如果 P2 进入 I/O 等待状态,则 P1 可能开始执行,因此两者都可能进入它们的临界区。那么如何保持互斥?