分布式共享内存

DSM

本文是论文Treadmarks: Distributed Shared Memory on Standard Workstations and Operating Systems 的读书笔记,水平有限,若有任何错误的地方,请不吝指出。

本文是mit 6.824 Schedule: Spring 2016的第12课,前面课程内容可以在分布式找到,更多详细资料可以到:distributed-system查看。

介绍

在并发编程中,我们需要处理两个关键问题:

  • 线程之间如何通信
  • 线程之间如何同步

通信是指线程之间以何种机制来交换信息,在命令式编程中,线程之间的通信机制有两种:

  • 共享内存
  • 消息传递

我们从通信和同步两个维度来看共享内存和消息传递。

在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。
同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

通过上面的介绍我们知道了共享内存是一种隐式的通信手段,需要显示的方法来实现同步。

而在分布式系统中,我们希望能够的是能尽可能的利用普通的机器,来达到并行计算的目标,而distributed shared memory (DSM) 在分布式系统中实现了共享内存,让所有process都共享一个全局地址空间,通过提供简单的api,方便process的访问。
先让我们看下api



其中barrier,acquire和realease用于同步操作,一旦调用barrier等待所有process都到达这个点后才继续执行,acquire和realease则用于锁的获取和释放。

设计

在实现DSM时,主要考虑的两个问题是:

  • 一致性
  • False Sharing

首先在分布式系统中,为了提高性能,往往会对同一份数据做本地缓存,加快访问,但是数据虽然有多份,但是需要保证数据的一致性,同一份数据可能有多个副本,一旦数据做出了改变,需要通知所有持有副本的process,数据已经改变了。

我们先来看下如果要实现这种严格的数据改变,就必须可见,系统需要怎么做?



如上图所示,每个写操作一旦完成,必须要通知所有其他的进程该行为,带来的问题是:

  • 消息数的增加
  • 延迟

这种严格的一致性被称为是:sequence consistency,一般系统为了其他一些因素,都会做出一些trade-off,TreadMarks则是采取了release consistency,只有在同步点上才要求数据同步,看图:



使用release consistency的目标是:

  • 减少消息数
  • 减少延迟

那此处具体的同步点是什么时候呢?
前面提到过TreadMarks提供了acquire和release两个同步操作,当发生同步操作的时候,进行数据的同步。


Eager

此时在release的时候,将在acquire和release之间的数据改变广播给所有的持有数据副本的process,但是由于需要等待所有副本答复说已经收到通知,release操作会比较耗时。


Lazy

TreadMarks在实现release consistency采用了Lazy Release Consistency,
  • 只有当下次acquire锁的时候才会去获取改变
  • 获取再取有效的减少了消息数

Eager和Lazy在实际运行中减少的消息数,可以通过下图直观的看到:


下一个需要解决的问题是:False Sharing,那什么是False Sharing?


我们看到P和Q都是操作同一个page,但是P是写x,而Q是读y,但是由于P写完x后通知了Q改页已经数据更改了,失效了保存在Q中的副本,因此Q再去访问y的时候,必须要去P处获取该页的数据,加重了数据的传输成本。那解决办法有什么呢?采用 multiply writer protocol,具体来讲就是

  • 采用copy-on-write机制
  • 一旦某个进程被授权访问write-shared的数据,将包含数据的页标志为copy-on-write
  • 第一次更改页数据的时候,会创建一个备份:twin
图片
图片

当release操作的时候,TreadMarks会:

  • 比较twin和修改过后的数据
  • 将不同保存为diff
  • 通知所有的副本(write notice)
  • 当其他process访问改页的时候,会去请求diffs
创建diffs

TreadMarks在diffs的创建上,采取了Lazy的策略,只有当其他processor请求页改变的时候,才会去创建diffs。

数据结构


主要数据结构如上图所示,包括了

  • Page Array
  • Proc Array
  • write notice records
  • diff pool

此处PageArray中每个entry都是一个page,包含的数据有

  • 页的当前状态:no access, read-only access, read-write access
  • 当前持有当前页的processor
  • 一个以processor_id为index的array,每个array index都是来自processor的write notice,并且以interval排序,如果write notice对应的diffs已经创建,则会有一个指针指向

每个ProcArray则是记录了processor知道的intervals records,每个interval records指向了当前intervals知道的write notices。

下面举个例子:

M0: a1 x=1 r1  a2 y=9 r2
M1:              a1 x=2 r1
M2:                           a1 a2 z = x + y r2 r1

有M0,M1,M2,3个进程,其中a和r代表acquire和release,那此时M2中获取到x的值是M0设置的x=1还是M1设置的x=2呢?

这就要引入一个叫vector clock的东西,通过一组图来看下是怎么回事。


图片

起初P1,P2,P3开始counters都是0,


图片

当有本地事件发生的时候,P1对应的counter加1
图片

P3也发生了本地事件,counter加1


图片

当P1收到P3发送来的消息的时候,本地counter加1,其余counter进行更新
图片

P1发送事件自己的counter加1,P2接收事件,自己的counter加1,其余counter进行更新;
上面的图基本上就说明了vector clock是怎么回事,维护了分布式系统中的一个因果关系。

现在我们再回到之前的例子:

M0: a1 x=1 r1  a2 y=9 r2
M1:              a1 x=2 r1
M2:                           a1 a2 z = x + y r2 r1

此时M2怎么知道x等于几?当M2在获取锁1的时候,会去请求前一个释放锁的进程,可能是M1也可能是M0,并将自己的vector clock传递过去,然后锁的前一个releaser同自己的vector clock比较,将改变传递过来,具体通过一个图来说明:


图片

P1发送Vector timestamp给releaser P3


图片

P3对于已经更新的counters附上invalidations
图片

P3将其发送给P1


图片

P1收到invalidation后,请求diffs,并将diffs应用到page。

性能

参考

Treadmarks: Distributed Shared Memory on Standard Workstations and Operating Systems - PowerPoint PPT
TreadMarks - PowerPoint PPT Presentation

这是6.824: Distributed Systems的第12课,你的鼓励是我继续写下去的动力,期待我们共同进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,559评论 18 139
  • 1. 前言在一个理想的世界里, 我们应该只有一个一致性模型. 但是多路处理器和分布式系统中的一致性问题是一个非常难...
    f11015f29d83阅读 1,521评论 0 4
  • 第四章 分布式和并行计算 来源:Chapter 4: Distributed and Parallel Compu...
    布客飞龙阅读 1,501评论 0 37
  • 借鉴 你站在桥上看风景 看风景的人在楼上看着你 明月装饰了你的窗子 你装饰别人的梦――《断章》 没有目标,一直走。...
    我来自1999i阅读 152评论 0 1
  • 【手写爱情绘本5.0】有的人总想着活在过去,因为过去只是一个既定的结果,没有任何的风险,有一览无余的风景,和一眼看...
    主播亚东阅读 375评论 4 5