高速缓存和主内存如何保持数据同步

来自深入浅出计算机组成原理

现在的CPU都是多核的CPU,每个CPU内核都有着自己的L1、L2级缓存,多个CPU内核共享L3级缓存和计算机的组主内存。CPU在加载数据的时候,首先会尽可能的从 Cache 中取加载,并不是一开始就从主内存中取加载数据。当 Cache 中没有数据的时候,才会从内存中去加载数据。

image.png

但是对于CPU处理的数据来说,肯定也会有数据的写入操作,Cache 的速度比内存快很多,那应该是直接写入 Cache 中还是内存中呢?如果直接写入内存中,Cache中的内存是否会失效?(与redis作为数据库缓存类似,当发送数据更新写入缓存还是直接写入库)。

两种写入策略

写直达

写直达是最简单直接的一种策略,在写入之前先判断 Cache 中是否已经存在这个数据(通过地址映射关系判断这个地址的数据是否在 Cache 上),如果存在则直接更新 Cache 在写入到主内存中,如果不存在 Cache 就只更新主内存。

这个策略存在一个很明显的问题,就是不管缓存命中与否,都要写入到主内存中。

写回(Write-Back)

写回这个策略的想法是:既然CPU加载数据首先会从 Cache 中查找,那么是否可以直接将数据写入 Cache,而不把所有的数据同步到主内存呢?这样当缓存命中率高的时候可以减少很多I/O操作。

所以写回这个策略不再需要每次都同步数据到主内存中,而只是写到 Cache中,只有当 Cache 中的数据要被替换(应该是由于缓存淘汰策略)的时候才同步到主内存中。

过程是这样子的:当有要写入的数据的时候,直接更新 Cache 中的数据(如果存在),同时这个这个数据所在的块(cpu是按块加载数据)会被标记成脏的,就是这个块中的数据和主内存中的是不一致的。如果要写入的块存放着别的内存地址的数据(这个时候这个 Cache 中的数据要被淘汰),再查看这个块是否标记了脏块,如果标记了就先把这个 Cache 块的数据同步到主内存中,如果没有标记成脏块,就直接更新 Cache 块,再把这个块标记成脏块!

写回策略

由于有了一个脏块标记,在从内存中加载数据写入到 Cache 中也需要多加一个同步操作,如果缓存到的 Cache 块是脏块的话,就需要先将块中的数据同步到主内存之后再进行缓存操作,让后把脏标记去掉。

写直达和写回都是针对单个CPU核心数为前提的,如果是多个CPU核心同时工作多线程的前提下,如果保证各个核心的高速缓存一致性呢?(数据还没有同步到主内存)

如果有这样一种传播机制,可以在cpu的一个核心更新完 Cache 之后,主动传播到其他的核心上。这样就可以解决同步的问题,但是仅仅是这个还是不够的,如果有四个cpu核心,内核1对缓存做了更改,内核2也对缓存做了更改,如果内核3和内核4接收到的更改顺序不一样,那也是不行的,所有也需要有一种串行化的机制。

总线嗅探机制和 MESI 协议

总线嗅探

就是前面说的那种传播机制,本质上就是把所有的读写请求都通过总线(Bus)广播给所有的 CPU 核心,然后让各个核心去“嗅探”这些请求,再根据本地的情况进行响应。

MESI 协议

MESI表示对 Cache Line(CPU高速缓存块)的四种标记:

  • M:代表已修改(Modified)
  • E:代表独占(Exclusive)
  • S:代表共享(Shared)
  • I:代表已失效(Invalidated)

它是一种写失效的协议,在写失效协议里面,只有一个CPU核心是负责写入数据(关键,解决串行的问题),其他核心只是同步读取到这个写入,但是不做任何操作。在负责写入数据的核心操作完之后,发送一个"失效"请求到其他的CPU核心(那个块失效了),其他的核心只通过这个请求判断自己是否有这个失效的块,有的话就标记为失效。

写失效协议

MESI协议的核心是E和S,在共享(s)状态下,因为同样的数据在多个 CPU 核心的 Cache 里都有。所以,当我们想要更新 Cache 里面的数据的时候,不能直接修改,而是要先向所有的其他 CPU 核心广播一个请求,要求先把其他 cpu 核心里面的 Cache,都变成无效的状态,然后再更新当前 Cache 里面的数据。

在独占(e)状态下,对 Cache 块的更新操作就只能在这个核心下操作,其他的核心是没有操作权限的,相当于加了一把写锁,任何数据操作都只会在这个核心下进行。在独占状态下的数据,如果收到了一个来自于总线的读取对应缓存的请求,它就会变成共享状态。这个共享状态是因为,这个时候,另外一个 CPU 核心,也把对应的 Cache Block,从内存里面加载到了自己的 Cache 里来。

思考

CPU,高速缓存,内存。在数据同步方面就像我们在编程过程中使用redis作为mysql的缓存层,同样也是需要面临和计算机组成一样的问题。以及多核cpu换从同步和应用程序的缓存集群同步问题。不管做什么都是一个发现问题,解决问题,优化解决问题的过程。站在巨人的肩膀看世界固然不错,但是也同样希望能有所突破。

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

推荐阅读更多精彩内容