经典PV操作问题 [转]
1. 睡眠理发师问题
理发店里有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅上睡觉,如图2-20所示。当一个顾客到来时,他必须先叫醒理发师,如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他们就坐下来等。如果没有空椅子,他就离开。这里的问题是为理发师和顾客各编写一段程序来描述他们的行为,要求不能带有竞争条件。
我们的解法使用三个信号量:customers,用来记录等候理发的顾客数(不包括正在理发的顾客);barbers,记录正在等候顾客的理发师数,为0或1;mutex,用于互斥。我们还需要一个变量waiting,它也用于记录等候的顾客数,实际上是customers的一份拷贝。之所以使用waiting是因为无法读取信号量的当前值。在该解法中,进入理发店的顾客必须先看等候的顾客数,如果少于椅子数,他留下来等,否则他就离开。
我们的解法示于图2-21。
1 # define CHAIRS 5 /*为等待的顾客准备的椅子数*/ 2 3 typedef int semaphone ; /*运用你的想象力*/ 4 semaphore customers=0; /*等待服务的顾客数*/ 5 semaphore barbers=0; /*等待顾客的理发师数*/ //[转者注:初值为0] 6 semaphore mutex=1; /*用于互斥*/ 7 int waiting=0; /*等待的顾客(还没理发的)*/ 8 9 void barber(void) 10 { 11 while(TRUE) 12 { 13 down(customers); 14 /*如果顾客数是0,则睡眠*/ 15 down(mutex); /*要求进程等待*/ 16 waiting=waiting-1; /*等待顾客数减1*/ 17 up(barbers); 18 /*一个理发师现在开始理发了*/ 19 up(mutex); /*释放等待*/ 20 cut_hair(); /*理发(非临界区操作)*/ 21 } 22 } 23 24 void customers(void) 25 { 26 down(mutex);/*进入临界区*/ 27 if(waiting < CHAIRS) 28 {/*如果没有空椅子,就离开*/ 29 waiting = waiting + 1;/*等待顾客数加1*/ 30 up(customers); /*如果必要的话,唤醒理发师*/ 31 up(mutex); /*释放访问等待*/ 32 down(barbers);/*如果barbers为0,就入睡*/ 33 get_haircut();/*坐下等待服务*/ 34 } 35 else 36 up(mutex);/*店里人满了,走吧*/ 37 } 38
[转] http://blog.csdn.net/sarah_jieyu/article/details/6510521
经典PV操作问题 [转]相关推荐
- 【操作系统】经典PV操作题目
5个经典PV操作题(附答案) 三个进程之间的同步 pv操作的经典习题 PV操作题型整理 生产者和消费者 生产者消费者问题 当只有一个生产者和一个消费者的时候,且只有一个缓冲区 要考虑生产者和消费者两个 ...
- 【互斥同步经典PV操作】
互斥同步经典PV操作 内容来自B站王道老师计算机考研操作系统讲解 文章目录 互斥同步经典PV操作 一.单生产者和消费者 二.多生产者和多消费者 三.吸烟问题 四.读者与写者问题 总结 一.单生产者和消 ...
- 操作系统9道经典PV操作
文章目录 仓库存储 放水果 放水果2 理发师理发 吸烟者问题 面包师问题 写者优先的读者-写者问题 交通问题 共用缓冲区 仓库存储 问题描述:有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大, ...
- 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果
一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...
- 进程同步之信号量机制(pv操作)及三个经典同步问题
上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源,锁机制详细解读了下,留下了一个问题,就是锁机制只能判断临界资源是否被占用,所以他解决了互斥问题,但是他不能确定前面的 ...
- 最经典的关于PV操作的解释说明
不知道各位有没有感觉,计算机方面的考试,操作系统那块似乎PV操作经常考,这一方面说明它的重要,另一方面也说明它不容易理解,出错的人很多,下面就举几个经典的例子来帮助大家学习,也与诸位同进步. 一,PV ...
- PV操作经典例题——吃水果
例1:桌上有一个盘子,每次只能放一个水果,妈妈向盘中放苹果和橘子,儿子专等吃盘里的橘子,女儿专等吃盘里的苹果.只要盘子空,妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出他 ...
- 【操作系统】PV 操作经典例题---三个进程之间的同步
问题: 总共有 读入.执行.打印 三个进程,试用PV操作描述读入B1打印B2的同步过程. 问题解读: 这个问题就是说了这样一件事:一个输入B1,被操作之后,成为B2,将B2打印.怎样用PV操作来说这件 ...
- PV 操作经典例题---三个进程之间的同步
问题: 总共有 读入.执行.打印 三个进程,试用PV操作描述读入B1打印B2的同步过程. 问题解读: 这个问题就是说了这样一件事:一个输入B1,被操作之后,成为B2,将B2打印.怎样用PV操作来说这件 ...
最新文章
- 海口这家只收5元的理发店火了 顾客求涨价老板都不肯
- Spring Boot 日志管理
- VTK:几何对象之PlatonicSolids
- memcpy(cv::Mat.data,unsigned char *,320x240),保存数据失真问题解决方法
- Scala-Unit6-final/type关键字、样例类样例对象
- 20 位行业专家共话选型经验,CSDN「选型智囊团高端研讨会」圆满落幕!
- JavaScript中的输入输出语句
- 涉密文件检查工具_保密文件销毁咨询
- 并发 (一)——基本概念
- 服务器重装系统之DELL
- html外链视频,WordPress文章内容中插入外链视频的通用iframe方法
- JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入)
- centos oracle libaio哪下载,在CentOS4.5上安装Oracle10g出现的libaio-0.3.96; found Not found问题求救...
- 【Excel 2013 数据透视表 学习】一、创建数据透视表
- 中国铁路 12306 网站的高并发架构带来的思考?研究分析后,果然超牛逼…
- 手把手教你制作docSet文档(用于Dash或zeal)
- 计算机内部线有,电脑主机内部有几根线?分别叫什么?
- 浅谈 SAP ABAP 系统里的 ALV 输出方式实现
- Linux编程:多个子进程与父进程使用匿名管道读写
- Fiddler抓包工具使用——学习笔记(一)