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

來源:互聯網
上載者:User

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

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

    該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第一行最後應該為“位移量”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.