- 1、本文档共170页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.6.1 读者优先 写进程非常简单,信号量wsem用于实施互斥,只要一个写进程正在访问共享数据区,其他的写进程和读进程就都不能访问它。读进程也使用wsem实施互斥,但为了允许多个读进程,当没有读进程正在读时,第一个试图读的读进程需要在wsem上等待。当至少已经有一个读进程在读时,随后的读进程无须等待,可以直接进入。全局变量readcount用于记录读进程的数目,信号量x用于确保readcount被正确地更新。 5.6.2 写者优先 在前面的解决方案中,读进程具有优先权。当一个读进程开始访问数据区时,只要至少有一个读进程正在读,就为读进程保留对这个数据区的控制权,因此,写进程有可能处于饥饿状态。 5.6.2 写者优先 在前面的解决方案中,读进程具有优先权。当一个读进程开始访问数据区时,只要至少有一个读进程正在读,就为读进程保留对这个数据区的控制权,因此,写进程有可能处于饥饿状态。 图5-22给出了另一种解决方案,它保证当一个写进程声明想写时,不允许新的读进程访问该数据区。 图5-22 使用信号量解决读者/写者 问题的一种方法:写者优先 5.6.2 写者优先 对于写进程,在已有定义的基础上还必须增加下列信号量和变量: 信号量rsem:当至少有一个写进程准备访问数据区时,用于禁止所有的读进程。 变量writecount:控制rsem的设置。 信号量y:控制writecount的更新。 对于读进程,还需要一个额外的信号量。在rsem上不允许建造长队列,否则写进程将不能跳过这个队列,因此,只允许一个读进程在rsem上排队,而所有其他读进程在等待rsem之前,在信号量z上排队。表5-5概括了这些可能性。 表5-5 图5-22所示程序中的进程队列状态 5.6.2 写者优先 图5-23给出了另一种可选的解决方案,它赋予写进程优先权,并通过消息传递来实现。在这种情况下,有一个访问共享数据区的控制进程,其他想访问这个数据区的进程给控制进程发送请求消息,如果同意访问,则会收到一个应答消息“OK”,并且通过一个“finished”消息表示访问完成。控制进程备有三个信箱,每个信箱存放一种它可能接收到的消息。 图5-23 使用消息传递解决读者/写者问题的一种方法 5.6.2 写者优先 为了赋予写进程优先权,控制进程先服务于写请求消息,后服务于读请求消息。此外,必须实施互斥,为实现这一点,需要使用变量count,它被初始化为一个大于可能的读进程数的最大值。在这个例子中,我们取值为100。控制器的动作可总结如下: 如果count 0,则无读进程正在等待,可能有也可能没有活跃的读进程。为清除活跃读进程,首先服务于所有“finished”消息,然后服务于写请求,再服务于读请求。 如果count = 0,则唯一未解决的请求是写请求。允许这个写进程继续执行并等待一个“finished”消息。 5.6.2 写者优先 如果count 0,则一个写进程已经发出了一条请求,并且正在等待消除所有活跃的读进程。因此,只有“finished”消息将得到服务。 Thanks! 5.4.2 使用通知和广播的管程 在Hoare管程中,每个信号传达1级条件,同时也携带了一个隐含消息,“我现在有足够的空闲字节,能够满足特定的分配请求”,因此,该信号隐式携带2级条件。如果后来程序员改变了2级条件的定义,则需要重新编写所有发信号的进程;如果程序员改变了对任何特定等待进程的假设(也就是说,等待一个稍微不同的2级不变量),则可能需要重新编写所有发信号的进程。这样就不是模块化的结构,并且当代码被修改后可能会引发同步错误(如被错误条件唤醒)。 5.4.2 使用通知和广播的管程 每当对2级条件做很小的改动时,程序员必须记得去修改所有的进程。而对于Lampson/Redell管程,一次广播可以确保1级条件并携带2级条件的线索,每个进程将自己检查2级条件。不论是等待者还是发信号者对2级条件进行了改动,由于每个过程都会检查自己的2级条件,故不会产生错误的唤醒。因此,2级条件可以隐藏在每个过程中。而对Hoare管程,2级条件必须由等待者带到每个发信号的进程的代码中,这违反了数据抽象和进程间的模块化原理。 5.5 消息传递 进程交互时,必须满足两个基本要求:同步和通信。为实施互斥,进程间需要同步;为了合作,进程间需要交换信息。提供这些功能的一种方法是消息传递。消息传递还可在分布式系统、共享内存的多处理器系统和单处理器系统中实现。 5.5 消息传递 消息传递系统可以有多种形式,这里给出关于这类系统典型特征的一般介绍。消息传递的实际功能以一对原语的形式提供: send(destination, message) receive(source, message) 这是进程间进行消息
文档评论(0)