信号量的意义:一个进程检测到某个信号后,就被强迫停止在一个特定的地方,直到它收到一个专门的信号为止才能继续执行。
定义:typedef struct
{
int value;
PCB_pointer PCB;
} Semaphore;
操作:P,V原语。
P原语:int型数值减1,若结果小于0,则将调用P(s)的进程置成等待信号量s的状态。(阻塞)
V原语:int型数值加1,若结果小于0,则释放一个等待信号量s的进程。(唤醒)
信号量s的整形值大于0,表示可用资源个数;小于等于0时,表示在s上等待的进程数。
进程被阻塞时,将没有机会获得处理器;这与忙等待的临界区管理方法不同,提高了效率。
进程互斥和进程同步
互斥:不能同时访问资源。用Public Semaphore来实现。
同步:进程A要等待进程B发来的相应消息,才能继续进行,用Private Semaphore来实现。
e.g. m个生产者,n个消费者,缓冲区可存放k个物品。
int in,out;
Public Semaphore s; 对缓冲区存取是互斥的。
Private Semaphore s1,s2; s1,生产者能否将物品放入缓冲区。s2,消费者能否从缓冲区中取物品。
s.value=1; s1.value=k; s2.value=0;
process producer_i
{
int item;
生产一产品暂存于item中;
P(&s1);
P(&s);
buffer[in]=item;
in=(in+1)%k;
V(&s2);
V(&s);
}
process consumer_i
{
int item;
P(&s2);
P(&s);
item=buffer[out];
out=(out+1)%k;
V(&s1);
V(&s);
}
注意,生产者进程中P操作顺序应是先私有信号量再公有信号量。否则容易产生死锁。