进程的同步与通信.ppt

  1. 1、本文档共82页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 进程的同步与通信 3.1 进程同步的基本概念 3.2 信号量机制 3.3 经典进程同步问题 3.4 管程机制 3.5 进程通信 3.1 进程同步的基本概念 一、多道程序环境下进程间的关系 二、临界资源 三、临界区(Critical Section) 四、利用软件方法解决进程互斥问题 五、利用硬件方法解决进程互斥问题 一、多道程序环境下进程间的关系 1、资源共享关系 进程间竞争或共享系统资源 进程同步的主要任务是保证诸进程能互斥地访问临界资源 2、相互合作关系 进程之间存在着相互合作的关系 进程同步的主要任务是保证相互合作的诸进程在执行次序上的协调,不会出现与时间有关的差错。 3、进程间存在的制约关系 间接制约关系——资源共享/竞争 直接制约关系——进程合作 二、临界资源 1、临界资源:在一段时间内只允许一个进程访问的资源。 2、生产者-消费者(Producer-Consumer)问题: 1)问题描述与分析 2)进程/程序描述 3)典型的不可再现性(未作临界资源处理) 1)问题描述与分析 问题描述:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中; 消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。 分析:我们可利用一个数组来表示上述的具有n个(0,1,…,n-1)缓冲区的缓冲池。用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,输入指针加1;用一个输出指针out来指示下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,输出指针加1。 由于这里的缓冲池是组织成循环缓冲的,故应把输入指针加1表示成 in∶=(in+1)mod n;输出指针加1表示成out∶=(out+1) mod n。当(in+1) mod n=out时表示缓冲池满;而in=out则表示缓冲池空。此外,还引入了一个整型变量counter, 其初始值为0。每当生产者进程向缓冲池中投放一个产品后,使counter加1;反之,每当消费者进程从中取走一个产品时, 使counter减1。 2)进程/程序描述 生产者和消费者两进程共享下面的变量: Var n, integer; type item=…; var buffer:array[0, 1, …, n-1] of item; in, out: 0, 1, …, n-1; counter: 0, 1, …, n; 指针in和out初始化为1。在生产者和消费者进程的描述中,no-op是一条空操作指令,while condition do no-op语句表示重复的测试条件(condication),重复测试应进行到该条件变为false(假),即到该条件不成立时为止。在生产者进程中使用一局部变量nextp,用于暂时存放每次刚生产出来的产品;而在消费者进程中,则使用一个局部变量nextc,用于存放每次要消费的产品。 producer: repeat … produce an item in nextp; … while counter=n do no-op; buffer[in]:=nextp; in:=in+1 mod n; counter:=counter+1; until false; consumer: repeat while counter=0 do no-op; nextc:=buffer[out]; out:=(out+1) mod n; counter:=counter-1; consumer the item in nextc; until false; 3)典型的不可再现性 虽然上面的生产者程序和消费者程序,在分别看时都是正确的,而且两者在顺序执行时其结果也会是正确的,但若并发执行时,就会出现差错,问题就在于这两个进程共享变量counter。生产者对它做加1操作,消费者对它做减1操作,这两个操作在用机器语言实现时,常可用右面的形式描述: 假设:counter的当前值是5。如果生产者进程先执行左列的三条机器语言语句,然后消费者进程再执行右列的三条语句, 则最后共享变量counter的值仍为5;反之,如果让消费者进程先执行右列的三条语句,然后再让生产者进程执行左列的三条语句,counter值也还是5,但是,如果按右面的交叉顺序执行,正确的答案应当是5,但现在是4。(还有出现6的情况,思考) 出现了程序执行的不可再现性。 Producer: regi

您可能关注的文档

文档评论(0)

zxli + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档