OS 基础教程

进程管理

同步

死锁

内存管理

文件管理

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/os-binary-semaphore-or-mutex.html

二进制信号量或互斥量


在计算信号量时,没有提供相互排斥,因为有一组同时需要在临界区执行的进程。

然而,二进制信号严格提供互斥。 在这里,临界区域不能有超过1个槽位,而临界区域最多只能有1个槽位。 信号量只能有两个值,0或1。

下面,我们来看看二进制信号量的编程实现。

StructBsemaphore  
{  
    enum Value(0,1); //value is enumerated data type which can only have two values 0 or 1.  
    Queue type L;  
}  
/* L contains all PCBs corresponding to process   
Blocked while processing down operation unsuccessfully.   
*/   
Down (Bsemaphore 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();   
    }  
}  
Up (Bsemaphore S)   
{  
    if (S.L is empty) //an empty blocked processes list implies that no process   
    //has ever tried to get enter in the critical section.   
    {  
        S.Value =1;   
    }  
    else  
    {  
        Select a process from S.L;   
        Wakeup(); // if it is not empty then wake the first process of the blocked queue.   
    }   
}