- 1、本文档共125页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 在实际中还有r方法(r-version)及自适应方法(adaptive method),以下主要讨论离散误差及 * * 在实际中还有r方法(r-version)及自适应方法(adaptive method),以下主要讨论离散误差及 * * 在实际中还有r方法(r-version)及自适应方法(adaptive method),以下主要讨论离散误差及 * * 在实际中还有r方法(r-version)及自适应方法(adaptive method),以下主要讨论离散误差及 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2.3.4 管程机制 2.管程的定义 一个管程定义了一个数据和能为并发进程执行的一组操作,这组操作能同步进程和改变管理中的数据。因此,管程是一种并发性的结构,它包括用于分配一个或一组共享资源的数据和过程,使用者使用时可忽略管程内部的实现细节,减轻了编程者负担。 管程由四部分组成: 管程的名称 局部于管程内部的共享数据结构说明 对该数据结构进行操作的一组过程 对管程内部共享数据设置初始值的语句 2.3.4 管程机制 3.条件变量 在任何时刻,最多只有一个进程在管程中执行,因此用管程很容易实现互斥,只要将需要互斥访问的资源用数据结构来描述,并将该数据结构放入管程中便可。但当一进程进入管程执行管程的某个过程时,如因某种原因而被阻塞,应立即退出该管程,否则会出现因阻挡其它进程进入管程,而它本身又无法退出管程,形成死锁。为此,系统中引入了条件变量。 条件变量的定义格式为:Var X:condition。 对条件变量只能执行以下两种操作: ① X.wait操作。 ② X.signal操作。 2.3.4 管程机制 x.wait:正在调用管程的进程因x条件需要被阻塞或挂起,则调用x.wait将自己插入到x条件的等待队列上,并释放管程,直到x条件变化。此时其它进程可以使用该管程。 x.signal:正在调用管程的进程发现x条件发生了变化,则调用x.signal,重新启动一个因x条件而阻塞或挂起的进程。如果存在多个这样的进程,则选择其中的一个,如果没有,则继续执行原进程,而不产生任何结果。这与信号量机制中的signal操作不同,因为后者总是要执行s:=s+1操作,因而总会改变信号量的状态。 2.3.4 管程机制 4.管程解决生产者—消费者问题 利用管程来解决生产者—消费者问题,首先为它们建立一个管程,命名为p_c。管程p_c中整型变量count表示缓冲池中己存放的产品数目,条件变量notfull、notempty分别对应于缓冲池不全满、缓冲池不全空两个条件。 此外,管程p_c中有两个局部过程: ①过程put:负责将产品投放到缓冲池中,当count≥n时,表示缓冲池已满,生产者进程需等待; ②过程get:负责从缓冲池中取出产品,当count≤0时,表示缓冲池已空,消费者进程需等待。 2.3.4 管程机制 管程p_c描述如下: type p_c=monitor Var in,out,count:integer; Buffer:array[0,…,n-1] of item; notfull, notempty:condition; procedure entry put(Var product:item) begin if count≥n then notfull.wait; /*不全满条件不成立*/ buffer[in]:=product; in:=(in+1)mod n; count:=count+1; notempty.signal; /*缓冲池不全空条件成立*/ end 2.3.4 管程机制 procedure entry get(Var product:item) begin if count≤
文档评论(0)