在操作系统中,我们有进程,进程会占用资源,有些资源是可以共享的,但有些资源是只允许一个占用,不能共享,只有当占用的线程用完释放后,下一个需要用的线程才可以申请使用,这样的资源便是临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。

消费者和生产者就金典的讲述了消费者与生产者共享“缓存区”的多线程同步问题。

基本描述:

同步关系

生产者负责生产产品,将产品放入仓库(“缓冲区”),然后消费者就从仓库里取件,然后消费。这里的仓库(“缓冲区”),就是是两者并发进行的条件。在生产和消费之间,必须满足同步,也就是不允许消费者从空库里取货,也不允许生产者向一个已经装满的仓库中放货,要想有序达成循环,就必须同步。

互斥关系

生产者和消费者,哪里存在互斥呢?

当然是二者对于缓冲区存在互斥问题,哪里来的互斥?你想想,生产者和消费者是同步运行的,肯定会遇到两者同时用缓存区的时候,如果同时用的话,那么产品数,和消费数就会不一致(例如,原来的产品数是num=1,现在缓冲区不但生产了(num+1=2),还取走了(num=1-0)这导致num变为0了,此时的变量二者用的都是num=1)这样就会导致结果出问题。对于这样的问题就必须对缓冲区进行互斥。

分析

对于同步问题和互斥问题,我们可以利用信号量机制来解决,什么是信号量呢?顾名思义就是用来做标记的信号。

这里我们可以设置信号量mutex作为互斥信号量,用于可控制互斥缓冲池,初值为1。信号量 full 用于记录缓冲池中满缓冲区数,初值为 0 ;信号量 empty 用于记录缓冲池中空缓冲区数,初值为 n。

PV操作的理解

什么是P 操作什么是V操作呢?P和V的取名好像是由于某个人来命名的不太了解。

我给大家谈谈我对于PV操作的理解吧,PV操作实质上就是对临界资源进行加锁的机制,使得许多进程可以对临界资源进行互斥访问,上面分析的信号量就对于这种机制起到了至关重要的作用。

P操作:P操作就是对资源进行申请

P操作原语动作如下:(原语就是若干条指令组成的,能执行一定功能的一个过程)

就拿上面设置的信号量empty来举例吧
(1)empty减1;
(2)若empty减1后仍大于或等于零,则进程继续执行;
(3)若empty减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。

上面的运行原语就是P操作了。

V操作:V操作就是对资源的释放

V操作的原语动作如下:

(1)empty加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于或等于零(表明有进程阻塞在该类资源上),则从该信号的等待队列中唤醒一等待进程(从阻塞队列里唤醒一个进程来“转手”该类资源,唤醒了就意味着可以干活了),然后再返回原进程继续执行或转进程调度。
注意:PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。

PV原语的执行顺序:

先是P操作申请资源empty+1

然后访问临界资源,进行相关操作

然后V操作释放资源empty-1

好的,现在知道啦这些PV操作的原语了。

怎么用PV操作解决消费者生产者之间同步互斥问题?

先放个图:

先声明这两个代码是同时运行的。

分析:这里设置的信号量在声明一些,empty代表空缓冲区的个数设置为n(就是缓冲区还有n个位置),信号量full就是满缓冲区的个数初始为0(也就是占了多少缓冲区)。互斥信号量mutex的初始值为1,在最开始我介绍了为什么要设置互斥。

过程分析

生产者生产产品---->P操作若empty>0则申请资源(申请到一个资源)所以empty-1---->P(mutex)这里初始值为1,执行mutex-1变为了0,好!现在临界资源(缓冲区)只允许生产者一个人使用了,在临界资源上进行相关操作,为什么这里可以实现互斥呢?由于mutex是samephorel变量,所以消费者运行时mutex的值现在是0,所以在消费者的P(mutex)这一步时,进入了阻塞状态,只有等待生产者执行V(mutex)时释放临界资源mutex+1=1,此时的消费者阻塞状态变为执行状态。---->利用临界资源进行相关操作(这里是插入缓冲区)---->执行V(full)操作释放资源full+1(就是将产品放入了仓库),看到上图中的箭头了没有,此时full=1,便可以唤醒消费者进行P(full)操作。---->操作完之后当然要释放临界资源(缓冲区)V(mutex)。---->消费者这边的也是雷同的。

有上面我的解释,可以得出红色箭头中的P(mutex)就是防止消费者也利用临界资源,导致最后的结果错误。

OK!这些操作就可以解决同步互斥问题了,这里要注意的是P(empty)和P(mutex)的顺序问题:都是先执行P(mutex)再进行P(empty),我上面分析了这么多,应该也知道为什么了吧,可以自己分析一下,如果顺序反了,会进入死锁状态。

还有一个问题要注意的就是PV操作是成对出现的。

了解这些后,可以看个经典题目:

桌子上有一空盘,最多允许存放一只水果。爸爸可想盘中放一个苹果或橘子,儿子专等吃盘中的橘子,女儿专等吃苹果。试用wait、signal操作实现爸爸、儿子、女儿三个并发进程的同步。

这里只做简单分析:临界资源是盘子,可设置互斥信号量mutex解决(如果不解决会出现一个盘子有两个水果的情况),设置信号量empty=1,orange=0,apple=0,来解决同步问题

我的答案:

semaphore empty=1,nutex=1,apple=0,orange=0;  //为四个信号量赋初值
void father(){while(true){  wait(empty);    //等待盘子为空wait(metux);    //等待获取对盘子的操作爸爸向盘中放一个苹果;signal(mutex);   //释放对盘子的操作signal(apple);   //通知女儿可以来盘子中取苹果}
}
void father(){               //与父亲进程雷同do{wait(empty);wait(metux);爸爸向盘中放一个桔子;signal(mutex);signal(orange);}while(TRUE);
}
void son(){                        do{wait(orange);       //判断盘子中是否有桔子wait(metux);        //等待获取对盘子的操作儿子取出盘中的桔子;signal(mutex);      //释放对盘子的操作signal(empty);      //盘子空了,可以继续放水果了}while(TRUE);
}
void daugther(){               //与儿子进程雷同do{wait(apple);wait(metux);女儿取出盘中的苹果;signal(mutex);signal(empty);}while(TRUE);
}
void main() {               //四个并发进程的同步执行cobeginfather();mather();son();daugther();coend
}

上面的这个金典问题也很好的将PV操作解决同步互斥问题展现的淋漓尽致!

还有一个重要的点忘说了,那就是wait、和signal的操作与PV操作的区别,这里你可以理解为wait操作就是P操作,用来申请资源的,signal操作就是V操作用来释放资源的。

上面的分析不知道有没有错误,望发现错误的大神指明我的错误!!

操作系统中消费者与生产者的同步互斥问题相关推荐

  1. 操作系统中PV操作实现进程同步与互斥问题(以苹果橘子问题为例)

    桌上有一空盘,允许存放一个水果.爸爸可向盘中放苹果,也可向盘中放桔子, 儿子专等吃盘中的桔子,女儿专等吃盘中的苹果.规定当盘空时,一次只能放一个水果供吃者取用, 请用P.v原语实现爸爸.儿子.女儿三个 ...

  2. 如何避免操作系统中多线程资源竞争的互斥与同步?

    作者 | 小林coding 来源 | 小林coding(ID:CodingLin) 前言 先来看看虚构的小故事 已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕. 没办 ...

  3. 操作系统中多生产者多消费者问题中,关于生产者或消费者中的两个P操作是否可以互换问题

    本文是对网上答复做的补充和修改,变动很大,对很多内容是持有相反观点的,并对一些内容进行了解释,这样使整个过更加清晰些,不为奖励,只为和我一样在理解很浅时的同学解惑.字可能很多,但我希望你读完,尤其是你 ...

  4. java同步互斥功能检测_猿考研之操作系统篇三(进程同步,管程,死锁)

    进程同步 进程具有异步性的特征.异步性是指,各并发执行的进程以各自独立的.不可预知的速度向前推进. 同步机制应遵循的准则 空闲让进:其他进程均不处于临界区: 忙则等待:已有进程处于其临界区: 有限等待 ...

  5. 操作系统中的同步和异步

    操作系统中同步.异步性概念 首先我们从操作系统的发展中学习什么是异步性.在操作系统发展的初期阶段,CPU处理的是作业,而且是单道批处理.什么意思呢?就是一个作业从提交到结束,程序员都不能干预,此时整台 ...

  6. 【考研】操作系统:2019年真题43(同步互斥问题)

    前言 解决同步互斥问题的思路,源于对王道讲解的总结笔记 同类型题目: [考研]操作系统:2015年真题45(同步互斥问题)_住在阳光的心里的博客-CSDN博客 [考研]操作系统:2014年真题47(同 ...

  7. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  8. 生产者消费者伪码_[线程同步]生产者消费者代码实现

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下: 有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者 ...

  9. 操作系统 - C语言实现生产者消费者问题

    同步互斥问题 - 生产者消费者问题 问题描述: 有多个进程:多个生产者进程和多个消费者进程共享一个初始为空.固定大小为n的缓存(缓冲区).生产者的工作是制造数据,只有缓冲区没满时,生产者才能把消息放入 ...

最新文章

  1. ELASTIC SEARCH 性能调优
  2. 深度干货!值得精读的2018自动驾驶行业发展报告
  3. 布隆过滤器解决缓存穿透_缓冲穿透/缓存击穿/缓存雪崩等问题解决办法
  4. 我是IT小小鸟 读书笔记
  5. 发现一个电子书下载的【简书】
  6. module.js:549 throw err;
  7. java集合类中的迭代器
  8. 【2】puppet笔记 - package、service、user资源
  9. zybo上运行linux,Zybo开发板linux作业系统移植
  10. 存储基本概念与SAN存储
  11. Android 游戏开发入门 视频+源码
  12. 机器学习cs229——(一)概要
  13. 服务器虚拟化发展的趋势,2013年服务器虚拟化九大发展趋势
  14. matlab画柱状图
  15. npm i --legacy-peer-deps
  16. google浏览器添加抓包插件
  17. Babylongjs-动画
  18. Camera相机研发介绍
  19. cpu亲和力总结taskset和setcpu及其他相关
  20. 材料力学 4.弯曲内力

热门文章

  1. 谷歌 汽车 android auto link,谷歌将推出Auto Link智能车载系统
  2. uoj #311.【UNR #2】积劳成疾 dp
  3. 【电力电子技术】 THE BUCK-BOOST 升降压斩波电路
  4. miRNA数据库篇——miRDB:软件预测的哺乳动物miRNA靶基因数据库(假阳性较高)
  5. IC授权卡和复制卡的区别_北京居住证跟居住卡的区别
  6. html emmet输入法_Emmet HTML参考
  7. IEEE UV 2022 “Vision Meets Algae” 目标检测竞赛正式启动!
  8. 拒绝“累丑”,走进RPA的世界
  9. 计算机软件著作权的注册和认证
  10. 项目干系人管理-知识领域