[操作系统]管程解决方案.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
管程(monitor) 参看P51 OS设计中引入了信号量以后,互斥实现起来似乎很容易,果真是这样吗? 答案是否定的! 在生产者~消费者问题中,曾提到:wait(mutex)、wait(empty)两个语句不能对调,否则系统死锁。 说明系统的编制人员使用信号量时要特别小心。 很小的错误将产生极大的麻烦。 因为出现的错误与资源竞争、死锁、不可预测、不可再现有关。 1、问题提出 用信号量机制编制并发程序,对共享变量、信号量的操作(同步、互斥)被分散在各个进程中。缺点: 易读性差:因为要了解对一组变量及信号量的操作,需要读懂全部并发的程序。 难以修改和维护:对一组变量和代码的修改,必须对使用它的全部程序进行修改(因为同步、互斥分散在所有相关并发程序中。 正确性难以保证:OS通常很复杂,同步、互斥过于分散,很难保证逻辑上的正确性。 既然分散的同步操作有缺点,人们就想到把同步机制集中到一个模块中,这就是早期(1971)的秘书进程思想。 Dijkstra(1971):提出“秘书”进程的思想。 Hansen和Hoare(1973):推广为“管程”。 2. 管程的引入 管程:一种同步机制,是编程的构件。 管程定义: 3、管程的结构和特性 管程有四部分组成 ① 名称:为每个共享资源设立一个管程 ② 数据结构说明:一组局部管程的控制变量 ③ 操作原语: 对控制变量和临界资源进行操作 的一组原语,是访问该管程的唯一途径。这些原语本身是互斥的,任一时刻只允许一个进程去调用,其余需要访问的进程就等待。 ④ 初始化代码:对控制变量进行初始化的代码 例如,X代表某临界资源,变量busy表示X的状态:忙、或闲。定义一个条件变量nonbusy(等待条件不忙) 。当进入管程的进程R/W该资源时,发现资源X的状态为忙(busy为“忙”),则该进程: 进入等待该资源的阻塞队列→或称之进入X的等待条件不忙队列→或称之进入nonbusy条件队列。并释放管程的互斥权。 当进入管程的另一进程释放与某条件变量相关的资源时,应该唤醒在该条件上等待的一个进程。 5、多个进程出现在管程中 当一个进入管程的进程执行唤醒操作时(如P唤醒Q),管程中便存在两个同时处于活动状态的进程。 1) 处理方法有三种: 当P唤醒Q时 ① P等待Q继续,直到Q退出或等待;(Hoare方法); ② Q等待P继续,直到P等待或退出;(Hansan方法 ); 2)多个进程出现在管程中 如果进程P唤醒进程Q,则P等待Q继续; 如果进程Q在执行又唤醒进程R,则Q等待R续;…… 这时,在管程内部,由于执行唤醒操作,可能会出现多个等待进程,这些等待的进程进入紧急等待队列。 紧急等待队列优先级高于入口等待队列的优先级。 6、条件变量上的wait、signal操作 条件变量的定义: Var 变量1, 变量2, … ,变量n : condition 对条件变量可执行wait和signal操作。对于条件变量y : y. wait将自己阻塞在y条件队列中; y . Signal可以将y队列中的一个进程唤醒。 例,某资源多进程共享,每次只能一个进程访问。 资源状态:用变量busy表示, 取值T、F 定义一个条件变量:nonbusy 一个进程申请使用资源: If busy then nonbusy.wait 另一个进程释放该资源: nonbusy.signal唤醒一个等不忙条件的进程。 *** 对条件变量操作进一步说明 7、利用管程解决“生产者/消费者”问题 定义管程名:PC 共享的数据结构: 环形缓冲buffer ,大小为n 条件变量 notfull、notempty 环形缓冲区中产品计数:count 设两个过程:put(item)、get(item) Producer调用→PC. put(item) →生产的产品送缓冲区 consumer调用→PC. get(item) →从缓冲区取一个产品 进入管程的Producer如果发现缓冲区满:count≧n →执行notfull.wait把自己阻塞入等待不满条件队列。 进入管程的consumer如果发现缓冲区空:count≤0→执行notempty.wait把自己阻塞入等待不空条件队列。 type pc= moniter Var in,out , count :integer; buffer:array [0,…,n-1] of item; (有界缓冲区) notempty,notfull:Condition;(不空、不满两个条件) procedure entry put(item) begin if C

文档评论(0)

w5544434 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档