操作系统 计数信号量
有一些情况下,多个进程需要同时在关键部分执行。然而,当我们需要在关键部分同时有多个进程时,可以使用计数信号量。
信号量实现的编程代码如下所示,其中包括信号量的结构以及在关键部分中执行进入和退出的逻辑。
struct Semaphore
{
int value; // processes that can enter in the critical section simultaneously.
queue type L; // L contains set of processes which get blocked
}
Down (Semaphore S)
{
S.value = S.value - 1; //semaphore's value will get decreased when a new
//process enter in the critical section
if (S.value< 0)
{
put_process(PCB) in L; //if the value is negative then
//the process will get into the blocked state.
Sleep();
}
else
return;
}
up (Semaphore s)
{
S.value = S.value+1; //semaphore value will get increased when
//it makes an exit from the critical section.
if(S.value<=0)
{
select a process from L; //if the value of semaphore is positive
//then wake one of the processes in the blocked queue.
wake-up();
}
}
}
在这个机制中,进入和退出临界区是根据计数信号量的值来执行的。计数信号量在任何时刻的值表示可以同时进入临界区的最大进程数。
想要进入临界区的进程首先将信号量值减1,然后检查它是否为负值。如果为负值,则该进程被推入阻塞进程列表(即 q),否则它可以进入临界区。
当一个进程从临界区退出时,它增加计数信号量的值,然后检查它是否为负值或零。如果为负值,意味着至少有一个进程在阻塞状态下等待,为了确保有限等待,阻塞进程列表中的第一个进程将被唤醒并进入临界区。
阻塞列表中的进程将按照它们沉睡的顺序被唤醒。如果计数信号量的值为负,则表示阻塞状态的进程数,如果为正,则表示临界区中的可用插槽数。