-1

我刚刚读到二进制信号量保证互斥并且信号量可以被抢占。

二进制信号量的等待/关闭代码(取自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 可能开始执行,因此两者都可能进入它们的临界区。那么如何保持互斥?

4

1 回答 1

0

二进制信号量通过确保将信号量的值更改为 0(以表明它处于临界区)的过程是唯一可以再次将信号量的值更改为 1 的过程来提供互斥。所以在我的问题即使 P1 开始执行,也不会被抢占。因此,如果 P1 使用共享资源,则确保 P1 在启动 P2 之前完成。只有计数信号量可以被抢占,它们不保证互斥。

于 2021-10-08T10:26:43.367 回答