(二十四)操作系统-吸烟者问题
文章目录
- 一、问题描述
- 二、问题分析
- 1.关系分析
- 2.整理思路
- 3.设置信号量
- 三、实现
- 四、总结
一、问题描述
假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二个拥有纸、第三个拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)
二、问题分析
本质上这题也属于“生产者-消费者”问题,更详细的说应该是“可生产多种产品的单生产者-多消费者”。(如若不了解可以看文章(二十二)操作系统-生产者·消费者问题 (二十三)操作系统-多生产者·多消费者问题)
1.关系分析
找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
桌子可以抽象为容量为1的缓冲区,要互斥访问。
- 组合一:纸+胶水
- 组合二:烟草+胶水
- 组合三:烟草+纸
同步关系(从事件的角度来分析):
- 桌上有组合一→第一个抽烟者取走东西
- 桌上有组合二→第二个抽烟者取走东西
- 桌上有组合三→第三个抽烟者取走东西
- 发出完成信号→供应者将下一个组合放到桌上
2.整理思路
根据各进程的操作流程确定P、V操作的大致顺序。
PV操作顺序:“前V后p”
3.设置信号量
设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
三、实现
//缓冲区大小为1,同一时刻,四个同步信号量中至多有一个的值为1
semaphore offer1 =0; //桌上组合一的数量
semaphore offer2 =0; //桌上组合二的数量
semaphore offer3 =0; //桌上组合三的数量
semaphore finish =0; //抽烟是否完成
int i =0; //用于实现”三个抽烟者轮流抽烟”provider (){while(1){if(i==0){将组合一放桌上;v(offer1);}else if(i==1){将组合二放桌上;V(offer2);}else if(i==2){将组合三放桌上;v(offer3);}i=(i+1)%3;P(finish);
}smoker1(){while(1){P(offer1);从桌上拿走组合一;卷烟;抽掉;v(finish);
}smoker2(){while(1){P(offer2);从桌上拿走组合二;卷烟;抽掉;v(finish);
}smoker3(){while(1){P(offer3);从桌上拿走组合三;卷烟;抽掉;v(finish);
}
四、总结
吸烟者问题可以为我们解决“可以生产多个产品的单生产者”问题提供一个思路。
值得吸取的精华是:“轮流让各个吸烟者吸烟”必然需要“轮流的在桌上放上组合一、二、三”,注意体会我们是如何用一个整型变量i 实现这个“轮流”过程的。
若一个生产者要生产多种产品(或者说会引发多种前驱事件),那么各个V操作应该放在各自对应的“事件”发生之后的位置。
(二十四)操作系统-吸烟者问题相关推荐
- 异常处理程序和软件异常——Windows核心编程学习手札之二十四
异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...
- [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...
- 真三国无双8二十四项修改器风灵月影版
点击下载来源:真三国无双8二十四项修改器风灵月影版 真三国无双8修改器风灵月影顾名思义,就是由风灵月影大神专门为<真三国无双8(Dynasty Warriors 8)>量身打造的一款游戏辅 ...
- 计算机网络(二十四)UDP及TCP首部的格式
计算机网络(二十四)UDP及TCP首部的格式 UDP首部的格式 a.源端口号(Source Port) b.目标端口号(Destination Port) c.包长度(Length) d.校验和(Ch ...
- J2EE进阶(二十四)JBoss Web和 Tomcat的区别
J2EE进阶(二十四)JBoss Web和 Tomcat的区别 在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全球 ...
- 二十四、Struts2中的UI标签
二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...
- python 分数序列求和公式_Python分数序列求和,编程练习题实例二十四
本文是关于Python分数序列求和的应用练习,适合菜鸟练习使用,python大牛绕行哦. Python练习题问题如下: 问题简述:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13 要 ...
- 数字图像处理领域的二十四个典型算法及vc实现、第一章
数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July 二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...
- 山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将...
山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将 "我是第一次--请你,请你温柔一点--"少女一边娇喘着,一边将稚嫩的红唇紧贴在男子耳边,樱桃小嘴盈溢 ...
- CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四)
CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四) 说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇三曲 MAction 取值赋值 ...
最新文章
- Andriod TextView typeface
- 微信小店 API 手册
- Python 列表 sort() 方法
- Xamarin.iOS提供没有匹配的配置文件
- static_cast函数
- 撒花!《图解深度学习》已开源,16 章带你无障碍深度学习,高中生数学就 ok!
- 面向.NET开发人员的Dapr——状态管理
- lintcode最长回文子串(Manacher算法)
- 用自然语言教育人工智能:百度新算法发展出zero-shot学习能力
- 每日英语:6 Brainy Habits of the Wisest People
- Test2 unit2+3
- Python实现批量处理扫描特定目录
- IDEA汉化包安装和卸载
- Linux转发性能评估与优化 转发瓶颈分析与解决方案
- 不用担心JDK17收费了,Oracle 推出 JDK 8 的升级替代品
- ASCII码中10和13的含义
- 宇视200W 相机一天所占存储空间是多少
- crosswalk之瘦身秘籍
- cube station下载_cube station魔方软件下载
- poj 2955 区间dp