- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
P.V操作讨论 1) 信号量的物理含义: S0表示有S个资源可用 S=0表示无资源可用 S0则| S |表示S等待队列中的进程个数 P(S):表示申请一个资源 V(S)表示释放一个资源。信号量的初值应该大于等于0 2) P.V操作必须成对出现,有一个P操作就一定有一个V操作 当为互斥操作时,它们同处于同一进程 当为同步操作时,则不在同一进程中出现 如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要,一个同步P操作与一个互斥P操作在一起时同步P操作在互斥P操作前 而两个V操作无关紧要 3)P.V操作的优缺点 优点: 简单,而且表达能力强(用P.V操作可解决任何同步互斥问题) 缺点: 不够安全;P.V操作使用不当会出现死锁;遇到复杂同步互斥问题时实现复杂 【思考题】 1.用P.V操作解决下图之同步问题: Var s1,s2:semaphore; /*s1表示缓冲区是否可用; s2表示缓冲区有无可供打印的数*/ s1:=1;s2:=0; Porcess 计算进程 Pc Begin repeat P(s1); 计算下一数据并放入缓冲区; V(s2); until false; End. Process 打印进程 Pp Begin repeat P(s2); 从缓冲区中取数; v(s1); 打印数据; untill false; End. 用P.V操作解决司机与售票员的问题 同步关系:司机到站停车后,售票员才能开门;售票员关好车门后,司机才能启动汽车 设初始状态为停车,车门开着。 close 表示门是否已关,是否允许启动车辆 stop 表示是否到站停车,是否允许开车门 Var close,stop:semaphore:=0,0; Process 司机 Begin repeat P(close); 启动车辆; 正常行驶; 到站停车; V(stop); until false; End. 在一辆公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关门,当售票员关好车门后,司机才能继续开车行驶。试用P、V操作实现司机与售票员之间的同步。【北京航天航空大学2002】(注意:【哈工大 2000】、【山东科技大学 2006】) 苹果桔子问题 桌上有1空盘,允许存放1个水果。爸爸向盘中放苹果,也可以向盘中放桔子。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放1个水果供吃者取用。请用Wait()、Signal()原语实现爸爸、儿子、女儿三个并发进程的同步。【南京大学2000】 【分析】这是复杂情况的“生产者—消费者”问题,既有同步又有互斥。爸爸进程与儿子进程、女儿进程需要同步,儿子进程与女儿进程需要互斥。设置4个信号量S(盘子是否为空,初值为1)、So(盘中是否有桔子,初值为0)、Sa(盘中是否有苹果,初值为0)和mutex(用于对盘子的互斥访问,初值为1)。由于只有一个盘子(相当于只有一个buffer),对盘子的互斥访问发生在对盘子的存取操作上,S、So和Sa就可以保证对盘子的互斥操作了,故mutex也可以省略。 解:设三个信号量: S --- 盘子是否为空,初值为1; So --- 盘中是否有桔子,初值为0; Sa --- 盘中是否有苹果,初值为0; Semaphore S=1, So=0, Sa=0; Main() { Cobegin Father(); Son(); Daughter(); Coend } Father() { While(1) { Wait(S); 将水果放入盘中; If (放入的是桔子) Signal(So); Else Signal(Sa); } } 作业1:桌上有1空盘,最多可以容纳两个水果,每次只能放入或取出1个水果。爸爸专向盘中放苹果,妈妈专向盘中放桔子。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。请用Wait()、Signal()原语实现爸爸、妈妈、儿子、女儿之间
文档评论(0)