进程管理之管程机制与进程通信.docVIP

  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文档。上传文档
查看更多
进程管理之管程机制与进程通信

第六讲 进程管理之管程机制与进程通信 管程机制 概念的引入 为什么引入管程? 信号量机制可以方便的解决进程间的互斥和同步。但是也有一些问题,首先,每个进程中又加入了大量的P、V操作,使得系统的管理更复杂,总体是乱。再者会有同步操作不当而导致死锁现象。为了解决这些问题,引入了管程。 解决方案的提出――管程 1971年Dijkstra提出,为每个共享资源设立一个“秘书”来管理对它的访问。一切来访者都要通过秘书,而秘书每次仅允许一个来访者(进程)来访问共享资源。 1973年,Hoare和Hanson所提出;其基本思想是把信号量及其操作原语封装在一个对象内部。即:将共享变量以及对共享变量能够进行的所有操作集中在一个模块中。 基本思想: 就是上面 管程的基本概念 管程定义: 定义:一个数据结构和在该数据结构上能被并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。 怎么理解呢?首先数据结构和其上的一组操作都是用来描述这个共享资源的,可以是硬件也可以是软件资源。那么这一组操作是什么呢?这个操作是可以被并发进程执行的,其实就是把对共享资源的操作,也就是分配,回收,阻塞,唤醒等操作集中起来形成这么一个操作。如下图,同学们看课本的图就行 说明:整个这个圆形就是管程。 管程语法: Type monitor-name=monitor Variable declaration //变量声明 Procedure entry P1(…) Begin …. End ; Procedure entry P2(…) Begin …. End ; …… Procedure entry Pn(…) Begin …. End ; Begin 初始化; End 条件变量 由于管程通常是用于管理资源的,因而在管程内部,应当存在某种等待机制。当进入管程的进程因资源被占用等原因不能继续运行时使其等待。为此在管程内部可以说明和使用一种特殊类型的变量----条件变量。每个表示一种等待原因,并不取具体数值--相当于每个原因对应一个队列。因此在P,V操作前,引入条件变量加以说明。 (1)条件变量的定义格式 Var x,y: condition (2)对条件变量执行的两种操作 Wait操作 阻塞 如x.wait用来将执行进程挂到与条件变量x相应的等待队列上。 Signal操作 唤醒 如x.signal用来唤醒与条件变量x相应的等待队列上的一个进程。 管程机制解决生产者-消费者问题 建立Producer-consumer(PC)管程 Type producer-consumer=monitor var in,out,count:integer; //count计数器,指示空缓冲区个数。In,out是缓冲区指针 buffer:array[0,…,n-1] of item; //缓冲区共享变量,表示缓冲区。 notfull,notempty:condition; //条件变量, put(item); //在缓冲区内放产品操作 get(item); //从缓冲区内拿产品操作 begin in:=out:=0; //初始化代码 count:=0; end 说明: put(item)过程 生产者利用此过程将自已的消息放到缓冲池中,若发现缓冲已满(countn),则等待。否则,放一个产品并唤醒一个消费者进程。 Get(item)过程 消费者利用此过程将缓冲池中的消息取走,若发现缓冲已空(count0),则等待。否则,拿走一个产品,并唤醒一个生产者进程。 Procedure entry put(item) begin if countn then notfull.wait; //因为缓冲区满而等待 buffer(in):=nextp; //在in所指示的缓冲区放一个产品 in:=(in+1) mod n; //放入缓冲区指针加1,防止溢出要对n求模 count:=count+1; //计数器加1 if notempty.queue then notempty.signal; //因为缓冲区空而等待的队列,唤醒一个进程 end 说明:因为缓冲区满而等待的进程是生产者进程,因为缓冲区空而等待的进程是消费者进程。现在就好理解了。 Procedure entry get(item) begin if

文档评论(0)

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

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

1亿VIP精品文档

相关文档