成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CPU 緩存一致性問題深度解析

系統
本文將從最基本的總線嗅探技術入手,逐步深入探討幾種主流的緩存一致性協議,特別是 MESI 協議。

在現代多核處理器系統中,數據的一致性和訪問效率是確保高性能計算的關鍵因素之一。隨著技術的發展和應用需求的增長,傳統的單核處理架構已經無法滿足日益復雜的計算任務要求。因此,多核乃至多處理器系統的出現成為必然趨勢。然而,在這樣的并行計算環境中,如何保證各個核心之間的數據同步與一致成為了新的挑戰。

緩存一致性問題是多核系統中最為核心的問題之一。當多個處理器核心共享同一塊內存區域時,每個核心都可能擁有該內存區域的副本。如果一個核心修改了其緩存中的數據,其他核心必須能夠及時感知這一變化,以保持數據的一致性。為了解決這個問題,各種緩存一致性協議應運而生。

本文將從最基本的總線嗅探技術入手,逐步深入探討幾種主流的緩存一致性協議,特別是MESI協議。我們將詳細介紹這些協議的工作原理、優缺點以及對系統性能的影響。希望通過本文的講解,讀者能夠對緩存一致性問題有一個全面的理解,并掌握解決這一問題的有效方法。

一、詳解CPU體系結構和數據讀寫機制

1.CPU Cache Line是什么

每個CPU都會有自己的二級緩存,其中一級緩存分為數據緩存和指令緩存,這些緩存的數據都是從內存中讀取的,而且每次都會加載一個cache line,而CPU Cache Line的物理結構大體如下圖所示:

關于cache line的大小可以使用命令鍵入如下指令進行查看:

cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size

以筆者的服務器為例,可以看到對應的輸出結果為64:

同時對應的我們給出CPU緩存與內存的體系結構圖,其中按照數值減小訪問速度越快,不同CPU核心都有獨立的二級緩存,而三級緩存則是共享緩沖區,與物理內存空間直接打交道:

如果開發者能夠很好的使用緩存技術,那么程序的性能就會很高,具體可以參照筆者之前寫的這篇文章

計算機組成原理-基于計組CPU的基礎知識進行代碼調優:https://blog.csdn.net/shark_chili3007/article/details/123038653

2.CPU Cache和內存同步技術

(1) 寫直達(Write Through)技術

寫直達技術解決cache和內存同步問題的方式很簡單,例如CPU1要操作變量i,先看看cache中有沒有變量i,若有則直接操作cache中的值,然后立刻寫回內存。 若變量i不在cache中,那么CPU就回去內存中加載這個變量到cache中進行操作,然后立刻寫回內存中。 這樣做的好處就是實現簡單,缺點也很明顯,因為每次都要將修改的數據立刻寫回內存,這其中的寫入開銷對于需要高速運轉的CPU是一種災難:

(2) 回寫技術(Write Back)

Write Back即一種延遲寫技術,為了避免上一種操作頻繁寫入內存的資源開銷而提出的一種方案,它的工作原理是將數據加載到CPU cache并修改但并不寫入內存,僅僅是將數據標記為dirty,由此減少寫入內存的次數,如果沒有發生緩存置換,這些數據就不會被寫入內存中。

舉個例子,CPU cache加載data1到緩存中,并進行數次修改操作,隨后cpu cache發生data10不在緩存中需要從內存中加載,又因為cpu cache空間不足,此時觸發緩存置換算法便將最近最少使用且是dirty的數據寫到內存中,并將data10加載到cpu cache里:

可以看出這種寫法如果出現在毫秒級的斷電場景可能存在數據丟失問題,又因為延遲寫的原因,對應的數據加載在讀未命中的情況下存在兩次操作:

  • 將需要置換的數據寫入內存。
  • 將需要加載的數據拉到cpu cache。

這里我們也補充一下幾種比較常見的緩存置換算法:

  • Belady異常(Belady’s Anomaly)
  • 最近最少使用(Least Recently Used Algorithm)
  • 先進先出(FIFO)
  • 后進先出(LIFO)

二、詳解CPU緩存一致性問題

1.多核心緩存修改問題

當一臺計算機由多核CPU構成的時候,每個CPU都從內存里加載相同的變量i(初值為0)進行累加操作,我們試想這種情況:

  • CPU-0加載內存變量i值為0。
  • CPU-0自增為1準備寫回內存。
  • CPU-1加載內存變量i值為0。
  • CPU-1自增為1準備寫回內存。 兩次自增得到結果1,這就是經典的緩存一致性問題:

而解決這個問題我們只要攻破以下兩點問題即可:

  • 寫傳播問題:即當前Cache中修改的值要讓其他CPU知道
  • 事務串行化:例如CPU1先將變量i改為100,CPU2再將基于當前變量i的值乘2。我們必須保證變量i先加100,再乘2。

2.總線嗅探(Bus Snooping)

總線嗅探是解決寫傳播的解決方案,舉個例子,當CPU1更新Cache中變量i的值時,就會通知其他核心變量i已被修改,當其他CPU發現自己Cache中也有這個值的時候就會將CPU1中cache的結果更新到自己的cache中。 這種方式缺點很明顯,CPU必須無時不刻監聽變化,而且出現變化的數據自己還不一定有,這樣的作法增加了總線的壓力:

而且也不能保證事務串行化,如下圖,CPU-0加載了變量修改了值通知其他CPU這個值有變化了。 而CPU-1也改了i的值,按照正常的邏輯CPU-2、CPU-3的值應該是先變為100在變為200。 但是CPU-3先收到CPU-2的通知先改為200再收到CPU-0的通知變為100,這就導致的數據不一致的問題,即事務串行化失敗:

3.MESI協議如何解決上述問題

MESI是總線嗅探的改良版,他很好的解決了總線的帶寬壓力,以及很好的解決了數據一致性問題。 在介紹MESI之前,我們必須了解以下MESI是什么。

  • M(Modified,已修改),MESI第一個字母M,代表著CPU當前L1 cache中某個變量i的狀態被修改了,而且這個數據在其他核心中都沒有。
  • E(Exclusive,獨占),說白了就是CPUA將數據加載自己的L1 cache時,其他核心的cache中并沒有這個數據,所以CPUA將這個數據加載到自己的cache時標記為E。
  • (S:Shared,共享):說明CPUA在加載這個數據時,其他CPU已經加載過這個數據了,這時CPUA就會從其他CPU中拿到這個數據并加載到L1 cache中,并且所有擁有這個值的CPU都會將cache中的這個值標記為S。
  • (I:Invalidated,已失效):當CPUA修改了L1 cache中的變量i時,發現這個值是S即共享的數據,那么就需要通知其他核心這個數據被改了,其他CPU都需要將cache中的這個值標為I,后面要操作的時,必須拿到最新的數據在進行操作。

好了介紹完這幾個狀態之后,我們不妨用一個例子過一下這個流程:

  • CPU-0要加載變量i,發現變量i不在cache中,于是去內存中加載數據,此時通過總線發個消息給其他核心,其他核心的cache中并沒有這條數據,所以這個變量的cache中的狀態為E(獨占)。
  • CPU-1也加載這個數據了,在總線上發了個消息,發現CPU-0有這個數據且并沒有修改或者失效的標志,于是他們一起將這個變量i狀態設置為S(共享)
  • CPU-0要改變量i值了,發消息給其他核心,其他核心收到消息將自己的變量i設置為I(無效),CPU-0改完后將數據設置為M(已修改)
  • CPU-0又要改變量i的值了,而且看到變量i的狀態為M(已修改),說明這個值是最新的數據,所以不發消息給其他核心了,直接更新即可。
  • CPU-1要加載變量i,發現狀態為I,于是CPU-0將值寫回內存,此時狀態為E,然后CPU-1讀取這個值,大家狀態都變為S共享。
  • CPU-0要加載新的變量i了,而且變量x要使用的cache空間正是變量i的,所以CPU-0將值寫回內存中,這時候內存和最新數據同步了。

三、小結

自此,我們從多核CPU體系結構所引發緩存一致性問題為入手,再從總線嗅探到MESI協議深度講解了緩存一致性問題的解決方案,希望對你有幫助。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2024-04-11 13:45:14

Redis數據庫緩存

2022-09-06 15:30:20

緩存一致性

2020-09-04 06:32:08

緩存數據庫接口

2019-02-13 11:04:42

系統緩存軟件

2023-04-13 08:15:47

Redis緩存一致性

2016-11-29 09:00:19

分布式數據一致性CAS

2022-08-11 07:55:05

數據庫Mysql

2021-09-08 11:03:13

緩存數據庫性能

2025-06-16 02:11:00

2022-12-14 08:23:30

2024-11-07 22:57:30

2023-08-14 08:10:33

CPU緩存RFO

2019-03-27 13:56:39

緩存雪崩穿透

2020-10-26 19:25:23

CPU緩存Cache

2022-09-16 09:46:42

緩存數據庫

2025-03-24 10:17:01

2012-09-24 09:35:42

分布式系統

2021-06-30 21:13:49

CPUCache數據

2020-05-12 10:43:22

Redis緩存數據庫

2020-06-01 22:09:48

緩存緩存同步緩存誤用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内精品一区二区三区 | 免费观看成人性生生活片 | 最近中文字幕免费 | 日韩午夜电影在线观看 | 欧美日韩三级视频 | 狠狠干夜夜草 | 国产精品日韩在线 | 亚洲精品www | 亚洲美女一区二区三区 | 成人免费看片网 | 久久精品国产一区 | 亚洲免费精品 | 黄色国产视频 | 91在线观看| 欧美国产精品一区二区三区 | 欧美人成在线视频 | 日韩精品中文字幕一区二区三区 | 日韩精品视频中文字幕 | 欧美色性| 成人免费视频一区二区 | 欧美一区二区三区视频 | 中文字幕免费 | 亚洲av毛片| 亚洲精品一区二区三区蜜桃久 | 天天天天天天操 | 中文字幕日韩专区 | 日韩精品免费一区 | 日本一区二区三区精品视频 | 中文字幕高清av | 国产精品视频一区二区三区 | 亚洲精品免费在线观看 | 成人精品网 | 亚洲精品二三区 | 欧美色综合一区二区三区 | 久久只有精品 | av中文网| 国产一卡二卡三卡 | 亚洲国产一 | 中文字幕高清在线 | 日韩中文字幕在线观看视频 | 一级免费毛片 |