- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6.*/14 操作系统 ?* 操作系统 1、用P.V操作解决下面的同步问题 get copy put f s t g 要解决的同步问题: 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 2 2 (1,2… ) 2,3,4,...,m 1 1 (1… ) 1,2,3,4,...,m (… ) 练习: 操作系统 (同步)信号量:{实际上也起到互斥作用} 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 操作系统 正常行车 到站停车 开车 售票 开车门 关车门 司机 售票员 2、重新研究司机和售票员问题,分别写出司机和售票员进程,从而实现该问题的同步 操作系统 司机进程: 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 操作系统 司机进程: Begin Repeat P(door); 行驶; … 停车; V(stop); Until false; End 乘务员进程: Begin Repeat P(stop); 开门; 关门; V(door); 售票; Until false; End Var door,stop : semaphore:1,0 操作系统 3、桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。 分析: 本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。 当盘子为空时,爸爸可将一个水果放入果盘中。 若放入果盘中的是桔子,则允许儿子吃,女儿必须等待; 若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。 本题实际上是生产者-消费者问题的一种变形: 这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品 操作系统 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); 吃桔子; } } 操作系统 分析问题中涉及的进程; 分析问题中的同步关系(竞争,合作); (其中,合作关系的解决也是通过转化为对资源的竞
文档评论(0)