信号量操作

一、信号量

1、信号量的实现

sturct semaphore{       //信号量由整型变量和等待队列组成
    int count;
    queueType queue;
}
wait(semaphore s)       //P操作
{
    s.count--;
    if(s,count < 0)
    {
        阻塞该进程;
        将该进程插入等待队列s.queue;
    }
}
signal(semaphore s)     //V操作
{
    s.count++;
    if(s.count <= 0)
    {
        从等待队列s.queue中取出第一个进程P;
        将P插入就绪队列;
    }
}

2、信号量的分类:整型信号量和记录型信号量资源信号量
记录型信号量的初值为1,说明该资源同时只允许一个进程访问临界资源。

3、信号量的应用
(1)实现进程同步
这里的例子中,两个进程P1和P2,要求进程P1中S1的代码必须在进程P2的S2之前执行。

semaphora N=0;
P1()
{
    ...
    S1;
    V(N);
}
P2()
{
    ...
    P(N);
    S2;
    ...
}

(2)实现进程的互斥
进程P1和P2两者有各自的临界区,要求同时只能有一个进程进入自己的临界区。

semaphore N=1;
P1()
{
    ...
    P(N);
    P1的临界区代码;
    V(N);
}
P2()
{
    ...
    P(N);
    P2的临界区代码;
    V(N);
}

你可能感兴趣的:(操作系统)