硬件同步指令在前四节中描述了基于软件的临界区问题的解答.doc

硬件同步指令在前四节中描述了基于软件的临界区问题的解答.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.3 硬件同步指令 在前四节中描述了基于软件的临界区问题的解答。为了用软件算法来解决临界区问题,可谓费尽周章。回顾前面几节,软件解法之所以困难是因为在一个进程进入临界区之前,它需要完成两件工作:一是检查是否有别的进程正在请求进入临界区或者正在临界区,二是设置自己(想)进入临界区的标志。由于检查他人的标志和设置自己的标志无法成为原子操作,即无法在一条机器指令内完成,所以,在进程切换可能在任何两条相邻的指令之间发生的情况下,设计无错的软件临界区问题解决算法这项工作变得非常困难而且精巧。 为了更方便地解决这个问题,在一些体系结构上,硬件厂商提供了检测一个标志和设置这个标志同时完成的机器指令,从而大大简化了设计临界区问题解法的困难。 一般来说,可以说任何临界区问题都需要一个简单工具——锁。锁是一个进程之间共享的内存中的变量。通过要求临界区用锁来防护,就可以避免竞争条件,即一个进程在进入临界区之前必须得到锁,而在其退出临界区时释放锁,如图3.7所示。 do { 请求锁 临界区 释放锁 剩余区 } while (TRUE); 图3.7 采用锁的临界区问题的解答 硬件特性能简化编程任务且提高系统效率。有了硬件指令的支持,我们下面将讨论更多的临界区问题的解决方案。这些方案采用了从硬件到应用程序员可见的软件API等一系列技术。所有这些解决方案都是基于锁为前提的。不过,我们也将看到,这些锁的设计可能非常复杂。 指令TestAndSet可以按图3.8所示定义。其主要特点是该指令能原子地执行。 boolean TestAndSet(boolean *target) { boolean rv = *target; *target = TRUE; return rv; } 图3.8 TestAndSet指令的定义 如果机器支持指令TestAndSet,那么可这样实现互斥:声明一个Boolean变量lock,初始化为false。进程Pi的结构如图3.9所示。 do{ while (TestAndSet(lock)) ;// do nothing // critical section lock = FALSE; // remainder section } while (TRUE); 图3.9 使用TestAndSet指令的互斥实现 另一种可用于支持互斥的机器指令是swap指令。指令swap操作两个数据,其定义如图3.10所示。与指令TestAndSet一样,它也是原子执行的。如果机器支持指令swap,那么互斥可按如下方式实现:声明一个全局布尔变量lock,初始化为false。另外,每个进程定义一个局部Boolean变量key。进程Pi的结构如图3.11所示。 void Swap(boolean *a, boolean *b) { boolean temp = *a; *a = *b; *b = temp; } 图3.10 Swap指令的定义 do{ key=TRUE; while (key == TRUE) Swap(lock, key); // critical section lock = FALSE; // remainder sectiaa }while (TRUE); 图3.11 使用Swap指令的互斥实现 图3.9和图3.11的两个算法解决了互斥,且满足推进条件,但是并没有从理论上满足有限等待要求。下面,介绍一个使用TestAndSet指令的算法,如图3.12所示。该算法满足临界区问题的全部三个要求。先定义共用数据结构如下: boolean waiting[n]; boolean lock; 这些数据结构均初始化为false。 为了证明满足互斥要求,注意,只有waiting[i]==false或key ==flase时,进程Pi才进入临界区。只有当TestAndSet执行时,key的值才变成false。执行TestAndSet的第一个进程会发现key==false;所有其他进程必须等待。只有其他进程离开其临界区时,变量waiting[i]的值才能变成false;每次只有一个waiting[i]被设置为false,以满足互斥要求。 do { waiting[i] = TRUE; key = TRUE; while (waiting[i] key) key = TestAndSet(lock); waiting[

文档评论(0)

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

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

1亿VIP精品文档

相关文档