内存一致性模型,存储模型论文
一致性模型:
所谓的内存一致性模型,其实是系统设计者和应用程序员之间的一种约定。如果应用软件遵循一定的规则访问虚拟内存系统,应用软件可以获得正确的存储访问结果;相反,如果约定的规则被打破,存储访问的正确性将得不到保证。
从某种意义上说,内存一致性模型限制了共享内存系统中多个处理器的内存访问顺序,从而影响了性能。分布式存储系统(DSM)的一个基本目标是使由局域网连接的工作站集群共享一个单一的分页虚拟地址空间,从而使在工作站集群上运行程序的效果类似于在单台机器上运行程序。最简单的变体,每一个页面都存在于某一台机器中,本地页面的查询速度等于内存的访问速度,而对远程机器的页面查询请求会触发一个段违例信号(SIGSEGV),导致程序落入操作系统,操作系统会处理缺页中断,然后操作系统会向远程机器发送消息,找到所需页面,等待远程机器发回。本地机器获得远程页面后,触发段违例信号的指令将重新启动,并可以继续执行。
为了实现上述目标,需要构建一个虚拟内存子系统,它可以捕获DSM系统中的页面访问错误,从网络上的其他节点检索数据,并完成必要的同步操作。
当应用程序的数据依赖性相对较大时,这种只维护每个可写页面的一个副本的策略将导致严重的性能瓶颈。维护多个副本的策略可以减缓性能的瓶颈效应,但也带来了一个新的问题,即如何维护多个副本之间的数据一致性。为了解决这个问题,提出了一种一致性存储模型。一般来说,按照一致性要求从强到弱的顺序,可以分为以下几类。
严格一致性模型(严格一致性模型)
这是最严格的一致性模型,它由以下条件描述:对内存位置X的任何读操作都将把最近一次写操作中存储的值返回到位置X。
在DSM系统中,这是一个理想的模型,但由于网络延时的原因,无法实现。DSM系统中实现的多种一致性模型不同程度地放宽了严格的一致性模型;然而,在单机环境中,任何存储访问序列都满足严格一致性的要求。
顺序一致性模型(顺序一致性)
顺序一致性对内存的限制略弱于严格一致性,顺序一致性内存应满足以下条件:
每个流程中每个操作的顺序是不变的;
如果CPU上的所有进程都在一个存储单元上执行操作,那么它们的操作顺序是确定的,即任何进程都可以感知到这些进程的相同操作顺序。上述条件意味着,当多个进程在不同的机器上并行执行时,只要所有进程以相同的顺序访问内存,任何有效的交叉访问执行都是可以接受的。在顺序一致性模型中,时间不再是影响一致性的因素,而是关注所有进程必须感受到一致的内存访问顺序。
一致性模型不能确保一个进程的读操作可以返回另一个进程写的最新值。
因果一致性模型
它是顺序一致性模型的弱化,要求具有潜在因果关系的操作要保持它们的一致顺序。一般描述如下:潜在的因果写操作必须以相同的顺序被所有进程感知,而并发写操作在不同的机器上可以有不同的顺序。
在因果一致性存储管理系统中,上述操作序列是合法的,而在顺序一致性或严格一致性模型中,它们是非法操作。
一致的流水线模型(流水线RAM)
流水线一致性模型是因果一致性模型的进一步弱化,它满足以下条件:一个进程完成的写操作可以被其他所有进程按顺序感知,而来自不同进程的写操作对于不同的进程可以有不同的顺序。
弱一致性模型
虽然与严格一致性模型相比,PRAM模型可以实现更好的性能,但对于许多应用来说,它仍然受到该模型的限制,因为它仍然要求由同一进程(源)产生的结果必须按顺序传递给所有其他进程。并不是所有的进程都需要看到所有写操作的结果,它们更没有必要顺序地看到写操作的结果。这里,模型的开销会严重影响应用程序的性能。考虑到大多数情况下不需要将运算的中间结果展开,必须进一步放宽一致性要求。我们只在需要传播写操作的结果时才传播结果。而且,一切都是完全平行的。为了同步操作,在弱一致性模型中引入了同步变量。
弱一致性模型必须满足的条件:
对同步变量的访问满足顺序一致性的要求。
对同步变量的访问只能在所有地方的写操作完成之后才能完成。
对数据的操作(读或写)只能在先前对同步变量的访问完成后才能完成。
第一点表明,所有进程都能以相同的顺序感知对同步变量的所有访问。当一个进程访问一个同步变量时,它将广播它对该同步变量的访问,并且任何其它进程对该同步变量的访问将被阻塞,直到该进程成功地操作该同步变量。
第二点表明,访问同步变量将导致内存刷新。当一次同步访问完成后,可以保证之前的所有写操作同时完成。当进程更新共享数据时,它可以通过同步操作传播新值。
第三点说明当一个进程在读取一个共享数据(异步变量)时,可以通过同步操作获得共享数据的最新值。
发布一致性模型(发布一致性)
对于访问同步变量,弱一致性模型有一个问题:它不能区分一个进程在完成对共享变量的操作后是准备进入临界区还是准备退出临界区。因此,流程必须在以下两种情况下采取同步操作:
本地写操作的结果被传播。
从其他机器收集共享数据的最新值。
如果能够区分进入和退出临界区这两个动作,就可以实现一个更高效的存储一致性模型——释放一致性模型。发布模型提供了两种类型的同步操作:获取和发布。当一个进程即将进入临界区时,它将执行获取操作,当它退出临界区时,它将执行释放操作。释放一致性协议也可以通过屏障同步而不是临界区来实现。Fence是一种同步机制,要求所有进程都达到某个同步点,每个进程才能继续执行。
借助于获取和释放操作,我们可以保护一些特殊的共享变量,并保持它们的一致性。当然,应用程序必须知道它需要维护其一致的数据,这也给应用程序的编程增加了一些协议开销,但整体性能得到了提高。
一般情况下,分布式共享存储系统如果满足释放一致性,就必须遵守以下规则:(1)只有在一个进程成功完成获取操作后,才能保证其对公共共享变量(非共享同步变量)访问的正确性。(2)一个进程只有在读写共享数据后才能完成释放操作。(3)获取和释放操作必须满足管道一致性的要求。
为了进一步提高性能,实现释放一致性模型的另一种协议称为惰性释放一致性,相应地,一般的实现称为急切释放一致性。它们之间的区别在于,在释放操作之后,勤奋释放一致性协议将所有修改的数据传输给所有其他进程,以便其他进程拥有最新数据的副本,并且可以在本地访问它们。但现实情况是,其他进程可能不需要共享的数据,这就浪费了带宽,给程序带来了不必要的延迟。Lazy Release consistency协议在释放操作之后并不急于传输新数据,而是在其他进程执行了获取操作之后,当其他进程发出获取新数据的请求时,它会响应该请求,将共享数据的最新值传输给特定进程,从而再次提高系统的性能。
条目一致性模型(条目一致性)
另一种提高临界区操作并行性的一致性模型是Bershad等人在1993年提出的单一一致性模型。它要求程序员在临界区的开头和结尾使用获取和释放操作,但与释放一致性不同,它要求每个共享变量都与一个同步变量相关联,同步变量可以是锁,也可以是栅栏。以并行访问一个数组的不同元素为例,需要给不同的数组元素添加不同的锁。只有在同步变量的获取操作完成后,才能保证相关共享数据的一致性。单项一致性模型也不同于惰性发布一致性模型,惰性发布一致性模型不将共享数据与锁或栅栏相关联,而是在获取同步变量后确定它需要哪些共享数据。
因为只有少数共享变量需要同步,如果每个同步变量都与多个共享数据相关联,那么获取和释放同步变量的开销就会减少。同时也允许多个变量不同的临界段并行运行,提高了并行性。它的代价是每个共享变量必须与一个同步变量相关联,这带来了一些开销和复杂性。
使用同步变量的规则如下:
每个同步变量都有一个当前的所有者(即最近获取同步变量的进程),所有者可以重复操作临界区,而不需要在网络上发送任何消息。此时,想要获取该同步变量的进程需要向当前所有者发送消息,以获取该同步变量操作的所有权以及与该同步变量相关联的共享变量的值。在非互斥的情况下,允许多个进程同时拥有一个同步变量,但只能读取共享数据,不能写入。满足单一一致性的条件是:
在当前所有者对数据的更新操作完成之前,不能执行另一个进程对同步变量的获取操作。
如果一个进程以互斥模式访问一个同步变量,那么在该进程释放该同步变量之前,即使在非互斥模式下,其他进程也无法获得该同步变量。
如果一个进程以互斥方式访问一个同步变量,那么在该进程完成其操作之后,任何进程对该同步变量的任何后续非互斥访问都只能在它成为该同步变量的所有者之后才能完成。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。