信号量

  • PV操作

    • 定义:由P操作原语和V操作原语(不可中断),对信号量进行操作

    • 具体定义:

      • P(S):1。.信号量S减1;如果S>=0,则继续执行;否则该进程置于等待状态,排入等待队列。

      • V(S):1.信号量S加1;2.如果S>0,则进程继续执行;S<0应该要释放队列中第一个等待信号量的进程,然后继续执行。

        注:如果这里的S=0? 解析:这里不会出现S=0;因为S=0的话,那么V之前的信号量为-1。再P之前,信号量为0。反推过程,S-1后为-1,进程应该进入等待队列。

    • 意义:使用信号量和PV操作实现进程的同步和互斥。

  • 信号量

    • 信号量的值: 与相应资源的使用情况联系
      • 当值大于0,表示当前可用资源的数量;
      • 当值小于0,其绝对值表示等待使用该资源的进程个数。
      • 当值等于0,此时有一个进程是在使用该资源的,但还没有等待的进程。下一个进程会进入等待队列。
  • 信号量和PV操作实现进程互斥

    一般模型:
    进程P1
    ...
    P(S);
    临界区;
    V(S);
    
    信号量S用于互斥,初值为1。
    使用PV操作实现进程互斥应该注意:
    1.成对性:每个程序实现互斥的PV操作应成对出现,先做P操作,进临界区,后做V操作,出临界区。有多个分支,要仔细检查成对性
    2.PV操作应紧靠临界区头尾部,且临界区代码尽可能短,不能有死循环
    3.互斥信号量初值一般为1。注意:这里不一定为1哦!
    
  • 信号量和PV操作实现进程同步

    • 一个信号量与一个消息联系起来,

      • 当信号量值为0,表示期望消息尚未产生
      • 当信号量为非0,表示期望消息已经存在
    • 调用P操作测试消息是否到达,调用V操作发送消息

    • PV操作实现进程同步时注意:

      1. 成对性:同一信号量的PV操作要成对出现,但要分别在不同的程序代码中。
      2. 分析进程间制约关系,来确定信号量种类。
      3. 同步信号量的初值与相应资源的数量有关,也与P、V操作在代码中的位置有关
    • 问题:

      例1 生产者-消费者问题
      1)一个生产者、一个消费者,公用一个缓冲区。
      解析:定义两个同步信号量  
      empty===表示缓冲区是否为空,初值为1
      full===表示缓冲区是否为满,初值为0
      
      思考:为什么这里不用一个同步信号量呢?
      个人见解:
      
      生产者进程:
      while(TRUE){
        生产一个产品;
        P(empty); //empty>=0则继续执行,否则加入等待队列;还有缓存
        产品送往Buffer;
        V(full);
      }
      消费者进程:
      while(TRUE){
        P(full);//full>=0则继续执行,否则加入等待队列;还有产品了
        从Buffer中取出一个产品;
        V(empty);
      }
      
      2)一个生产者、一个消费者,公用n个环形缓冲区。
      解析:定义两个同步信号量:
      empty==表示缓存区是否为空,初值为n;
      full===表示缓冲区是否为满,初值为0;
      设缓冲区编号为1-n-1,定义两个指针in和out
      生产者进程
      while(TRUE){
        生产一个产品;
        P(empty); //empty>=0则继续执行,否则加入等待队列;还有缓存
        产品送往Buffer;
        in=(in+1)mod n;
        V(full);
      }
      
      消费者进程:
      while(TRUE){
        P(full);//full>=0则继续执行,否则加入等待队列;还有产品了
        从Buffer中取出一个产品;
        out=(out+1) mod n;
        V(empty);
      }
      3)一组生产者、一组消费者,公用n个环形缓冲区。
      解析:这里还要考虑生产者之间、消费者之间必须互斥地访问缓冲区
      定义4个信号量
      empty===表示缓冲区是否为空,初值为n
      full===表示缓冲区是否为满,初值为0
      mutex1---生产者之间的互斥信号量,初值为1
      mutex2---消费者之间的互斥信号量,初值为1
      
      生产者进程
      while(TRUE){
        生产一个产品;
        P(empty); //empty>=0则继续执行,否则加入等待队列;还有缓存
        P(mutex1);//互斥信号量应紧贴临界区。
        产品送往Buffer;
        in=(in+1)mod n;
        V(mutex1);
        V(full);
      }
      
      消费者进程
      while(TRUE){
        P(full);//full>=0则继续执行,否则加入等待队列;还有产品了
        P(mutex2);
        从Buffer中取出一个产品;
        out=(out+1) mod n;
        V(mutex2);
        V(empty);
      }
      注意:无论生产者进程还是消费者进程中,两个P的操作不能颠倒次序。否则会造成死锁。
      例2 桌子上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定盘空时一次只放一只水果供吃者取用。请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
      1.首先分析 信号量
      
  • PV原语对信号量的操作的3种情况

    • 视为一个加锁标志位,实现对一个共享变量的互斥访问
    • 视为某种类型的共享资源的剩余个数
    • 做为进程间的同步工具
  • 补充:同步和互斥的概念

    • 互斥:同一资源只允许一个访问者对齐进行访问,具有唯一性和排它性。访问无序。
    • 同步:在互斥的基础上(大多数情况),通过其他机制实现访问者对资源的有序访问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值