zoukankan      html  css  js  c++  java
  • 生产者消费者信号量的个人理解

    使用buffer存储生产者生产的东西
    int enpty = n;//buffer中空的位置
    int full = 0;//buffer中能消费的位置
    int mutex = 1//互斥量
    生产者{
    p(empty);
    //生产物质
    p(mutex)
    //使用互斥锁,保证临界区在一个时间段是能让一个进程访问
    v(mutex)//退出临界区
    v(full)//每次生产一件物质full都需要加一,并且唤醒等待消费的进程
    }


    消费者{
    p(full)//判断buffer中是否有物质可用
    p(mutex)//上锁
    消费
    v(mutex)//
    v(empty)//如果empty<=0,那么唤醒生产者进程
    }

    如果调换生产者两个p操作位置

    生产者{
    p(mutex)
    //使用互斥锁,保证临界区在一个时间段是能让一个进程访问
    
    
    p(empty);
    //生产物质

    v(mutex)//退出临界区
    v(full)//每次生产一件物质full都需要加一,并且唤醒等待消费的进程
    
    
    }
    此时如果生产者生产过快,导致empty为0,再次生产时p(mutex)可以上锁,mutex 变为0;此时由于empty == 0;生产者进程进入阻塞状态,此时消费者进程由于mutex == 0:后面的语句无法执行,这样消费者进程也进入阻塞,导致两个进程死锁。

     这是信号量的P、V操作,baiP表示申请一个资源du,每次P操作使信号量减1,V是释放一个资源,每次V操作使信号量加1。信号量表示的是当前可用的资源个数,当信号量为负时,申请资源的进程就只能等待了。所以,信号量是负的多少,就表明有多少个进程申请了资源但无资源可用只能处于等待状态。当信号量为1时变成了互斥锁,当信号量大于一时,表明进程可以访问被信号量保护的临界区

  • 相关阅读:
    Kubernetes-Pod的扩、缩容以及滚动升级
    从一个例子开始认识Kubernetes
    Kubernetes的基本术语和概念
    一分钟看懂Docker的网络模式和跨主机通信
    监控神器:Premotheus+Grafana安装
    Linux不同服务器之间copy文件
    Oracle 存储情况查询
    Kubernetes v1.10 快速安装(只需三步)
    django 搭建一个投票类网站(二)
    django 搭建一个投票类网站(一)
  • 原文地址:https://www.cnblogs.com/guosai1500581464/p/13179992.html
Copyright © 2011-2022 走看看