互斥同步经典PV操作

内容来自B站王道老师计算机考研操作系统讲解

文章目录

  • 互斥同步经典PV操作
  • 一、单生产者和消费者
  • 二、多生产者和多消费者
  • 三、吸烟问题
  • 四、读者与写者问题
  • 总结

一、单生产者和消费者

问题描述一

系统中有一组生产者和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区取出一个产品并使用(这里的产品理解为莫种数据),生产者和消费者共享一个初始为空,大小为n的缓冲区。
1)只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
2)只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
3)缓冲区是临街资源,各进程必须互斥访问。


在搞清楚生产者和消费者问题的关键是我们要搞清楚问题中包含的几种关系,同步关系和互斥关系。就上述这题不难得出
同步关系(缓冲区满时,生产者要等待消费者取出产品)
同步关系(缓冲区空时,消费者要等待生产者放入产品)
互斥关系(各进程必须互斥访问)

注意

1)设置初始值为1 的互斥信号量
2)设置初始值为0的同步信号量(实现“一前一后”)
3)设置一个信号量,初始值即为资源的数量(本质上也属于“同步问题”,若无空闲资源,则申请资源的进程需要等待进程释放资源后才能继续往下执行)
4)生产者每次要消耗(P)一个空闲缓冲区,并生产(V)一个产品,消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V),往缓冲区放入或取出产品需要互斥。

semaphore mutex = 1;//互斥信号量 ,实现对缓冲区的互斥访问
semaphore empty = n;//同步信号量,表示空闲缓冲区的数量
semaphore full = 0;//同步信号量,表示产品的数量,也为非空缓冲区的数量

伪代码实现

//生产者
producer(){while(1){生产一个产品;P(empty); //申请资源P(mutex); //上锁把产品放入缓冲区;V(mutex); //解锁V(full) //增加一个产品}
}
//消费者
consumer(){while(1){P(full); //消耗一个产品(非空缓冲区)P(mutex); //上锁从缓冲区取出一个产品;V(mutex); //解锁V(empty); //添加一个空闲缓冲区使用产品;}
}

将资源申请和上锁顺序交换会出现上面问题?

//生产者
producer(){while(1){生产一个产品;P(mutex); //上锁  P(empty); //申请资源  把产品放入缓冲区;V(mutex); //解锁V(full) //增加一个产品}
}
//消费者
consumer(){while(1){P(mutex); //上锁  P(full); //消耗一个产品(非空缓冲区)从缓冲区取出一个产品;V(mutex); //解锁V(empty); //添加一个空闲缓冲区使用产品;}
}

分析:
若此时缓冲区已经放满产品则empty = 0,full = n
则生产者进程执行P(mutex)后mutex = 0,继续执行P(empty)由于没有空闲缓冲区,因此生产者被阻塞,由于产生阻塞,因此进行进程切换运行消费者进程,消费者进程执行P(mutex),由于mutex为0,所以生产者还没释放对临界资源的“锁”,因此消费者也被阻塞。
所以这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。
同样,若缓冲区中没有产品full = 0,empty = n,消费者先执行同样也会造成“死锁”.

总结

实现互斥的操作P一定要在实现同步的P操作后,V操作不会导致进程阻塞,因此两个V操作的顺序可以交换。

二、多生产者和多消费者

问题描述二

桌子上有一个盘子,每次只能向其中投入一个水果,爸爸专向盘子放入苹果,妈妈专向盘子投入橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子为空时,爸爸或妈妈才可向盘子放入水果。仅当盘子中有自己需要的水果时,儿子或女儿才可以从盘子中取出水果。

问题分析二

进行问题同样我们还是先找出问题中存在的关系
一、互斥关系
对缓冲区(盘子)的访问要互斥的进行
二、同步关系(一前一后)
1)父亲将苹果放入盘子后,女儿才能取出苹果
2)妈妈将橘子放入盘子后,儿子才能取出橘子
3)只有盘子为空时,父亲或母亲才能放入水果

伪代码实现

分析:刚开始儿子、女儿进程即使上处理机也会被阻塞。如果刚开始是父亲进程先上处理机执行则父亲P(plate),获取资源此时plate = 0,此时如果母亲进程执行则会被阻塞等待获取盘子资源,父亲放入苹果后V(apple),女儿进程被唤醒,其他进程即使运行也会被阻塞,暂时不可能访问临界资源(盘子),当女儿进程执行V(plate)后,母亲获得资源P(plate)将橘子放入盘子中,此时其他进程都无法进入临界资源,母亲执行V(orange)后,儿子进程被唤醒,执行P(orange),此时父亲进程和其他进程是被阻塞的,当儿子进程V(plate)后,才可以继续执行一直这样循环执行上面操作。

三、吸烟问题

问题描述三

问题分析三

伪代码实现

四、读者与写者问题

问题描述四

问题分析四

伪代码实现

方式一

方式二

总结

对于PV的案例我们关键是要搞清楚问题中存在的相互关系,同步和互斥

【互斥同步经典PV操作】相关推荐

  1. 秒杀多线程第十二篇 多线程同步内功心法——PV操作上

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  2. 【操作系统】经典PV操作题目

    5个经典PV操作题(附答案) 三个进程之间的同步 pv操作的经典习题 PV操作题型整理 生产者和消费者 生产者消费者问题 当只有一个生产者和一个消费者的时候,且只有一个缓冲区 要考虑生产者和消费者两个 ...

  3. 多线程面试题系列(12):多线程同步内功心法——PV操作上

    上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点.本文将会先简要介绍下P ...

  4. 操作系统9道经典PV操作

    文章目录 仓库存储 放水果 放水果2 理发师理发 吸烟者问题 面包师问题 写者优先的读者-写者问题 交通问题 共用缓冲区 仓库存储 问题描述:有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大, ...

  5. java pv操作_理解同步的PV操作

    PV操作是Edsger Dijkstra提出的一种经典的解决同步不同执行线程的问题的方法,这种方法是基于一种叫信号量的特殊变量来实现的. 简单理解为就是通过共享变量+信号量实现的一种同步机制,其应用与 ...

  6. 经典PV操作问题 [转]

    1. 睡眠理发师问题 理发店里有一位理发师.一把理发椅和n把供等候理发的顾客坐的椅子.如果没有顾客,则理发师便在理发椅上睡觉,如图2-20所示.当一个顾客到来时,他必须先叫醒理发师,如果理发师正在理发 ...

  7. 多线程面试体系列(13):多线程同步内功心法——PV操作下

    暂无 转载于:https://www.cnblogs.com/dengyungao/p/7504051.html

  8. 【软考】PV操作同步互斥

    进程 在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源),一个进程能有多个线程. 临界资源 指一次只能有一个进程在占用的资源.如 ...

  9. 最经典的关于PV操作的解释说明

    不知道各位有没有感觉,计算机方面的考试,操作系统那块似乎PV操作经常考,这一方面说明它的重要,另一方面也说明它不容易理解,出错的人很多,下面就举几个经典的例子来帮助大家学习,也与诸位同进步. 一,PV ...

最新文章

  1. 在JavaFX程序中嵌入Swing内容
  2. android 抽屉_Android Studio之路,我们来了解一下Google官方Android开发工具
  3. Timer组件的使用
  4. 【数据库】第四章 JDBC、MyBatis
  5. Centos7下搭建FastDFS+Nginx
  6. python导入mat文件_python读取并写入mat文件的方法
  7. java解释器是哪个命令_宽恕命令解释器的最佳Java库(IES)
  8. OPIE(火狐扩展)-导入导出firefox扩展的所有设置
  9. 仿XP画图板—升级版
  10. Joomla 插件 attachments 使用时出现不支持ZIP文件上传的错误
  11. Java DataSource对象
  12. Linux中实现定时任务详解
  13. mac系统升级后npm安装依赖报错gyp: No Xcode or CLT version detected
  14. 人们已经离不开5G了,商用三年半,中国5G发展迈向新征程,产业发展全面提速!
  15. 社区社群运营,如何打造火爆营销的方法?
  16. prescan安装包(8.5/2019.2版本)下载
  17. docker-部署lnmp
  18. 十二、动态座位响应及用户订票《仿淘票票系统前后端完全制作(除支付外)》
  19. PointPillars点云检测在OpenPCDet推理代码详解
  20. 【系统性学习】Linux Shell常用命令

热门文章

  1. Table中行点击事件和复制事件冲突问题
  2. 2012微软“创新杯”全球学生大赛启动了
  3. 抓取部分京东手机信息案例(Java案例)
  4. 从放苹果问题到零钱兑换问题(动态规划)
  5. 重庆大学和四川大学计算机考研,西南地区最好的4所大学, 重庆大学第三, 第一无争议, 第二最难考...
  6. 使用Serv-U搭建FTP服务器
  7. [转]LTE资源调度(7)-DRX不连续接收(1)
  8. 今天给大家分享一个N95口罩同名的
  9. nginx 二次修改https 反向代理服务器失败
  10. 必须熟练的基础linux命令