一、信号量
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);
}