收藏 分享(赏)

中科院讲义 分布式操作系统 分布式共享内存.ppt

上传人:dreamzhangning 文档编号:5413325 上传时间:2019-02-28 格式:PPT 页数:231 大小:3.05MB
下载 相关 举报
中科院讲义 分布式操作系统 分布式共享内存.ppt_第1页
第1页 / 共231页
中科院讲义 分布式操作系统 分布式共享内存.ppt_第2页
第2页 / 共231页
中科院讲义 分布式操作系统 分布式共享内存.ppt_第3页
第3页 / 共231页
中科院讲义 分布式操作系统 分布式共享内存.ppt_第4页
第4页 / 共231页
中科院讲义 分布式操作系统 分布式共享内存.ppt_第5页
第5页 / 共231页
点击查看更多>>
资源描述

1、分布式共享内存,在本章中,我们研究实现分布式共享内存(distributed shared memory简称DSM)。 第1节引论 第2节体系结构和动力 第3节实现分布式共享内存的算法 第4节存储一致性(Memory Coherence) 第5节一致性协议,引论,传统上,分布式计算是基于消息传递模型,在这种模型下进程们经由以消息形式交换数据来彼此互相交互和共享数据。Hoare的通讯顺序进程(communicating sequential processes),客户-服务器模型和远程过程调用都是这种模型的例子。,引论,分布式共享内存(Distributed shared memory简称DSM

2、)系统是分布式操作系统的一个资源管理成分,它实现在没有物理地共享内存的分布式系统中的共享内存模型。见图1。 这个共享内存模型提供一个虚拟地址空间,使得被在一个分布式系统中所有结点(计算机)之间共享。,分布式共享内存,体系结构和动力,具有分布式共享内存,程序访问在共享地址空间中的数据正如同访问在传统的虚存中的数据一样。在支持分布式共享内存的系统中,数据既在辅存和主存之间也在不同结点的主存之间移动。,体系结构和动力,每个结点可以拥有存贮在共享地址空间中的数据,并且当数据从一个结点移到另一个结点时,拥有关系可以改变。当一个进程访问在共享地址空间中的数据时,一个映照管理者(mapping manage

3、r) 映照共享内存地址到物理存储,这个物理存储可以是本地或远程的。,体系结构和动力,映照管理者是一个或者实现在操作系统内核中或者作为一个运行时库例程的软件层。,体系结构和动力,为了减少由于通讯误而带来的延迟,当共享内存地址映照到在在一个远程结点上的一个物理内存位置时,分布式共享内存可以移动在共享内存地址中的数据从一个远程结点到正在访问数据的结点。在这样情况下,分布式共享内存利用底层通讯系统的通讯服务。,分布式共享内存的优点,在消息传递模型中,程序通过明显的消息传递使共享数据可供使用。换句话说,程序员需要意识到进程之间数据移动。程序员不得不明显地使用通讯原语(例如SEND和RECEIVE),放一

4、个重要的负担在它们身上。,分布式共享内存的优点,相反,分布式共享内存系统隐藏这个明显的数据移动并且提供一个较简单的程序员已经精通的共享数据抽象。因此,利用分布式共享内存比通过明显的消息传递更容易地设计和编写并行算法。,分布式共享内存的优点,在消息传递模型中,数据在两个不同的地址空间之间移动。这使得它难以在两个进程之间传递复杂的数据结构。而且传递由“引用”的数据和传递包含指针的数据结构一般是困难的和贵的。相反,分布式共享内存系统允许传递由“引用”的复杂的数据结构,于是简化了对分布式应用的算法的开发。,分布式共享内存的优点,仅移动规定的所引用的数据片来代替由移动整块或包含所引用的引用场点的数据页,

5、分布式共享内存利用程序所显示的引用局部性,因此削减了在网络上的通信开销。,分布式共享内存的优点,分布式共享内存系统比紧偶合多机系统更便宜。这是因为分布式共享内存系统可以利用off-the-shelf硬件建立不需要复杂的接口把共享内存连接到处理机。,分布式共享内存的优点,在一个分布式共享内存系统所有结点中可供使用物理内存组合在一起是巨大的。这个大的内存可以用于有效地运行要求大内存的程序而不用招致由于在传统的分布系统中对换引起的磁盘延迟。这个事实也由处理机速度相对于内存速度预料的增加和非常高速网络出现所支持,分布式共享内存的优点,在具有单个共享内存的紧偶合多机系统中主存经由一个公共总线访问,这限制

6、多机系统为几十个处理机。分布式共享内存系统没有这个缺点,并且可以容易地向上扩充。,分布式共享内存的优点,为共享内存多处理机写的程序原则上可以不加改变地运行在分布式共享内存系统。至少这样的程序可以容易地移到分布式共享内存系统中。,分布式共享内存的优点,本质上,分布式共享内存系统努力克服共享内存机器体系结构的限制并且减少在分布系统中写并行程序。所需的努力。,实现分布式共享内存的算法,实现分布式共享内存的中心课题是: 如何追踪远程数据的位置; 当访问远程数据时,.如何克服.通信延迟和在分布系统中通信协议的执行相联的开销; 为了改善系统性能,.如何使共享数据在几个结点上并发地可供访问。,实现分布式共享

7、内存的算法,现在我们描述实现分布式共享内存的四个基本算法。 中央服务器(Central-Server)算法 迁移算法 读复制(Read-Replicatin)算法 完全复制算法,中央服务器(Central-Server)算法,中央服务器算法,在中央服务器(Central-Server)算法中,一个中央服务器维护所有的共享数据。它服务从其它结点或者客户来的读请求,返回数据项给它们(见图)。在客户写请求时,它更新数据并返回表示收到的消息。,中央服务器算法,在表示收到的消息失效情况一个超时(timeout)可以被采用来重发请求。重复的写请求可以由写请求所伴随的顺序号检测。在几次重新传输而又无响应后一

8、个失败的条件被返回到企图访问共享数据的应用。,中央服务器算法,虽然中央服务器算法其实现是简单的,但中央服务器可能变成一个瓶颈。为了克服这个问题,共享数据可以分布在几个服务器上。在这种情况下,客户必须能够对每次数据访问定位适当的服务器。,中央服务器算法,多点广播式的数据访问请求是不希望的,因为与中央服务器方案相比,它并不减少服务器的负载。分布数据的一种较好的方法是按地址划分共享数据并且利用一个映照函数定位适当的服务器。,迁移算法,在中央服务器算法中,每个数据访问请求被发送到数据的位置,与之相比,在迁移算法中的数据被转移到数据访问请求的地点,允许随后的对该数据的访问被本地地执行。迁移算法每次仅允许

9、一个结点访问一个共享数据。,迁移算法,迁移算法,在中央服务器算法中,每个数据访问请求被发送到数据的位置,与之相比,在迁移算法中的数据被转移到数据访问请求的地点,允许随后的对该数据的访问被本地地执行。迁移算法每次仅允许一个结点访问一个共享数据。,迁移算法,典型地,包含数据项的整个页或块迁移以代替单个请求项。这个算法利用由程序所展示的引用的局部性把迁移的费用分摊到多个访问迁移数据上。但是这种途径对抖动(thrashing)敏感,其中页频繁地在结点间迁移,而仅服务少数请求。,迁移算法,为了减少抖动,Mirage系统使用一个可调的参量决定一个结点可以拥有一个共享数据项的期间。这允许在页被迁移到另一结点

10、之前一个结点对该页作若干次访问。Munin系统力求采用适合不同的数据访问模式的协议来减少数据移动。,迁移算法,迁移算法提供了一个机会把分布式共享内存与运行在单个结点上操作系统所提供的虚存集成在一起。当分布式共享内存所用的页大小是虚存页大小的倍数时,一个本地掌握的共享内存页可以被映照到一个应用的虚地址空间并且利用正常的机器指令访问。,迁移算法,在一个内存访问失效时,如果内存地址映照到一个远程页,在映照页到进程的地址空间之前,一个页失效处理程序将迁移该页。在迁移一页时,该页从所有在以前结点被映照到的地址空间移开。注意,几个进程可以共享在一个结点上的一页。,迁移算法,为了定位一个数据块,迁移算法可以

11、利用一个服务器追踪页的位置或者通过在结点上所维持的提示。这些提示指向搜寻当前占有该页的结点。另外,一个询问可以广播来定位一页。,读复制(Read-Replicatin)算法,在前面途径中仅仅在一个结点上的进程可以在如何时刻访问一个共享数据。读复制(Read-Replicatin)算法扩充了迁移算法,即复制数据块并且允许多个结点具有读访问或一个结点具有读写访问(多个读者-一个作者协议)。,读复制算法,读复制算法,由允许多个结点并发地访问数据,读复制可以改善系统性能。但是,写操作是昂贵的,因为一个共享块在各种结点上的所有副本将或者不得不是无效的,或者用当前值来更新以维护共享数据块的一致性。,读复制

12、算法,在读复制算法中分布式共享内存必须追踪所有数据块副本的位置。在IVY系统中,一个数据块的拥有者结点追踪具有该数据块的一个副本的所有结点。在PLUS系统中,一个分布式链接列表用来追踪具有该数据块的一个副本的所有结点。,读复制算法,然而,当读对写的比例是大的时候,读复制有减少读操作平均费用的潜力。在节描述在IVY系统中实现的许多读复制算法。,完全复制算法,完全复制算法是读复制算法的一种扩充。读复制算法它允许多个结点具有对共享数据块的读和写两种访问(多个读者-多个作者协议)。由于许多结点可以并发地写共享数据,对共享数据的访问必须被控制以维持它的一致性。,完全复制算法,维持一致性的一个简单方法是利

13、用一个无间隙的顺序器(gap-free sequencer)。在这种方案下,所有希望修改共享数据的结点将发送修改给一个顺序器。这个顺序器将赋予一个顺序号并且多点广播这个修改及顺序号到所有具有该共享数据项副本的结点。,完全复制算法,每个结点以顺序号次序处理修改请求。在一个结点上一个修改请求的顺序号和期待的顺序号之间的间隙指示一个或多个修改已被遗漏。在这种情况下结点将被请求重新传送已经遗漏的修改。这蕴涵在某个结点保留修改的日记。在第5节将讨论若干其它维护共享数据的一致性的协议。,完全复制算法,存储一致性(Memory coherence),为了改善性能分布式共享内存系统依赖复制共享数据项和允许在许

14、多结点上并发访问。但是,如果并发访问不仔细地加以控制,内存访问可能以不同于程序员所期望的次序被执行。非正式讲,一个内存是一致的,如果由读操作返回的值总归是程序员所期望的值。,存储一致性,例如,对一个程序员期待一个读操作返回一个最近写操作所存贮的值是相当自然的。,存储一致性,因此,为了维护共享数据项的一致性,一个控制或同步访问的机制是必要的。同样为了写正确的程序,程序员需要理解如何进行对共享内存的并发更新。允许的内存访问次序集合构成了存储一致性模型。字一致性用于说明一种特殊类型的一致性。,存储一致性,存储一致性最直观语义是严格一致性(strict consistency),其定义如下:一个读返回

15、最近写的值。严格一致性要求具有决定最近写的能力,依次它蕴涵请求的全序。由于比一个程序可能实际需要更多的数据移动和同步要求,请求的全序导致非有效性(请参考4)。,存储一致性,为了解决这个问题,某些分布式共享内存系统企图由提供不严格的一致性语义来改善性能。下列是几种内存一致性形式:,存储一致性,顺序的一致性 (Sequential consistency) 一般一致性(General Consistency) 处理机一致性 (Processor consistency) 弱一致性(Weak consistency) 释放一致性(Release consistency),一致性模型,一致性模型实质上

16、是软件和存储器间的契约(Adve和Hill,1990),它是说,如果软件同意服从某模型给出的规则,则存储器允诺软件在这种模型下正确地工作;否则,存储器操作的正确性将得不到保证。存储器一致性问题对于共享地址空间的并行计算机特别重要,已提出二三十种一致性模型。,严格一致性(Strict Consistency),最严格的一致性模型称为严格一致性,它由下述条件定义: 从存储器地址X处读出的值为最近写入X的值。 这个定义自然而明白,由于它假定了绝对全局时间(就像在牛顿物理中)的存在,“最近”访问的意义是明确的。传统意义上,单处理机遵守严格一致性,单处理机的编程者正希望这样。,严格一致性,最严格的也是最

17、理想的存储器一致性模型是严格一致性。它定义为: 对一存储器位置X的任何一次读,都将返回最近写X操作所存入的值。,严格一致性,假设X是存在B机器上的变量。A机器上的进程在T1时刻读取X,即发送信包到B以读取X。稍后,在T2时刻,B机器上的进程写X。若遵守严格一致性,不管机器在哪里,也不管T1和T2相距多近,A都应该读出原来的值。然而,若T2 - T1 = 1ns,而机器距离 3米,从A到B传送读操作并使之先于写操作,信号则必须以十倍光速的速度( )传递,而这与爱因斯坦相对论矛盾。编程人员有理由在违反了物理原则的情况下要求严格一致性吗?,严格一致性,严格一致性存在的问题是它依赖于绝对的全局时间。从

18、本质上说,在分布式计算机系统中为每个与准确的全局时间对应的操作分配惟一的时间戳是不可能的。 可以放宽条件,将时间分割成一系列连续的、不重叠的时间间隔。假设每个操作发生在一个时间间隔内,并获得与那个时间间隔对应的时间戳。,严格一致性,但是无法保证每个时间间隔内最多只发生一个单一操作。因此,仍需要处理在同一时间间隔内所发生的多个操作。如果同一时间间隔内的两个操作是对相同数据进行操作,并且其中一个操作是写操作,那么称这两个操作是冲突的。 定义一致性模型的一个重要问题就是准确定义出现冲突时,哪些行为是可接受的。,严格一致性,这就要求在软件和存储之间做一个约定。如果这种约定显式或隐式地承诺满足严格一致性

19、,那么存储器就能正常地工作。 另一方面,编程人员也希望能够满足严格一致性。如果不支持严格一致性,程序发生问题就很难说是那方面的问题。,严格一致性,例如,在一个小型多处理机系统中,如果某个处理机写存储器a单元,1ns以后,另一个处理机读存储器a单元,这个处理机可能是从它的局部高速缓存中获得了老的值。这样就很可能同样的程序运行多次得到 的结果却是多个,而不是唯一的。,严格一致性,先规定一些符号:P1,P2,代表不同的进程,在图中以不同的高度表示。每一进程完成的操作按水平的显示时间轴向右增加,直线分割不同进程。符号Wi(X)a和Ri(Y)b分别表示进程Pi在X处写a和从Y处读出值为b。当进程访问数据

20、而未发生冲突时,忽略符号Wi(X)和Ri(Y)的下标i。本章中所有图表中变量初值均为0。,严格一致性,严格一致性,总之,对于严格一致性的存储器,写操作在任一时刻对所有进程都是可见的,同时维护一个绝对全局时间顺序。一旦存储器中的值改变,不管读写之间的事件间隔多小,不管哪个进程执行读操作,也不管进程在何处,以后读出的都是新更改的值。同样,如果执行了读操作,不管后面的写操作有多迅速,该读操作仍应读出原来的值。,顺序一致性(Sequential Consistency),严格一致性是理想的编程模式,在一个实际的NUMA系统中,若不采取特殊措施,就不一定能得到保证。例如,在一个处理机访问本地存储器的时间

21、为T1,访问远程存储器的时间为T2的NUMA系统中,记T2-T1=2d。设处理机P1的本地存储器单元x的初值为0,在t时刻处理机P2向远程存储器单元x发出写入值1的指令,在在t+d时刻处理机P1读本地存储器单元x,由于P2的指令尚未到达P1的存储器的控制器,故P1读得的值仍为0。对于常规的编程模式,这无疑会导致程序的结果不正确。,顺序一致性(Sequential Consistency),尽管严格一致性是理想的编程模式,但在分布式系统中,这几乎不可能实现。经验表明,编程人员通常对弱模式掌握得较好。比如,所有操作系统课本中都谈到临界区和同步互斥的问题。人们认为编写这种正确的并行程序(如生产者-消

22、费者问题)不应考虑进程间的相对速度以及语句的执行在时间上如何交错。,顺序一致性,如果一个进程的两个事件发生如此之快,以致其他进程不能在此之间执行任何操作,那可能会带来麻烦。相反,读者的编程方式是:语句执行的确切时间(实际上是存储器访问)并不重要,而当事件(读或写)的顺序是至关重要时,可以使用信号量等方法实现同步操作。接受这种意见意味着采用较弱的一致性模式来编程。经过几次实践,大多数并行程序编写人员都能适应这种模式。因此,程序设计者使用较弱的一致性模式同样可以使存储器正常工作。,顺序一致性,顺序一致是比严格一致稍弱的存储器模式,Lamport(1979)首先定义了顺序一致存储器应符合的条件: 如

23、果所有进程以一定的顺序执行操作;每一进程的操作都以程序规定的顺序出现,则任何操作的结果都是一样的。,顺序一致性,Lamport (1979)定义的顺序一致性存储器满足如下条件:任意一次执行的结果都像所有处理器的操作以某种顺序的次序执行所得到的一样,而且各处理器的操作都按照各自程序所指定的次序出现在这个顺序中。,顺序一致性,这个定义意味着,当程序在各个机器上并行运行时,任何一种有效的交错存储器访问顺序都是可认可的行为,但所有处理器必须看见的是同样的访问顺序。如果一个进程(处理器)看见的是一种交错,另一进程看见的是另一种交错,则这样的存储器不是一个顺序一致性的存储器。然而,同一程序再次并行运行,其

24、存储器访问的交错次序会不同于上次的交错次序,这是允许的。,顺序一致性,这个定义说明:对于在不同机器上(甚至在伪并行的分时系统上)并行运行的进程,任何有效的交错都是可以接受的行为,但所有进程必须遵守同一访问存储器顺序。在一块存储器中,若一个进程(或处理机)看到一种交错,另一进程看到另一个交错,这就不是顺序一致存储器。注意,这与时间无关,没有最近存入的概念。在这里,进程可以看到所有进程写,但只能看到本进程读。,顺序一致性,顺序一致性,顺序一致存储器不保证读返回的值是1ns、1ms甚至1分钟以前另一进程写入的。它只保证所有进程以相同的顺序看见存储器访问。如果根据图(a)编写的程序在一次运行后,或许会

25、得到图(b)的结果。结果是不确定的。如果缺少明确的同步操作,在此运行程序或许不能得到相同的结果。,线性化,线性化是一种弱于严格一致性但又强于顺序一致性的一致性模型。这种模型假设操作具有一个全局的时间戳。设tsop(x)表示在x上的操作op执行时的时间戳, op可以是读操作,也可以是写操作。如果tsop1(x) tsop2(y),则在顺序一致性模型中的读/写操作顺序下,操作op1(x)必须在操作op2(y)之前。,线性化,线性化的数据存储也是顺序一致的。它们的区别在于:线性化是根据时间戳确定操作顺序的。 在实际应用中,线性化主要用于并发算法的形式验证。线性化的实现比顺序一致性的实现开销更大。,顺

26、序一致性,为使这点更为明确,我们考虑下图的例子(Dubois等,1988)。我们可以看到三个并行运行的进程的代码。三个进程共享相同的顺序一致分布式共享存储器,并都访问变量a,b,c。从存储器访问的角度看,赋值应被看作写操作,打印应被看作同时读取它的两个参数。所有语句都是原子操作。,顺序一致性,a = l; b = l; c = l; print (b, c); print (a, c); print (a, b) (a) (b) (c) 图三个并行进程,顺序一致性,各种交错执行的顺序都是可能的。六个独立的语句,将会有720(6!)种可能的执行顺序,尽管它们可能会破坏程序顺序。从a = l开始的

27、考虑的顺序有 120(5!)种。其中一半将在b = l前执行print (a, c),这就打乱了程序次序。还有一半将在c = 1前执行 print (a, b),也打乱程序次序。120中顺序中只有1/4即30个是有效的。另外30个有效顺序是以b = l开头的,还有30个以c = l开头。共有 90个有效执行顺序。下图表示出4种。,顺序一致性,顺序一致性,若以这种次序顺序输出P1、P2、P3的结果,将得到六位字串,这标明了语句(以及存储器访问)的一个特定交错。这就是图6-13中的标记项(Signature)所写的字符串。下面可以标记项而不用打印输出表示每个次序。,顺序一致性,并非所有26=64种

28、标记项都是允许的。如000000就不允许,因为这意味着打印语句先于赋值执行,违反了Lamport的关于语句必须按照程序顺序执行的规定。另一微妙的例子是001001,前两位00即当P1打印时,b、c都是0。这种情况只发生在P1在P2、P3开始前执行所有语句。下面两位10,即P2必须在P1之后P3之前开始执行,最后两位01,即P3必须在开始之前完成。但我们已经看到P1必须首先运行,因此001001是不可能的。,顺序一致性,总之,在假定顺序一致的情况下,90种不同的有效语句次序导致了不同的(但少于64种)运行结果,这些都是允许的。软件与存储器在这里的约定是:软件必须承认它们都是有效结果。也就是软件必

29、须接受图中的4个结果以及其他有效结果为正确答案。若任何一种情况发生,这就仍须正常工作。有些程序只能在部分结果下正常工作,而在另外的结果下不行,这就没有遵守与存储器的约定,是不正确的。,顺序一致性,顺序一致存储器可在DSM或多处理机系统上实现,在保证前一存储器操作完成后才开始后一存储器操作时,它复制可写页。例如,在一个有效全序的广播机制系统中,可以将所有共享变量组合在一页或更多页上。对共享页的操作可以广播发送。只要所有进程遵守在共享存储器上的所有操作顺序,操作交错的确切次序就显得不重要了。,顺序一致性,虽然顺序一致性是对编程人员友好的模式,但它有严重的性能问题。Lipton和Sandberg(1

30、988)证明,若读时间为r,写时间为w,节点问信包传输最小时间为t,则总有r+wt。换而言之也就是对所有顺序一致存储器来说,改变协议试图提高读性能只能导致写性能下降,反之亦然。,一般一致性,一个系统支持一般一致性,当每个处理机所执行的所有写已被完成时,如果一个内存位置的所有副本最终地包含同样的数据。,因果一致性,因果一致模型(Hutto和Ahamad,1990)是顺序一致的淡化,它按有无可能的潜在因果联系来区分各事件。 假设进程P1写变量x,然后P2读出x,写入y。这里读出x和写入y之间可能有潜在的因果联系,因为y的计算很可能决定于P2读到的x值(即P1写入的值)。,因果一致性,另一方面,若两

31、进程自然而同时地写两个变量,就没有因果联系。先有读操作之后执行写操作,两个事件就可能有因果联系。相似的,读和提供所读数据的写有因果关系。没有因果关系的操作称为并发的(concurrent)。,因果一致性,因果一致的存储器应遵守以下条件: 可能因果相关的写操作应对所有进程可见,且顺序一致。并发写操作在不同机器看来顺序可能是不同的。,因果一致性,下图是一个因果一致性的例子。这里我们有一个在因果一致存储器下允许的事件顺序,在顺序一致存储器和严格一致存储器中这是禁止的。要注意的是,W(x)2和W(x)3是并发的,所以不须所有进程将他们视为同一顺序。若不同进程以不同次序看待并发事件,而导致软件失败,则违

32、反了因果存储器协议。,因果一致性,因果一致性,下图是一个因果一致性的例子。这里我们有一个在因果一致存储器下允许的事件顺序,在顺序一致存储器和严格一致存储器中这是禁止的。要注意的是,W(x)b和W(x)c是并发的,所以不须所有进程将他们视为同一顺序。若不同进程以不同次序看待并发事件,而导致软件失败,则违反了因果存储器协议。,因果一致性,因果一致性,在下图(a)中,W(x)2可能决定于W(x)1,因为 2可能是R(x)1所读的值计算的结果,两个写操作是因果联系的,所有进程必须视它们为同一顺序。因此(a)不正确。(b)中,读被取掉,W(x)1和W(x)2变为并发事件。因果一致性存储器不要求并发写有全

33、局一致的次序,因此(b)是正确的。,因果一致性,因果一致性,在下图(a)中,W(x)b可能决定于W(x)a,因为 b可能是R(x)a所读的值计算的结果,两个写操作是因果联系的,所有进程必须视它们为同一顺序。因此(a)不正确。(b)中,读被取掉,W(x)a和W(x)b变为并发事件。因果一致性存储器不要求并发写有全局一致的次序,因此(b)是正确的。,因果一致性,因果一致性,实现因果一致性需要由记录来跟踪哪个进程看到哪个写操作。这要建立和维护一个依赖图:即一个操作依赖于其他什么操作。一种实现方法是使用向量时间戳。这样做需要一些额外的开销。,处理机一致性,由一个处理机发出的写以他们所发出的同样次序被观

34、察到。但是,从两个进程写的次序出现作为由它们自身或第三个处理机所观察到的次序不一定相同。即从不同的处理机的同时对同样的位置的两个读可以产生不同的结果。,PRAM一致性,在因果一致性存储器中,所有机器看到的因果相关写操作的顺序是一致的,而并发写操作的顺序可以不同。进一步放松对存储器限制可以去掉前面的要求。这样就给出了FIFO一致性,在分布式共享存储器系统中, FIFO一致性被称为PRAM(Pipelined RAM)一致性,意为管道式或流水线式存储器, 它要遵守的条件是: 一个过程的写操作可以被其他进程以指定的顺序接收到,但不同进程的写操作在不同进程看来次序可以是不同的。,PRAM一致性,PRA

35、M (Pipelined RAM)意为管道式或流水线式存储器,因为一个进程的写能被管道化,故进程不需要等待每次写的完成就可启动下一个操作。 Lipton和Sandberg (1988)给PRAM一致性存储器模型下了如下定义: 单一进程完成的写操作被所有进程以这些操作发出的次序所接纳,但不同进程的写操作可被不同的进程以不同的次序所看到。,PRAM一致性,PRAM一致和因果一致的对比如下图所示。这里的时间顺序在PRAM一致的存储器中是允许的,而在其他更强的模式下都不允许。,PRAM一致性,PRAM一致性,PRAM一致性,处理器一致性(以及PRAM一致性)的优点是允许硬件隐藏写操作的延迟。当写的内容

36、还在写缓冲区并没有被其他处理器看见时,此处理器可发出并完成对它的读操作。允许在一个处理器内读操作可跨过前面的还在缓冲的写操作先于完成,会给处理器以及整个系统的性能改善带来实质性的支持。,PRAM一致性,然而,无论是允许不同的处理器以不同的次序看到多个其他处理器发出的写操作,还是允许不同的处理器以不同的次序看到对不同位置的写操作,都说明处理器一致性不再保证写原子性。这会给我们编程带来一些困难,值得我们重视。,PRAM一致性,PRAM一致由于易于应用而得到关注。事实上它不保证不同进程看到的写操作顺序是一致的,除非是同一个源的一个或多个写操作,才必须按次序到达,就好像在管道中。换而言之,在这种模式中

37、,由不同进程产生的写操作是并发的。这种模型可以通过如下方法实现:简单地使用 (进程,序列号)对偶作为每个操作的标签,并根据序列号执行每个进程的写操作。,PRAM一致性,PRAM一致性,再来看下图,在PRAM一致下,不同进程所看到的语句执行顺序不同,如图(a)显示P1怎样看到事件,而(b)显示P2所看到的,(c)则是P3所见。对于顺序一致存储器,三个不同显示是不允许的。,PRAM一致性,三个进程的语句执行情况,用星号标记的语句产生实际输出,PRAM一致性,我们使三个进程的输出顺序相接,得到结果为001001,正如我们早先看到的,这在顺序一致性下是不可能的。顺序一致与PRAM一致的关键不同在于:前

38、者尽管未确定语句(和存储器访问)的执行顺序,但至少所有进程都遵守共同的顺序。后者就不遵守。不同进程看到的操作顺序不同。,PRAM一致性,有时,PRAM一致导致的结果不那么直观。在下面的例子中,Goodman(1989)提出了一种略微不同但仍支持PRAM一致的存储器形式。如下图,有人可能会天真地期待出现三种结果之一:P1被KILL;P2被KILL;或两者都不被KILL(如果两个赋值语句先执行了)。在PRAM一致下,可能两个进程都被KILL,即若P1在看到P2中b赋值之前读取b,P2在看到P1中a赋值之前读取a。在顺序一致存储器下可能有6中语句交错,没有一种可以导致两进程都被KILL。,PRAM一

39、致性,两个并行的进程。(a)P1(b)P2,PRAM一致性,Goodman(1989)模式叫作处理机一致性(processor consistency),它与PRAM一致如此接近,以至于有的作者认为他们实际是一样的(如,Attiya和Friedman,1992;以及Bitar,1990)。Goodman通过一个例子证明在处理器一致的存储器还有一个附加条件,即存储相关性。如上所述,对于任意存储器地址x,对于写入x的顺序有个全局约定。写入不同地址,对于不同进程来看,不需要相同顺序。,PRAM一致性,Gharachorloo等(1990)描述了在 Dash多处理机上使用了处理器一致。但他与Goodm

40、an的定义有些微不同。PMM和两个处理器一致模型的区别是很小的,Ahamad等(1993)描述了这一点。,弱一致性,同步访问(访问要求执行同步操作)是顺序一致的。在一个同步访问可以被执行之前,所有以前正常的数据访问必须完成。在一个正常的数据访问可以被执行之前,所有以前同步访问必须完成。这实质上把一致性问题留给程序员决定。在一个同步操作之后,内存将立即是一致的。,弱一致性,弱一致性WC(Week Consistency)模型的提出,是人们观察到大多数并行程序排定几个进程对数据存取次序时都需要使用同步操作;而在同步操作之间,一个进程所进行的数据存取操作次序对其他进程会是不可见的。例如,某进程对同步

41、变量实施加锁后进入临界段,已在临界段内所做的存储器数据读写操作,由于互斥性其他进程根本看不到,更不用说读写操作次序了。,弱一致性,只是在此进程解锁退出临界段,其对共享变量所做的修改结果应立即被其他进程所看到,基于上述观察,我们可放宽对非同步读写操作次序的限制而只对同步存储器操作施加顺序一致性,来解决存储器一致性问题。,弱一致性,PRAM一致性和处理器一致性仍对很多应用程序作了不必要的限制,即要求一个过程的写操作以一定顺序被所有进程看到。并非所有应用程序要看到所有写操作。,弱一致性,比如在临界区中一个进程循环读写变量的例子。即使直到一个进程已离开临界区后其他进程才能访问变量,存储器也无从得知何时

42、进程在临界区,何时不在。因此它必须以普通方法将所有写操作传播到所有存储器。,弱一致性,更好的解决办法是让进程完成临界区操作以后,将最后结果发送到各处,而不用太关心甚至不用关心中间结果是否也顺序发送到所有存储器。这一切都可通过引入一种新变量:同步变量S来解决,它用于同步的目的。同步变量S只有一个关联操作synchronize(S),它同步数据存储的所有本地拷贝。一旦完成一次同步,那台机器上所有写操作就均被广播出去,其他机器上的所有写操作都被引入,即所有(共享)存储器被同步了。,弱一致性,Dubois等(1986)定义这种使用同步变量来部分地定义的一致性模型为弱一致性,它有三个属性: 对同步变量的

43、访问是顺序一致的; 在所有先前的写操作完成之前,不能访问同步变量; 在先前所有同步变量的访问完成前,不能访问(读或写)数据。,弱一致性,第一点指出所有过程以相同顺序看到对同步变量进行的所有操作。即,如果进程P1调用synchronize(S1),与此同时进程P2调用synchronize(S2),那么,实际效果好象是synchronize(S1)发生在synchronize(S2) 之前,或synchronize(S2)发生在synchronize(S1) 之前,但所有进程看到同样的顺序。实际上,一个同步变量的访问将立即被广播出去。在广播发送结束之前,任意其他进程不能访问其他同步变量。,弱一致

44、性,第二点指出访问同步变量“刷新了管道”,它强迫在所有拷贝上完成所有程序中的写操作。其中包括正在执行的、部分完成的或已经在某些本地拷贝上完成却未在其它拷贝上完成的写操作。同步访问开始前,应保证先前所有的写操作已完成。在更新共享数据后做同步操作,进程可迫使将新值传遍到该存储的所有其它本地拷贝。,弱一致性,第三点指出访问一般(即非同步)变量,不管是读是写,只有在所有前序的同步操作结束后方可进行。在读共享数据前做同步操作,可以保证进程读到最新值。,弱一致性,需要指出的是:在 DSM系统中,“执行完”这个词之后隐藏着相当的复杂性。当其后的写操作不会影响读的返回值时,读操作被认为已执行,当所有后续读操作

45、均返回刚写入的值时,写操作被认为已执行。当更新了所有共享变量时,同步被认为已执行。我们还可以比较在局部和全局执行操作的不同。Dubois等(1988)详细讨论了这一点。,弱一致性,从应用的角度来说,软件和存储器问的协议指出,只有当访问同步变量时,存储器才需更新;新的写操作可以在前一写操作完成之前开始,在一些情况下可完全避免写。当然,此协议加重了编程人员的负担,但换来了优越的性能。 不同于以往的存储器模型,它是对一组操作的一致性约束,而不是单独的读或写。当很少单独而基本上以簇的形式(短时间内有很多访问,每一访问时间都不长)访问共亨变量时,这个模型更为有用。,弱一致性,与前面的一致性模型不同的另一

46、个重要不同点是,它只限制了保持一致性的时间,而没有限制一致性的形式。实际上。弱一致性是在一组操作,而非单个操作上强迫执行顺序一致性。同步变量用于划分操作的组。,弱一致性,弱一致性,释放一致性,弱一致性存在这样的问题,即当访问同步变量时,存储器并不知道这是因为进程已完成对共享数据的写操作还是要开始读共享数据。因此,它必须执行这两种情况要求的操作,也就是它要确保本地启动的写操作都已完成(即发送到其他所有的拷贝),同时还要收集其他机器执行的写操作。,释放一致性,若存储器能够区分进入还是离开临界区的话,应用起来会更有效。鉴于此,我们需要两种类型而非一个同步变量或操作。,释放一致性,释放一致性(Ghar

47、achorloo等,1990)提供了这样两种操作: 获取(acquire)操作是用于通知数据存储进程进入临界区的操作。 释放(release)操作是表明进程刚退出临界区。,释放一致性,这些操作既可以通过特殊变量上的普通操作实现,也可以作为特殊操作来实现。在这两种情况下,编程人员都需要在程序中编写明确的代码说明何时做这些操作。例如,是调用获取(acquire)和释放(release)这样的库函数还是进入临界区(enter_critical_region)和离开临界区(leave_critical_region)这样的过程。,释放一致性,在释放一致性下,也可以使用屏障(barrier)代替临界区。

48、屏障是一种同步机制,在所有进程完成程序的第n段之前,它禁止任何进程进入第n+l段。当一个进程遇到屏障,它必须等待所有进程都运行到此屏障。当最后一个进程到达此屏障后,说明所有共享数据已经被同步,然后所有进程才可以继续执行。获取操作表明进程离开屏障,而释放操作表明进程到达屏障。,释放一致性,释放一致性本质上和弱一致性相同,但是同步访问必须仅是处理机一致的。同步操作被分裂成获得(acquire)和释放(release)操作。,释放一致性,所有悬而未决的获得(例如,一个锁操作)必须在一个正常访问完成之前完成,并且所有正常访问必须在一个释放(例如,一个去锁操作)完成之前完成。在同一处理机内的局部依赖性必

49、须仍然遵守。,释放一致性,释放一致性是弱一致性的进一步放宽而又不丢失一致性。事实上,释放一致性由包含下列次序的放宽而区别于弱一致性。正常的数据访问不.必等待释放操作完成,因为释放操作标志正常的访问完成并且不涉及访问的次序。,释放一致性,获得操作不必等待以前的正常的访问完成。 同步操作仅要求是处理机一致的,而非顺序一致的。,释放一致性,除了这些同步操作外,对共享数据的读和写操作也是可以执行的。获取和释放操作并不需要应用于所有存储的数据。相反,它们只是保护某些特殊共享数据,这时也只有那些被保护的数据保持一致。保持一致的共享数据被称为受保护的数据。,释放一致性,存储器和软件的协议说明,当软件执行获取

50、操作时,存储器会根据需要确保被保护数据的所有本地拷贝被更新为最新数据,并和远程数据拷贝保持一致。当执行释放操作时,修改的被保护变量要传送到其他机器上。执行获取操作并不能保证本地所作的修改会立即传送到其他本地拷贝。类似地,执行释放操作也不会必然地从其它拷贝引入所做的改变。,释放一致性,释放一致性,上图是释放一致性下的一个有效事件顺序。进程P1执行获取操作,两次改变共享变量x的值,然后执行释放操作。进程P2执行获取操作,并读取x。它应在释放操作时得到x的值为b(除非P2的获取操作先于P1的获取操作)。若P2的获取操作在P1的释放操作之前,则它必须等待到P1执行了释放操作。因为P3在读共享变量前没有执行获取操作,存储器不必给它x的当前值,因此返回a是允许的。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 职业教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报