在计算信号量时,没有提供相互排斥,因为有一组同时需要在临界区执行的进程。
然而,二进制信号严格提供互斥。 在这里,临界区域不能有超过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. } }