- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
管程的实例 TYPE SSU = MONITOR var busy : boolean; nobusy : semaphore; define require, return; use wait, signal; procedure require; begin if busy then wait(nobusy); /*调用进程加入等待队列*/ busy := ture; end; procedure return; begin busy := false; signal(nobusy); /*从等待队列中释放进程*/ end; begin /*管程变量初始化*/ busy := false; end; * 管程与进程的异同 (1)管程定义的是公用数据结构,而进程定义的是私有数据结构; (2)管程把共享变量上的同步操作集中起来,而临界区却分散在每个进程中; (3)管程是为管理共享资源而建立的,进程主要是为占有系统资源和实现系统并发性而引入的; (4)管程是被欲使用共享资源的进程所调用的,管程和调用它的进程不能并发工作,而进程之间能并发工作,并发性是其固有特性; (5)管程是语言或操作系统的成分,不必创建或撤销,而进程有生命周期,由创建而产生至撤销便消亡。 * * 条件变量 条件变量:当调用管程过程的进程无法运行时,用于阻塞进程的一种信号量。 管程内部有自己的等待机制。管程可以说明一种特殊的条件型变量: condition:x,y;实际上是一个指针,指向一个等待该条件的PCB队列。对条件型变量可执行x.wait和x.signal操作: x.wait: 若紧急等待队列不空,唤醒第一个等待者,否则释放管程使用权。执行本操作的进程进入x队列尾部; x.signal : 唤醒x队列第一个等待者。 Problem with x.signal() 使用x.signal释放等待进程时,可能出现两个进程同时停留在管程内。解决方法: 1.执行x.signal的进程等待,直到被释放进程退出管程或等待另一个条件。 2.被释放进程等待,直到执行x.signal的进程退出管程或等待另一个条件。 霍尔采用了第一种办法,汉森选择了两者的折衷,规定管程中的过程所执行的signal操作是过程体的最后一个操作。 * * 带条件变量的管程 哲学家就餐问题 定义哲学家三种状态 var state[i] of(thinking, hungry, eating) state[i]为eating的条件是{ state[(i+4) mod 5]!=eating state[(i+1) mod 5]!=eating}; state[i]为eating表示他可以拿起两只筷子就餐; 每个哲学家i的进程 dp.pickup(i); … eat … dp.putdown(i); * * Hoare管程的信号量实现 使用P和V操作原语来实现对管程中过程的互斥调用,即实现对共享资源互斥使用的管理。 (1)mutex:(初值为1) 对每个管程,使用用于管程中过程互斥调用的信号量mutex。 (2)next和next-count:(初值为0) 对每个管程,引入信号量next,凡发出signal操作的进程应该用P(next)挂起自己,直到被释放进程退出管程或产生其他等待条件。 (3)x-sem和x-count:(初值为0) 引入信号量x-sem(初值为0),申请资源得不到满足时,执行P(x-sem)挂起。由于释放资源时,需要知道是否有别的进程在等待资源,用计数器x-count(初值为0)记录等待资源的进程数。 * 外部程序F的实现 wait(mutex); … body of F; … if (next-count 0) signal(next) else signal(mutex); * x.wait和x.signal的实现 x.wait x.signal * 第五节:操作系统同步 Solaris中的同步 Solaris 2操作系统被设计成支持实时计算、多线程和多处理器。 Solaris 2提供多种临界区访问方式: 适应性互斥 较短代码段访问的数据 锁为另一个CPU线程拥有:自旋 拥有锁的线程不能很快释放锁:阻塞 条件变量 信号量 读---写锁 用于保护经常被读访问的数据 允许多个线程同时读由锁保护的对象;且实现读线程和写线程间以及写线程间的互斥访问。 十字转门 是个队列,安排等待获取适应锁和读写锁的线程 Windows 2000的并发机制 Wi
文档评论(0)