吸烟者问题

文章目录

        • 1 问题描述
        • 2 问题分析
        • 3 代码实现:

1 问题描述

假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二个拥有纸、第三个拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)
在这里插入图片描述

2 问题分析

本质上这题也属于“生产者一消费者”问题,更详细的说应该是“可生产多种产品的单生产者一多消费者”。

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。

互斥:桌子可以抽象为容量为1的缓冲区,要互斥访问。(容量1,可以不设置临界区互斥信号量)

同步:首先将每次放的两种材料看成一种组合,每种组合属于一个抽烟者

组合一纸+胶水抽烟者一
组合二烟草+纸抽烟者二
组合三烟草+胶水抽烟者三

同步关系(从事件的角度来分析):

  1. 桌上有组合一→第一个抽烟者取走东西
  2. 桌上有组合二→第二个抽烟者取走东西
  3. 桌上有组合三→第三个抽烟者取走东西
  4. 发出完成信号→供应者将下一个组合放到桌上
    PV操作顺序:“前V后P”
  1. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序

在这里插入图片描述

  1. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
semaphore offer1 = 0; //桌上组合一的数量 
semaphore offer2 = 0; //桌上组合二的数量 
semaphore offer3 = 0; //桌上组合三的数量 
semaphore finish = 0; //抽烟是否完成 
int i = 0;            //用于实现“三个抽烟者轮流抽烟”

模型建立:
在这里插入图片描述

  1. 如果是第一个抽烟者,提供者将组合一放桌上,V一下offer1,数量+1,通知smoker1
  2. 如果是第二个抽烟者,提供者将组合二放桌上,V一下offer2,数量+1,通知smoker2
  3. 如果是第三个抽烟者,提供者将组合三放桌上,V一下offer3,数量+1,通知smoker3

在这里插入图片描述

  1. 第一个抽烟者抽烟,判断桌上offer1中有无(P一下offer1),将组合一消耗,通知provider,自己抽烟完毕(V一下finish)
  2. 第二个抽烟者抽烟,判断桌上offer2中有无(P一下offer2),将组合二消耗,通知provider,自己抽烟完毕(V一下finish)
  3. 第三个抽烟者抽烟,判断桌上offer3中有无(P一下offer3),将组合三消耗,通知provider,自己抽烟完毕(V一下finish)

3 代码实现:

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操作应该放在各自对应的
“事件”发生之后的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人驾驶出租车遭警察拦截后欲“潜逃”,AI 是原罪?

整理:苏宓出品:CSDN(ID:CSDNnews)所谓开车在路上,最讨厌的有几种人,一是插自己队和不让自己插队的,二想必就是晚上开远光灯和不开灯的。在交通交规下且汽车正常行驶过程中&#xff0…

人工智能,装在罐子里

来源:学术头条作者:Rich Heimann“装在罐子里的大脑”(brain in a jar)是一项对脱离身体、生活在一罐食物中的人类大脑进行的思想实验。这个思维实验探索了人类对现实、心灵和意识的概念。本文将探讨一个反对人工智能(…

10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法

文章目录1 死锁1.1 死锁定义1.2 死锁、饥饿、死循环的区别1.3 死锁产生的必要条件1.4 什么时候会发生死锁1.5 死锁的处理策略1.6 死锁的概念小结2 死锁预防2.1 破坏互斥条件2.2 破坏不剥夺条件2.3 破坏请求和保持条件2.4 破坏循环等待条件2.5 预防死锁小结3 死锁避免3.1 安全序…

短期记忆容量必需有限

来源:CreateAMind介绍一篇论文:预测性大脑的短期记忆能力肯定是有限的短期保持信息的能力可能是人类认知的一个标志, 因为它是许多领域所需要的,如感知、行动计划和语言。没有大脑的这一核心功能,人类无法思考、推理或计算,甚至可能无法感知。尽管短期记…

读者-写者问题

文章目录1 问题描述2 问题分析3 代码实现1 问题描述 有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时…

9 操作系统第二章 进程管理 管程

文章目录1 管程1.1 为什么引入管程1.2 管程的定义和基本特征1.3 管程小结1 管程 1.1 为什么引入管程 产生原因:信号量机制存在的问题:编写程序困难、易出错 能不能设计一种机制,让程序员写程序是不需要再关注复杂的PV操作,使得代…

2021年世界科技进展100项

来源:三思派 作者:李万,钱娅妮1生命、生物、医药健康01新冠疫情1. 首次看清新冠患者体内蛋白质变化中国科学家分析出新冠肺炎死亡患者体内多器官组织样本中蛋白质分子病理全景图,相当于将医生在显微镜下看到的人体感染新冠病毒后细…

图灵奖获得者、信息安全常青树Adi Shamir:从密码学到AI对抗性样本研究|智源大会嘉宾风采...

来源:智源大会导读:RSA 算法是通信、金融产业中被广泛使用的安全基本机制,是信息时代的支柱技术。而在这个跨时代算法背后的设计者之一,正是密码学先驱 Adi Shamir。除了RSA 公钥密码算法以外,零知识证明、差分密码分析…

11 操作系统第三章 内存管理 内存的基本知识 内存管理 内存空间扩充 连续分配管理方式

文章目录1 内存概念1.1 内存作用1.2 逻辑地址VS物理地址1.3 装入的三种方式1.3.1 绝对装入1.3.2 可重定位装入1.3.3 动态重定位装入1.4 链接的三种方式1.4.1 静态链接1.4.2 装入时动态链接1.4.3 运行时动态链接1.5 内存的基础知识小结2 内存管理2.1 内存管理的任务2.2 内存保护…

Nature长文:打破AI黑盒的“持久战”

来源:大数据文摘2020年2月,随着 COVID-19在全球迅速传播且抗原检测难以获得,一些医生转向人工智能(AI)来尝试诊断病例。一些研究人员采用深度神经网络通过查看X射线和胸部计算机断层扫描(CT)扫描来快速区分患有COVID-19肺炎的人和未患肺炎的人…

12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理

文章目录1 基本分页存储管理1.1 什么是分页存储1.2 重要的数据结构——页表1.3 基本地址变换机构1.4 具有快表的地址变换机构1.4.1 什么是快表(TLB)1.4.2 引入快表后,地址的变换过程1.4.3 地址变换过程小结1.5 两级页表1.5.1 单级页表存在的问…

13 操作系统第三章 内存管理 虚拟内存 请求分页管理方式 页面置换算法 页面分配策略

文章目录1 虚拟内存1.1 传统存储管理方式的特征、缺点1.2 局部性原理1.3 虚拟内存主要特征1.4 如何实现虚拟内存技术1.5 虚拟内存的基本概念小结2 请求分页管理方式2.1 页表机制2.2 缺页中断机构2.3 地址变换机构2.4 请求分页管理方式小结3 页面置换算法3.1 最佳置换算法 OPT3.…

视觉意识的主动推理模型

来源:CreateAMind论文介绍:在这里,我们旨在通过推进全球神经元工作区的扩展(预测性全球神经元工作区(PGNW))来克服这些限制,该工作区将 GNW 的基本方面与更近期的(贝叶斯)主动推理方法相结合,以理解大脑功能。具体来说,我们提出了一个基于主动推理的视觉…

14 操作系统第四章 文件管理 文件逻辑结构 文件目录结构

文章目录1 初识文件管理1.1文件属性1.2 文件内部的数据应该怎样组织起来?1.3 文件之间应该怎样组织起来?1.4 操作系统应该向上提供哪些功能?1.5 文件应如何存放在外存?1.6 文件系统总览2 文件逻辑结构2.1 文件分类2.2 顺序文件2.3…

AlphaFold 和 AI 蛋白质折叠革命的下一步是什么

来源:ScienceAI编辑:萝卜皮十多年来,分子生物学家 Martin Beck 团队一直在努力拼凑世界上最难的拼图游戏之一:人类细胞中最大分子机器的详细模型。这种被称为核孔复合体的庞然大物控制着分子进出细胞核的流动,也就是基…

15 操作系统第四章 文件管理 文件的物理结构 文件存储空间管理

文章目录1 文件的物理结构 (文件分配方式)1.1 文件块、磁盘块1.2 文件分配方式——连续分配1.3 文件分配方式——链接分配1.3.1 链接分配——隐式链接1.3.2 链接分配——显式链接1.3.3 链接分配(总结)1.4 文件分配方式——索引分配…

专访微软Greg Yang,构建神经网络的底层语言,探索AI的“万物理论”

来源:智源社区为了进一步解读这一工作背后的意义,智源社区采访了论文一作、微软研究院高级研究员Greg Yang(杨格)。采访中,我们不仅了解了Transfer的背景,以及项目背后更为远大的目标,也了解到了…

16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

文章目录1 文件的基本操作1.1 创建文件1.2 删除文件1.3 打开文件1.4 关闭文件1.5 读文件1.6 写文件1.7 文件基本操作小结2 文件共享2.1 基于索引结点的共享方式(硬链接)2.2 基于符号链的共享方式(软链接)2.3 文件共享小结3 文件保…

人工智能与量子计算在有前途的新忆阻器中融合

来源:ScienceAI编辑:萝卜皮近年来,计算在两个主要方面取得了进步——机器学习方面的突破,以开发通过经验自动改进的算法,以及对理论上证明比任何超级计算机更强大的量子计算机的研究。现在,科学家们已经创建…

17 操作系统第四章 磁盘管理 磁盘的结构 磁盘调度算法 减少磁盘延迟时间的方法

文章目录1 磁盘的结构1.1 磁盘、磁道、扇区1.2 磁盘如何读取数据1.4 盘面、柱面、磁盘的物理地址1.5 磁盘的分类1.6 磁盘的结构小结2 磁盘调度算法2.1 一次磁盘读/写操作需要的时间2.2 先来先服务算法(FCFS)2.3 最短寻找时间优先(SSTF&#x…