volatile与缓存一致性协议

最近在深入分析volatile关键字的实现原理,内存屏障、缓存一致性、store buffer、invalid queue等知识看了不少,但接触的资料比较零散,无法完整的把相关内容串联起来,所以抽空做些整理,也算对这段时间的学习做一个小结。

众所周知,volatile最主要的特性是保证了变量的可见性,即任意线程总能读到对volatile变量的最后写入(最新值)。而可见性正是依靠缓存一致性、内存屏障等机制协同运作来保证的。下面先就volatile与缓存一致性协议之间的关系分享下一点个人理解。

缓存一致性

计算机的存储结构在内存和CPU之间存在多级缓存,有些为CPU共享,如L3缓存;有些为CPU独享,如L1,L2缓存,缓存一致性问题即发生在独享缓存。引入多核后,一个数据可能在多个CPU的独享缓存存在拷贝,当其中一个CPU修改了本地缓存后,该数据在其他CPU缓存行的数据成为脏数据,相同数据出现了不一致。缓存一致性协议即为了保证多核场景下内存数据的在cpu cache的一致性。

MESI协议

MESI代表了缓存行的四种不同状态,状态标记以及触发状态转换的消息通知机制保证了缓存行的数据一致性。

状态:

已修改Modified (M):缓存行是脏的(dirty),与主存的值不同。如果别的CPU内核要读主存这块数据,该缓存行必须回写到主存,状态变为共享(S).

独占Exclusive (E):缓存行只在当前缓存中,但是干净的(clean)--缓存数据同于主存数据。当别的缓存读取它时,状态变为共享;当前写数据时,变为已修改状态。

共享Shared (S):缓存行也存在于其它缓存中且是干净的。缓存行可以在任意时刻抛弃。

无效Invalid (I):缓存行是无效的。这也是初始状态。

消息:

Read: CPU发起读取数据请求,请求中包含需要读取的数据地址。

Read Response: 作为Read消息的响应,该消息可能是内存响应的,也可能是某CPU响应的(比如该地址在某CPU Cache Line中为Modified状态,该CPU必须返回该地址的最新数据)。

Invalidate: 该消息包含需要失效的地址,所有的其它CPU需要将对应Cache置为Invalid状态

Invalidate Ack: 收到Invalidate消息的CPU在将对应Cache置为Invalid后,返回Invalid Ack

Read Invalidate: 相当于Read消息+Invalidate消息,即取得数据并且独占它,将收到一个Read Response和所有其它CPU的Invalid Ack

Writeback: 数据只写入Cache,仅当该数据块被替换时才将数据写回内存。(对比Write through:同时写入cache和内存)

volatile和MESI协议之间的关系

刚接触MESI协议时容易产生误解,以为是volatile关键字触发MESI机制来保证变量的可见性,实际没有这一层因果关系。下面简单总结下我对两者关系的一些理解:

1.MESI保障了多核场景的缓存一致性,是一套固有机制,无论是否声明volatile,只要变量在CPU缓存中就能通过这个协议保障可见性。但反过来,如果没有MESI协议,即使声明了volatile也无法保证变量的可见性;

2.既然有了MESI协议,为什么还要volatile?这是因为MESI本身存在一些性能问题(例如修改一个存在于其他CPU缓存的数据时,需要等待其他CPU的invalidate ack),因此额外引入了store buffer和invalidate queue等存储结构来优化性能。当数据仅存在于L1/L2 cache中时,MESI足可以保证volatile的内存语义,但如果数据存在于store buffer或者invalidate queue中时,仅靠MESI无法保证数据的一致性,这时需要引入内存屏障。

参考资料:

https://blog.csdn.net/xiaowenmu1/article/details/89705740

https://wudaijun.com/2019/04/cpu-cache-and-memory-model/#valine-comments

https://bk.tw.lvfukeji.com/baike-MESI%E5%8D%8F%E8%AE%AE?wprov=srpw1_5

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

推荐阅读更多精彩内容