




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6.1/25 * 1、用P.V操作解决下面的同步问题 getcopyput fstg 要解决的同步问题: Get不能向“满”的S中放; Copy不能从“空”的S中取;不能向“满”的T中放; Put不能从“空”的T中取 有3个进程:get, copy和put,它们对4个存储区域f、s、t和g进行操作: 其中:f有取之不尽的数据可以get;g有用之不完的空间可以put s和t则只有一个存储空间。 3,4,.,m 22 (1,2 ) 2,3,4,.,m 11(1 ) 1,2,3,4,.,m ( ) 练习: 6.2/25 * (同步)信号量:实际上也起到互斥作用 S_Empty, T_Empty, 初值为1 S_Full, T_Full; 初值为0 Get进程: Begin Repeat P(S_Empty) T_get_S(); V(S_Full); Until false; End Copy进程: Begin Repeat P(S_Full); P(T_Empty); S_copy_T( ); V(T_Full); V(S_Empty); Until false; End Put进程: Begin Repeat P(T_Full); T_put_G( ); V(T_Empty); Until false; End 6.3/25 * 正常行车 到站停车 开车 售票 开车门 关车门 司机售票员 2、重新研究司机和售票员问题,分别写出司机和售票员 进程,从而实现该问题的同步 6.4/25 * 司机进程: Begin Repeat P(S_Door); 行驶; 停车; V(S_Stop); Until false; End 乘务员进程: Begin Repeat 关门; V(S_Door); 售票; P(S_Stop); 开门; Until false; End Var S_Door,S_Stop: Semaphore:=0,0 6.5/25 * 司机进程: Begin Repeat P(door); 行驶; 停车; V(stop); Until false; End 乘务员进程: Begin Repeat P(stop); 开门; 关门; V(door); 售票; Until false; End Var door,stop : semaphore:1,0 6.6/25 * 3、桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果, 也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中 的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P 、V原语实现爸爸、儿子、女儿三个并发进程的同步。 分析: 本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。 当盘子为空时,爸爸可将一个水果放入果盘中。 若放入果盘中的是桔子,则允许儿子吃,女儿必须等待; 若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。 本题实际上是生产者-消费者问题的一种变形: 这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者 只消费其中固定的一类产品 6.7/25 * S:表示盘子是否为空,其初值为l; So:表示盘中是否有桔子,其初值为0; Sa:表示盘中是否有苹果,其初值为0。 设置三个信号量:S、So、Sa, Daughter进程: while(1) P(Sa); 从盘中取出苹果; V(S); 吃苹果; Father进程: while(1) P(S); 将水果放入盘中; if(放入的是桔子)V(So); else V(Sa); Son进程: while(1) P(So); 从盘中取出桔子; V(S); 吃桔子; 6.8/25 * 分析问题中涉及的进程; 分析问题中的同步关系(竞争,合作); (其中,合作关系的解决也是通过转化为对资源的竞争完成的。) 参照所竞争的资源设置信号量,并赋予初值; 写出各个进程的描述; 检查每个进程的描述,看是否会出现死锁现象并改正之。 小结:同步问题解法 6.9/25 * 具体的规范格式如下(以苹果桔子题目为例:) int S1; int Sa0; int So0; main() cobegin father(); /*父亲进程*/ son(); /*儿子进程*/ daughter(); /*女儿进程*/ coend 解:设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号 量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值 为0。同步描述如下: father( ) while(1) P(S); 将水果放入盘中; if(放入的是桔子)V(So); else V(Sa); son( ) while(1) P(So); 从盘中取出桔子; V(S); 吃桔子; daughter( ) while(1) P(Sa); 从盘中取出苹果; V(S); 吃苹果; 6.10/25 * 作业:睡眠理发师问题 6.11/25 * 作业:睡眠理发师问题 问题描述 (经典理发师问题) 假设后街有家理发店,店里有一个理发师、一把理发椅和n把等 候理发的顾客椅子。 (1).如果没有顾客则理发师便在理发椅上睡觉(看报纸); (2).当有一个顾客到达时,首先查看理发师在干什么,如果 在睡觉(看报纸)则告诉理发师理发,然后坐到理发椅上开始 理发;如果理发师正在理发,则查看是否有空的椅子可坐,如 果有,他就坐下等待,如果没有,则离开; (3).理发师为一位顾客理完发后,查看是否有人等待,如有 则唤醒一位为其理发,如没有则在理发椅上睡觉(看报纸); (4).顾客不分优先级 6.12/25 * 作业:睡眠理发师问题 问题分析 题目中要求描述理发师和顾客的行为,因此需要两类 进程Barber ()和Customer()分别描述理发师和顾客的行为。当 理发师看报时顾客近来需要唤醒理发师为其理发,当有顾客时 理发师为其理发,没有的时候理发师看报,因此理发师和顾客 之间是同步的关系,由于每次理发师只能为一个人理发,且可 供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以 顾客之间是互斥的关系。故引入3个信号量和一个控制变量:1) 控制变量waiting用来记录等候理发的顾客数,初值均为0;2) 信号量customers用来记录等候理发的顾客数,并用作阻塞理发 师进程,初值为0;3)信号量barbers用来记录正在等候顾客的 理发师数,并用作阻塞顾客进程,初值为0;4)信号量mutex用 于互斥,初值为1 6.13/25 * 作业:睡眠理发师问题 问题实现 PV操作代码如下: int waiting=0 ; /等候理发的顾客数 int chairs=n; /为顾客准备 的椅子数 semaphore customers=0, barbers=0,mutex=1; barber() while(TRUE); /理完一人,还有顾客吗? P(cutomers); /若无顾客,理发师睡眠 P(mutex); /进程互斥 waiting := waiting 1; /等候顾 客数少一个 V(barbers); /理发师去为 一个顾客理发 V(mutex); /开放临界 区 cut-hair( ); /正在理发 6.14/25 * 作业:睡眠理发师问题 问题实现(接上页) customer() P(mutex); /进程互斥 if (waiting) waiting := waiting+1; / 等候顾客数加1 V(customers); /必要的话唤醒理发师 V(mutex); /开放临界区 P(barbers); /无理发师, 顾客坐着养神 get-haircut( ); /一个顾客坐下等理/ else V(mutex); /人满了,走吧! 6.15/25 * 理发师问题: 一个理发店有一个入口和一个出口。 理发店内有一个可站5 位顾客的站席区、4 个单人沙发、3 个理发师及其 专用理发工具、一个收银台。 新来的顾客坐在沙发上等待;没有空沙发时,可在站席区等待;站席区 满时,只能在入口外等待。理发师可从事理发、收银和休息三种活动。 理发店的活动满足下列条件: 1)休息的理发师是坐地自己专用的理发椅上,不会占用顾客的沙发 ; 2)处理休息状态的理发师可为在沙发上等待时间最长的顾客理发; 3)理发时间长短由理发师决定; 4)在站席区等待时间最长的顾客可坐到空闲的理发上; 5)任何时刻最多只能有一个理发师在收银。 试用信号量机制或管程机制实现理发师进程和顾客进程。 。 6.16/25 * 原理: (1)customer 进程: 首先检查站席区是否已满(stand_capacity),若满 选择离开,否则进入站席区,即进入理发店。在站席 区等待沙发的空位(信号量sofa),如果沙发已满,则 进入阻塞等待队列,直到出现空位,在站席区中等待 时间最长的顾客离开站席区(stand_capacity)。坐到 沙发上,等待理发椅(barber_chair),如果理发椅已满, 则进入阻塞等待队列,直到出现空位,在沙发上等待 时间最长的顾客离开沙发(释放信号量sofa)。坐到理 发椅上,释放准备好的信号(customer_ready),获得 该理发师的编号(01 的数字)。等待理发师理发结 束(finishedbarber_number)。在离开理发椅之前付 款(payment),等待收据(receipt),离开理发椅( leave_barberchair)。最后离开理发店。 6.17/25 * 这里需要注意几点: a) 首先是几个需要进行互斥处理的地方,主要包括:进入站席区、进 入沙发、进入理发椅和付款几个地方。 b) 通过barber_chair 保证一个理发椅上最多只有一名顾客。但这也不 够,因为单凭baber_chair 无法保证一名顾客离开理发椅之前,另一位顾 客不会坐到该理发椅上,因此增加信号量leave_barberchair,让顾客离开 理发椅后,释放该信号,而理发师接收到该信号后才释放barber_chair 等 待下一位顾客。 c) 在理发的过程中,需要保证是自己理发完毕,才能够进行下面的 付款、离开理发椅的活动。这个机制是通过customer 进程获得给他理发 的理发师编号来实现的,这样,当该编号的理发师释放对应的finishedi 信号的时候,该顾客才理发完毕。 d) 理发师是通过mutex 信号量保证他们每个人同时只进行一项操作 (理发或者收款)。 e) 为了保证该顾客理发完毕后马上可以付款离开,就应该保证给该 顾客理发的理发师在理 发完毕后马上到收银台进入收款操作而不是给下一位顾客服务。在 伪码中由以下机制实现:即顾客在释放离开理发椅的信号前,发出付款 的信号。这样该理发师得不到顾客的离开理发椅的信号,不能进入下一 个循环为下一名顾客服务,而只能进入收款台的收款操作。直到顾客接 到收据后,才释放离开理发椅的信号,离开理发椅,让理发师释放该理 发椅的信号,让下一位等待的顾客坐到理发椅上。 6.18/25 * (2)barber 进程 首先将该理发师的编号压入队列,供顾客 提取。等待顾客坐到理发椅坐好(信号量 customer_ready),开始理发,理发结束后释放 结束信号(finishedi)。等待顾客离开理发椅 (leave_barberchair)(期间去收银台进行收款 活动),释放理发椅空闲信号(barber_chair), 等待下一位顾客坐上来。 (3)cash(收银台)进程 等待顾客付款(payment),执行收款操作,收 款操作结束,给付收据(receipt)。 6.19/25 * 信号量总表: 信号量 wait signal stand_capacity 顾客等待进入理发店 顾客离开站席区 sofa 顾客等待坐到沙发 顾客离开沙发 barber_chair 顾客等待空理发椅 理发师释放空理发椅 customer_ready 理发师等待,直到一个顾客坐到理发椅顾客 坐到理发椅上,给理发师发出信号mutex 等待理发师空闲,执行 理发或收款操作理发师执行理发或收款结束,进入空闲状态 mutex1 执行入队或出队等待 入队或出队结束,释放信号 finishedi 顾客等待对应编号理发师理发结束;理发师理发结束, 释放信号leave_barberchair 理发师等待顾客离开理发椅 顾客付款 完毕得到收据,离开理发椅释放信号payment 收银员等待顾客付 款 顾客付款,发出信号receipt 顾客等待收银员收、开具收据收银 员收款结束、开具收据,释放信号 6.20/25 * 伪码: semaphore stand_capacity=5; semaphore sofa=4; semaphore barber_chair=3; semaphore customer_ready=0; semaphore mutex=3; semaphore mutex1=1; semaphore finished3=0,0,0; semaphore leave_barberchair=0; semaphore payment=0; semaphore receipt=0; 6.21/25 * void customer() int barber_number; wait(stand_capacity); /等待进入理发店 enter_room(); /进入理发店 wait(sofa); /等待沙发 leave_stand_section(); /离开站席区 signal(stand_capacity); sit_on_sofa(); /坐在沙发上 wait(barber_chair); /等待理发椅 get_up_sofa(); /离开沙发 signal(sofa); 6.22/25 * wait(mutex1); sit_on_barberchair(); /坐到理发椅上 signal(customer_ready); barber_number=dequeue(); /得到理发师编号 signal(mutex1); wait(finishedbarber_number); /等待理发结束 pay(); /付款 signal(payment); /付款 wait(receipt); /等待收据 get_up_barberchair(); /离开理发椅 signal(leave_barberchair); /发出离开理发椅信号 exit_shop(); /了离开理发店 6.23/25 * void barber(int i) while(true) wait(mutex1); enqueue(i); /将该理发师的编号加入队列 signal(mutex1); wait(customer_ready); /等待顾客准备好 wait(mutex); cut_hair(); /理发 signal(mutex); signal(finishedi); /理发结束 wait(leave_barberchair); /等待顾客离开理发椅信号 signal(barber_chair); /释放barber_chair 信号 6.24/25 * void cash() /收银 while(true) wait(payment);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 分红权转让合同范本
- 旧房整栋出售合同范本
- wenhua公司合伙合同范本
- 卖家卖货合同范本模板
- 大理租院子合同范本
- 汽车抵款合同范本
- 提供租赁合同范本
- 煤气安装服务合同范本
- 过度安置房合同范本
- 文化墙彩绘合同范本
- 舆情安全管理办法
- 替换车管理办法规定
- 临床营养学病例报告
- 危险作业票 安全作业票格式模板 动火登高煤气受限空间作业票
- 水电工安全考试题及答案
- 2025至2030临床前CRO治疗行业发展趋势分析与未来投资战略咨询研究报告
- 2025年浙江省中考数学试卷真题(含官方标准答案)
- 幼儿园物资报损管理制度
- 酒精戒断综合症治疗方案讲课件
- 【9语安徽中考卷】2025年安徽省中考招生考试真题语文试卷(真题+答案)
- 工程造价培训用课件
评论
0/150
提交评论