文章目录

  • 一、问题描述
  • 二、问题分析
    • 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操作应该放在各自对应的“事件”发生之后的位置。

(二十四)操作系统-吸烟者问题相关推荐

  1. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  2. [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. 真三国无双8二十四项修改器风灵月影版

    点击下载来源:真三国无双8二十四项修改器风灵月影版 真三国无双8修改器风灵月影顾名思义,就是由风灵月影大神专门为<真三国无双8(Dynasty Warriors 8)>量身打造的一款游戏辅 ...

  4. 计算机网络(二十四)UDP及TCP首部的格式

    计算机网络(二十四)UDP及TCP首部的格式 UDP首部的格式 a.源端口号(Source Port) b.目标端口号(Destination Port) c.包长度(Length) d.校验和(Ch ...

  5. J2EE进阶(二十四)JBoss Web和 Tomcat的区别

    J2EE进阶(二十四)JBoss Web和 Tomcat的区别 在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全球 ...

  6. 二十四、Struts2中的UI标签

    二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...

  7. python 分数序列求和公式_Python分数序列求和,编程练习题实例二十四

    本文是关于Python分数序列求和的应用练习,适合菜鸟练习使用,python大牛绕行哦. Python练习题问题如下: 问题简述:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13 要 ...

  8. 数字图像处理领域的二十四个典型算法及vc实现、第一章

    数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July   二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...

  9. 山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将...

    山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将 "我是第一次--请你,请你温柔一点--"少女一边娇喘着,一边将稚嫩的红唇紧贴在男子耳边,樱桃小嘴盈溢 ...

  10. CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四)

    CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四) 说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇三曲 MAction 取值赋值 ...

最新文章

  1. Andriod TextView typeface
  2. 微信小店 API 手册
  3. Python 列表 sort() 方法
  4. Xamarin.iOS提供没有匹配的配置文件
  5. static_cast函数
  6. 撒花!《图解深度学习》已开源,16 章带你无障碍深度学习,高中生数学就 ok!
  7. 面向.NET开发人员的Dapr——状态管理
  8. lintcode最长回文子串(Manacher算法)
  9. 用自然语言教育人工智能:百度新算法发展出zero-shot学习能力
  10. 每日英语:6 Brainy Habits of the Wisest People
  11. Test2 unit2+3
  12. Python实现批量处理扫描特定目录
  13. IDEA汉化包安装和卸载
  14. Linux转发性能评估与优化 转发瓶颈分析与解决方案
  15. 不用担心JDK17收费了,Oracle 推出 JDK 8 的升级替代品
  16. ASCII码中10和13的含义
  17. 宇视200W 相机一天所占存储空间是多少
  18. crosswalk之瘦身秘籍
  19. cube station下载_cube station魔方软件下载
  20. poj 2955 区间dp

热门文章

  1. 彩云小译怎么翻译网页_彩云小译怎么使用 彩云小译使用方法介绍
  2. usb high speed chirp
  3. FatFs 常用 API 详细记录
  4. 新浪云计算平台注册和使用
  5. 训练宝典,科学训练,稳定进步
  6. SpreadJS 纯前端表格控件应用案例:物业行业全面预算管理系统
  7. 初学JavaWeb需要知道的目录结构与配置
  8. SVN服务端客户端安装配置及权限管理
  9. linux下 svn服务器搭建及使用
  10. wps里为什么没有华文楷体_周末话题 | 大学里为什么没有人喜欢你?