进程同步.pptVIP

  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文档。上传文档
查看更多
进程同步ppt课件

进程同步 四川大学软件学院 左劼 背景 并发(concurrent)地访问共享数据可能会引起数据不一致(inconsistency) 维护数据的一致性需要某种机制保证协作进程有序地执行 很多基于共享内存的解决方案都存在竞争条件(race condition) 有限缓冲区问题 public class BoundedBuffer { public void enter(Object item) ... public Object remove() ... private volatile int count = 0; private int in = 0; private int out = 0; private Object[] buffer = new Object[BUFFER_SIZE]; } enter()方法 public void enter(Object item) { while (count == BUFFER_SIZE) ; ++count; buffer[in] = item; in = (in + 1) % BUFFER_SIZE; } remove() Method public Object remove() { while (count == 0) ; --count; Object item = buffer[out]; out = (out + 1) % BUFFER_SIZE; return item; } 问题 当生产者和消费者并发地执行的时候,他们可能不能得到正确的结果! 例如:如果count=5,那么执行++count和--count后,count的值可能是4、5或者6! 原因: 共享变量count被两个线程并发地访问并修改了 分析 共享变量count的修改: 语句 ++count 会被实现为下面的机器代码: register1 = count register1 = register1 + 1 count = register1 语句 --count 会被实现为下面的机器代码: register2 = count register2 = register2 – 1 count = register2 注意:这里的register1和register2是本地寄存器 分析 如果生产者和消费者试图并发地更新缓冲区,那么底层的机器代码可能会交错地执行 具体如何交错,和两个进程如何被调度有关 一个例子(假设count = 5) T0 : 生产者: r1 = count (r1 = 5) T1 : 生产者: r1 = r1 + 1 (r1 = 6) T2 : 消费者: r2 = count (register2 = 5) T3 : 消费者: r2 = r2 – 1 (r2 = 4) T4 : 生产者: count = r1 (count = 6) T5 : 消费者: count = r2 (count = 4) 于是 count = 4 如果交换 T4 和 T5,那么 count = 6 但是,正确的结果应该是 count = 5 竞争条件 多个进程并发地访问和操作共享数据且执行结果和访问发生的特定顺序有关,称为竞争条件 同步 为了避免竞争条件,并发的进程需要同步,以保证同时只有一个进程操纵共享变量 原子操作 一个操作在执行过程中不会被打断 为了避免竞争条件,一些语句应该被原子化地执行 临界区问题(critical section) 假设有n个进程竞争使用一些共享数据 每个进程有一个特殊的代码段,称为临界区。在临界区中执行访问、操纵共享数据的动作 必须保证,进程的临界区地执行是互斥的,即当一个进程在临界区内,其他的进程就不允许进入到临界区中 解决临界区问题 互斥:当一个进程在临界区内,其他的进程就不允许进入到临界区中 有空让进:如果没有其他的进程在临界区内执行,并且有进程希望进入临界区,那么选择谁能下一个进入临界区的工作不能无限推迟 有限等待:在一个进程做出进入其临界区的请求到该请求被允许期间,其它进程被允许进入其临界区的次数存在一个上限 注意 假设每一个进 程的执行速度不为0 不能对n个进程的线对速度做假设 基本机器指令的执行是原子的 如果两个机器指令在两个不同的CPU上并发执行,结果相当于以不确定的顺序顺序执行的结果 临界区的两进程解法 讨论临界区问题用于两个进程的算法 两个进程标为P0和P1 为方便起见,当用Pi表示一个进程的时候,用Pj表示另外一个进程,即j=1-i 临界区的两进程解法 public class Worker extends

文档评论(0)

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

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

1亿VIP精品文档

相关文档