操作系统 计数信号量

操作系统 计数信号量

有一些情况下,多个进程需要同时在关键部分执行。然而,当我们需要在关键部分同时有多个进程时,可以使用计数信号量。

信号量实现的编程代码如下所示,其中包括信号量的结构以及在关键部分中执行进入和退出的逻辑。

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),否则它可以进入临界区。

当一个进程从临界区退出时,它增加计数信号量的值,然后检查它是否为负值或零。如果为负值,意味着至少有一个进程在阻塞状态下等待,为了确保有限等待,阻塞进程列表中的第一个进程将被唤醒并进入临界区。

阻塞列表中的进程将按照它们沉睡的顺序被唤醒。如果计数信号量的值为负,则表示阻塞状态的进程数,如果为正,则表示临界区中的可用插槽数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程