最近學習體系結構,對共享內存 (shared memory) 的系統(tǒng)的理解不佳,感覺需要專門補一補。于是找到了這本小冊子:A Primer on Memory Consistency and Cache Coherence,看起來似乎很不錯呼胚。陸放翁說得好:“紙上得來終覺淺,絕知此事要躬行息裸∮”雖然我是沒法把這些東西實現(xiàn)出來了,但讀書筆記還是應該做一做的呼盆。
這本書主要介紹在共享內存的系統(tǒng)中的兩個概念:memory consistency 和 cache coherence年扩。這兩者似乎分別被翻譯為“內存一致性”和“緩存一致性”,不過這里的“一致性”卻對應著兩個不同的詞访圃,因此我在下文中還是老老實實寫英文吧厨幻。
Consistency
Memory consistency 是用來定義正確性的。然而這個“正確性”本身就很難下定義腿时。在一個單線程的任務中况脆,我們很容易說明什么是正確的,因為指令之間是有邏輯上的順序的批糟;即使有 out-of-order execution格了,那處理器也必須保證它看起來像是順序執(zhí)行的。但是對于多線程的任務徽鼎,這就很麻煩了:由于多條指令可能是并發(fā)執(zhí)行的盛末,我們在沒有進一步的約束條件下是很難說只有唯一一種正確結果的,有可能很多種結果都可以被認為是對的纬傲。
文中舉了一個現(xiàn)實生活中的例子满败,我覺得用 CS 的語言講出來大概是:有兩個線程分別訪問共享內存中的同一個位置肤频,前者更新一條數(shù)據(jù)叹括,后者要獲取這個更新的數(shù)據(jù)。本來應該先寫再讀的宵荒,這樣才能保證后者讀來的是正確的汁雷;但是不知怎么的,在物理上卻是后者先讀了报咳,那么它自然就讀到了無效的數(shù)據(jù)侠讯,這就是一個 consistency 的問題。一個 consistency model 需要定義這種行為是不是正確的暑刃。
Coherence
Cache coherence 是對程序不可見的厢漩,是讓 shared memory 系統(tǒng)上的各個 caches 合在一起看起來就像一個單核的機器上的 cache 一樣的。我覺得這句話說得比較關鍵:
Correct coherence ensures that a programmer cannot determine whether and where a system has caches by analyzing the results of loads and stores. This is because correct coherence ensures that the caches never enable new or different functional behavior.
但說實話這個理由我沒看懂岩臣,先放著溜嗜。
文中的現(xiàn)實生活的例子大概是這個意思:有一個核心宵膨,它自己的 cache 里記錄了內存中某個地方的數(shù)據(jù),然后這個數(shù)據(jù)被其他人改了炸宵,因此它自己的 cache 里的數(shù)據(jù)就無效 (stale) 了辟躏,這就需要 coherence 來進行約束。
結語
我覺得我對 consistency 和 coherence 的異同的理解還不是很到位土全,甚至有可能是錯誤的捎琐。慢慢往下讀吧。