內存一致性

示例代碼:

 1internal sealed class CacheCoherencyProblem
 2{
 3    private Byte m_initialized = 0;
 4    private Int32 m_value = 0;
 5
 6    public void Thread1()
 7    {
 8        m_value = 5;
 9        m_initialized = 1;
10    }

11
12    public void Thread2()
13    {
14        if (m_initialized == 1)
15        {
16            Console.Write(m_value);
17        }

18    }

19}

在多CPU或多內核CPU機器中,因CPU高速緩存機制,而產生內存不一致現象
假設在一個多CPU的機器上創建了該實例:
CPU1執行Thread1方法,CPU2執行Thread2方法,假定程序的執行順序爲:
1.CPU1的線程在讀取某個字節時,m_value字段的字節剛好位於這個字節之前,
  根據CPU高速緩存機制,m_value被預讀到CPU高速緩存中(因爲應用程序通常
  讀取的字節在內存中彼此互鄰,這樣可以提升性能)
2.CPU1執行Thread1,將m_value改爲5,但根據CPU高速緩存機制,改變僅暫時
  存在於CPU1的高速緩存中,直到某個時間纔會刷新到內存中。我們這裏假設
  此步操作可能需要經過很久纔會反映到內存中
3.CPU1繼續執行Thread1方法,同樣在自己的高速緩存中,修改了m_initialized
  的值爲1。但這次的m_initialized卻處在CPU1高速緩存的不同區段,結果
  是很快被刷新到內存中了。
4.CPU2開始執行Thread2方法,當訪問m_initialized值時,CPU2會因高速緩存中
  不存在m_initialized而去讀取內存,結果是CPU2讀取到m_initialized=1,隨即
  進入了if語句塊。
5.CPU2繼續執行Thread2方法,此時CPU2同樣也會因高速緩存中不存在m_value而
  去內存中取值,但因爲CPU1還沒有將自己的m_value=5更新到內存,所以CPU2取到

  了m_value=0



內存一致性

write back會涉及內存一致性,涉有到一系列的問題:

1)多處理要系統更新cache時,一個處理器修改了cache的內容,第二個處理器將不能訪問這個cache,直到這個cache的內容被寫內存.
在現代處理器中硬件已經做了精心的設計,確保這種事情不會發生,硬件負責保持cache在各個CPU之間一致.

2)外圍硬件設備可以通過DMA(Direct Memory Access)訪問內存,而不讓處理器知道,也不會利用cache,這樣在內存和cache之間就會出現不同步的情況.
管理DMA的操作是操作系統的工作,比如設備驅動程序,它將保證內存與cache的一致性.

3)當在cache中的數據比內存中的數據老時,稱爲stale.如果軟件初始化DMA,使設備和RAM之間傳遞數據,那麼軟件必須告訴 CPU,cache中的條目必須失效.

4)當在cache中的數據比內存中的數據新時,稱爲dirty.在設備驅動程序允許一個設備經DMA從內存讀數據時,它必須確保所有的dirty 條目寫進內存.也叫做flushing或sync cache.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章