- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4章 进程的同步与通信 进程的同步(synchronism)问题,是操作系统的关键问题之一,这个问题解决不好,就有可能导致同一程序运行结果不确定这种不能容忍的错误,关系到操作系统的成败,因此必须认真解决。通信(communication),指的是处于同一系统的进程之间的信息交换,它也是操作息统必不可少的功能之一。这两个内容有一定的联系,因为从某种意义上讲,同步也是进程间的一种通信,故这两个内容放在同一章讲述。 4.1. 互斥与同步的基本概念 互斥与同步是同一问题的两个侧面,同步,最基本的含义是相互协调,步伐一致,从这个意义上讲,互斥也是一种同步。 互斥(mutual exclusion):所谓互斥指的是多个进程之间相互排斥地使用临界资源(CR:Critical Resource)这样一种相互制约关系。而临界资源,就是一次只允许一个进程使用的资源,也就是说,在一个进程未使用完之前,另一个进程不得开始使用。输入机、打印机、磁带机等,是“硬”临界资源的例子;而多个进程共用的数据、表格、队列等则是“软”临界资源的例子。这些资源为什么要互斥使用呢?因为不互斥使用就会出现错误。譬如说打印机,如果不互斥使用,则有可能将两个或多个进程的结果打在同一张纸上,如何区分呢! 再看书上P55-56经典的关于软临介资源也必须互斥使用的例子。 临界区和同类临介区 在上面的举例中,涉及到临界区(CS:Critical Section)和同类临界区的概念。临界区是使用临界资源的程序段,而同类临界区是涉及到同一个临界资源的若干个程序段。同类临界区,作为程序不一定是相同的,作为进程程序的一部分也不一定属于同一进程。有了同类临界区的概念后,在实践上互斥使用临界资源的方法是:多个进程之间互斥地进入各自的同类临界区。 同步(Synchronism) 如上所说,一般意义上的同步,指的是相互协调、步伐一致的关系。这里所说的进程之间的同步,包含有两层意思,一是指有协作关系的若干个进程要协调它们之间的相对速度,二是指有数据相关的若干个进程要正确地确定它们之间的执行顺序。对第一种同步,看书上P56的举例。 4.2 解互斥问题的算法 解互斥问题的算法,就是进程之间互斥地进入的同类临界区的算法。正确的解互斥问题的算法要符合以下五条准则: (1) 空闲让进; (2) 忙则等待; (3) 有限等待; (4) 让权等待; (5) 驻留有限。 在这五条里面,最重要的是两条,就是”空闲让进”和”互斥进入”,其它的准则可以由其它机制来实现。 算法表示的约定 首先,用如下所示的方式表示两(多)进程的并发执行: void main() { 公共变量说明; cobegin p0(); p1(); coend } } 接上屏 其次,用如下的方式表示一个进程进入和退出 自己的临介区: void p(int i) { while(true) { entry code critical section; exit code non-critical section; } } 错误的和正确的算法 下面给出四个解互斥问题的算法,其中前三个是有这样那样缺陷的,是不完全正确的,第四个是正确的算法。通过这些算法,可以使我们了解人们探索正确算法的过程,也可以在比较中知道错误的为什么错误,正确的为什么正确,以加深对这些算法的理解。不失一般性,这些算法只考虑两个进程(Pi,Pj)的情况,它们很容易推广到多个进程的环境下。 算法1 void p(int i) { while (true) { while (turn!=i){ }; critical section ; turn=j ; non-critical section; } } 该算法的问题是:空闲不让进。例如,当turn=i 时,Pi不想进,这时临介区是空闲的,但Pj不能进。问题就在于,turn值的修改是在进入临介区之后进行。 算法2 void p(int i) { while (true) { while (flag[j]) { }; flag[i]
文档评论(0)