1. 程式人生 > >《深入理解計算機系統》筆記(二)記憶體和快取記憶體的原理【插圖】

《深入理解計算機系統》筆記(二)記憶體和快取記憶體的原理【插圖】

歡迎檢視《深入理解計算機系統》系列部落格

--------------------------------------------------------------------------------------------------------------------

    《深入計算機系統》筆記(一)主要是講解程式的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程式效能”,這兩章的筆記繼續往後延遲!

    《深入計算機系統》的一個很大的用處是:給了我們很多定義式的解釋,或者稱之為科學的解釋,這將成為我的理論依據;不再是網上一些自稱老手的閒聊了。不愧是計算機最牛逼的大學卡內基-梅隆大學的教材。

    該blog跳過第四章CPU的結構,第五章優化程式效能,也沒有詳細討論快取記憶體的機制。

六、儲存器層次結構

有必要將儲存器層次結構再次列出來:


快取記憶體的“行”、“塊”和“組”是什麼意思?參考本bolg最下面“快取記憶體的物理邏輯圖”

    字:一個word的意思,IA32中指的是16位,

    塊:是一個固定大小的資訊包,在快取記憶體和主存之間來回傳送。塊包含32~64個位元組。所以記憶體中只是資訊,成為塊

    行:快取記憶體中儲存塊已經其他資訊的容器。所以,行總是一個塊的大小,通常“行”和“塊”可以互換使用。結合上圖快取記憶體既有塊和其他資訊,稱之為“行”

    組:是一個或者多個行

---》之前知識停留在RAM和ROM,現在再往前推進一步RAM也分為靜態SRAM和動態的DRAM。SRAM主要用於快取記憶體DRAM用於記憶體

    SRAM將每個位儲存在一個雙穩態的儲存器單元裡。每個單元是用一個六個電晶體電路來實現。它可以無限期地保持在兩個不同的電壓配置或狀態之一。就是說只要有電,他就會永遠地保持它的值。即使有干擾,例如電子噪音、擾亂電壓,當干擾消除時,電路就會恢復到穩定值。下圖說明了“雙穩態的”效果,採用倒擺的時鐘。


難道這個原理可以解釋:電磁干擾造成電視畫面錯亂,手機訊號干擾麼?

DRAM將沒位儲存為一個電容,這個電容非常小,通常只有30毫微微法拉。與SRAM不同的是DRAM的儲存單元對干擾非常敏感。當電容電壓沒擾亂之後,他就永遠無法恢復了。所以DRAM需要不斷重新整理電容。暴露在光線下會導致電容電壓改變。實際上,數碼照相機和攝像機中的感測器本質上就是DRAM單元的陣列。【驚訝】

無論如何SRAM和DRAM都是易失的(volatile)

    下面討論DRAM的讀取機制:

    

這種二維陣列的缺點是:必須分兩步傳送地址,增加儲存時間。

---》DDR2和DDR3的記憶體的區別。Double data-rate synchronous  DRAM頻寬分別是4位和8位。DDR3也分為1333MHz和1600MHz

---》磁碟,略過。

---》DRAM和磁碟的效能滯後於CPU的新能,雖然他們的效能都在增長。

這也就是為什麼CPU和記憶體之間的快取記憶體一直增多。

---》人們發現無法像以前那樣增大CPU的時鐘頻率了,計算機制造商撞上了“能量牆”因為如果那樣晶片的功耗會太大。所以多核就出現了,多核出現後CPU的時鐘有所減少,並區域平緩。但是有效CPU週期時間還是像之前的速率增長。

---》快取記憶體執行機制。p(406)


---》緩衝區命中。

    為什麼第二次啟動程式要比第一次快的多,就是因為緩衝區命中的原理。第一次啟動後很多資料還停留在多級緩衝區中,這個時候如果再次啟動就會減少資料移動次數,也就減少程式的啟動時間。從上圖中我們發現,有部分資料存在與快取記憶體中,就不用從記憶體中取了。

    舉例子:灌溉小麥,使用100米的水渠(普通水渠,不是水泥那種),假如水泵出水是固定的。

    第一次使用時,水渠中的水前進很慢,走完100米的水渠大約需要10分鐘,這是因為:有一些水會損失掉,即被滲到水渠下面的泥土中了。這部分水可以看作是“高階快取”中的水。

    第二次(時間較短)再灌溉小麥時,水渠的水走的很快,花費了2分鐘,因為相對於第一次來說,水渠不需要王下面滲很多水了。如果時間長了,隔了2天,水渠中的滲的水再往下滲。

    第三次灌溉(時間較長),同樣需要一些水滲到水渠下泥土裡面,所以,還是需要10分鐘。

    用計算機中的例項:當一條載入指令指示CPU從記憶體地址A讀出一個字時,他將地址A傳送給快取記憶體。如果快取記憶體證儲存著A處的地址的按個拷貝,它就立即將那個字發給CPU。這要比從記憶體中讀取快很多。

---》core i7的快取記憶體層次結構

注意:只儲存指令的快取記憶體i-cache,只儲存資料的快取記憶體叫d-cache。既儲存指令又儲存資料的成為統一的快取記憶體。


就像第一章說的那樣快取記憶體至關重要,特別是“緩衝區命中”這個技術如果優化好了,速度將會很大改進。

快取記憶體的物理邏輯圖:

    

---》直接對映快取記憶體p(410)

根據E(快取記憶體行)快取記憶體被分為不同的類。每個組只有一行(E=1)的快取記憶體唄稱為直接對映快取記憶體    雖然一個整形可能在暫存器中,而整形陣列,則可能存在與快取記憶體中。

---》衝突不命中。請看下面的例子:

float dotprod(float x[8], float y[8])
{
    float sum = 0.0;
    int i;
    for(i = 0;i < 8;i++)
        sum += x[i] * y[i];
    return sum;
}
當第一次迭代x[0]時,必定不命中,那麼會導致x[0]~x[3]的塊被載入到高速緩衝組0,下一次是y[0]的呼叫,又一次不命中,導致y[0]~y[3]的塊被拷貝到組0,從而覆蓋前一次x的值。如此迭代,下次x[1]的值繼續不命中,繼而將x[0]~x[3],覆蓋調y[0]~y[3]的值。這種就叫做衝突不命中,也叫”抖動“。本質原因是:x和y陣列被對映到同一個組。程式設計師可以避開這種抖動,但是我覺得編譯器應該解決這個問題。

原書中可能錯誤的地方不算多,但也影響到閱讀的心情。

p406圖6-24少了一個10的單元格,12單元格重複

p403圖6-21 a)函式名字應該為:int sumarraycol(int a[m][n]).

p199第一行最後應該為“偏移量”