分布式系统(三)——分布式共享内存和顺序一致性

本文主要介绍分布式中的一致性原则和分布式共享内存
文章中的内容全部来源于清华大学分布式课程网站,课程主页http://thu-cmu.cs.tsinghua.edu.cn/curriculum/dscourse/index.html


什么是一致性

简单的来说,一致性就是一方面保证所有的读取都能看到正确的写入内容,即数据的正确性或者说是完整性(这点类似于数据库中的事务),另一方面,在分布式系统中,一致性还意味着同一数据的副本应该保持一致。

分布式共享内存

这里,我们介绍两种分布式共享内存,一种是分布式共享内存,另外一种是naive分布式共享内存

简单的分布式共享内存
分布式系统(三)——分布式共享内存和顺序一致性_第1张图片

所有的进程去访问一个共享内存,这个共享内存是虚拟的,他可能分布在不同的物理机上,其实可以理解为一种抽象,他整合了所有的存储资源,然后所有的调度、分配、读写都对程序员是隐藏的,他提供给程序员的就是一个虚拟的内存块(或者内存管理平台),程序员就可以向操作一块磁盘一样去在上进行编程或者其他的行为,这有点类似于云计算的思想。

naive分布式共享内存
分布式系统(三)——分布式共享内存和顺序一致性_第2张图片
每一个机器都有一个存储内容的本地副本,读取操作我们可以从本地内存进行读取,写入操作我们可以现在本地下入之后,再通过广播向其他的内存块发送update消息。

我们可以看到naive方式的共享内存速度是非常快的,因为他不需要去跟其他的用户进行交流,省去了通信的消耗。

但是,假设我们由下面这样一段待执行的代码

M0:       
    v0=f0();
    done0=1;
M1:
while(done0==0) ;
    v1=f1(v0);
    done1=1;

M2:
while(done1==0);
    v2=f2(v0,v1);

m0、M1、M2分别表示这段代码执行位置,分别在三块不同的内存上执行,而且我们会看到这段代码有着严格的执行顺序的,那就是M0M1M2,假设我们用naive分布式共享内存,那么就可能出现下面两种情况:
1、m0已经完成了,但是由于网络错误,done0==1,但是v0的值没有更新
2、M2在M0写之前看到了M1写入的内容

严格一致性

严格一致性是每一次读取都能读到最近写入的一切数据,前提条件是每一个操作都会顺时完成,不存在网络延迟等。

因此,单机编程实现的永远是严格一致性模型所表现的,但是下面这段代码却不是严格一致性所允许的。因为,我们读取了0值,但是w(x)已经把X更新为1了

P0: w(x) 1
P1:               r(x)0   r(x)1

顺序一致性

由于严格一致性太过于严格,在分布式系统中太难保存,因此,我们需要一个相对宽松的一致性模型,那就是顺序一致性,顺序一致性需要保证两点
一、在单机内部(在一个机器内),操作的执行是按序执行,而且单机产生的结果必定是一定的
二、所有的机器看到的执行顺序是一致的,但是允许有延迟存在,即机器B把x变成了,但是其他的机器读的是0,这是符合要求,但是如果有一个机器读的是1,那么这就违反了顺序一致性

你可能感兴趣的:(分布式系统)