信号量与P,V原语

信号量的意义:一个进程检测到某个信号后,就被强迫停止在一个特定的地方,直到它收到一个专门的信号为止才能继续执行。
定义: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操作顺序应是先私有信号量再公有信号量。否则容易产生死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值