文章目錄
- 記憶體的存盤
- SRAM
- DRAM
- DRAM內部以及與記憶體控制模塊的互動(重點)
- DRAM與記憶體存盤
- CPU和記憶體的互動(重點)
- 磁盤
- 磁盤和CPU、記憶體的互動
- 區域性
- 參考文獻
之前在介紹linux——檔案的時候講了一下磁盤及其作業原理,然后又在程式員自我修養專欄講了一下程式在記憶體中的布局,但是我們還是沒有打通CPU和記憶體是怎么進行互動這一件事,這也是本文的一個目的,
記憶體呢,是存在于CPU和硬碟之間的一個橋梁,硬碟負責存盤資料,CPU負責對資料進行操作,而記憶體呢,則是他們兩個的緩沖區,要明白記憶體是如何和CPU甚至和磁盤互動的,就不得不先看一下記憶體的儲存器,
記憶體的存盤
記憶體的存盤器叫做隨機訪問存盤器,一般分為兩類:
- 靜態SRAM
- 動態DRAM
SRAM 比 DRAM更快,但是也貴的多,SRAM用來作為高速緩沖存盤器,一般用在CPU上,對!告訴快取Cache就是SRAM,而DRAM 則用來作為主存以及圖形系統的幀緩沖區,
SRAM
SRAM 將每個位存盤在一個雙穩態的存盤單元里,什么叫雙穩態呢?看下面這幅鐘擺圖:

每個單元都是用六個晶體管電路來實作的,這個電路有這樣一個特性:可以無限期保持在兩個不同的電壓狀態,也就是在上圖左(右)穩態,其他任何狀態都是不穩定的——從不穩定狀態開始,電路會迅速的轉移到兩個穩定狀態中的一個,
上圖其實有個地方應該是有偏差的,也就是中間那個狀態,原則上來說,當左右兩邊的作用力相同時,鐘擺在垂直的時候也能無限期地保持平衡,但是當左右兩邊稍微發生一點擾動,這個狀態就會變成左穩態或右穩態之一,而且一旦倒下,便不會有機會再站起來,我們稱這個狀態為亞穩態,
因為SRAM有雙穩態的特性,只要有電,它就會永遠的保持它的值,即使有干擾來擾亂電壓,當干擾時,電路就會恢復到穩定值,但是沒有電的話,雙穩態的狀態就不能保持了,意味著資料也就丟失了,這就是我們常說,電腦斷電后記憶體資料就會丟失的原因,
DRAM
DRAM將每個位存盤為對一個電容的充電,DRAM可以制造得非常密集——每個單元由一個電容和一個訪問晶體管組成,但是與SRAM不同的是,DRAM存盤器的單元對干擾非常敏感,當電容的電壓被擾亂之后,它就永遠不會恢復了,
下圖總結了SRAM和DRAM的區別,
- SRAM的存取比DRAM快
- SRAM對干擾不敏感
- SRAM每單元使用更多晶體管,密集度低,比DRAM更貴,功耗更大

DRAM內部以及與記憶體控制模塊的互動(重點)
再DRAM芯片中,每個大單元內部又有d個超單元,每個超單元都由w個DRAM單元組成(每個單元其實就是一個位),所以說,一個d*w的DRAM總共村拿出了dw位資訊,超單元被組織成一個r行c列的長方形陣列,其中r*c = d,每個單元有形如(i,j)的地址(i表示行,j表示列),

博主說:
還是有點抽象,這么說吧,假如說w = 8,也就是一個超單元存盤一個位元組,那么d個超單元就存盤d個位元組,
資訊通過稱為引腳(pin)的外部連接器流入和流出芯片,每個引腳攜帶一個1位的信號,上圖中給出了兩組引腳:
- 8個data引腳,他們能傳送一個位元組到芯片或從芯片傳出一個位元組
- 2個addr引腳,它們能攜帶2位的行和列超單元地址
每個DRAM芯片被連接到某個稱為記憶體控制器的電路,這個電路可一次傳送(讀出)w位到每個DRAM芯片,為了讀出超單元(i,j)的內容,記憶體控制器會將行地址 i 發送到DRAM,這個時候就會在超單元矩陣中選出 i 那一行,復制到內部行緩沖區,

然后地址引腳addr會把列地址 j 傳入,這個時候會在剛剛選出的哪一行中再選出第 j 個元素回傳給記憶體控制器以相應,

設計者把DRAM組織成二維陣列而不是我們平常抽象出的一維陣列的原因是降低芯片上地址引腳的數量,例如,圖中的那個128位的DRAM被組織成一個16個超單元的線性陣列(16*8 = 128),這個時候對引腳進行編號,那就是0~15,正好是2^4,需要四個addr引腳而不是兩個addr引腳,但是,二維陣列會進行兩步操作,所以它會比線性組織耗費更多的時間,
DRAM與記憶體存盤
DRAM 芯片被封裝在記憶體模塊(一個記憶體模塊會有多個DRAM),以64位為塊傳送資料到記憶體控制器,
下圖展示了記憶體模塊的基本思想,用8個64Mbits的8M*8的DRAM芯片,總共存盤64MB,這8個芯片編號0~7,每個超單元存盤主存的一個位元組,而用相應超單元地址(i,j)的8個超單元來表示主存中位元組地址A處的64位字,
博主說:
其實也就是A的第一個位元組存盤在DRAM 0的(i,j)位置,第二個位元組存盤在DRAM 1的(i,j)位置…

要取出記憶體地址A處,那么就去每個DRAM的(i,j)處去取這個相應的位元組再拼裝起來,
CPU和記憶體的互動(重點)
CPU和記憶體互動,記憶體在內部其實就反應在記憶體控制模塊和DRAM的互動,
資料流通過總線的電子電路在處理器和DRAM主存之間來來回回, 每次CPU和主存之間的資料傳送都是通過一系列步驟來完成,這些步驟稱為總線事務, 其中讀事務從主存傳送資料到CPU,寫事務從CPU傳送資料到主存,
下圖中就是一個他們之間互動的一個圖:

我們現在再從一個匯編指令來看看到底怎么回事:movq A,%rax(地址A的內容被加載到暫存器%rax中)
上圖中的總線介面發起讀事務,有三個步驟:
- CPU將地址A放到系統總線上
- IO橋將信號傳遞到記憶體總線
- 主存感覺到記憶體總線上的地址資訊,從記憶體總線讀地址,從DRAM取出資料放到記憶體總線

寫事件呢,就相反,
磁盤
磁盤的存盤基本知識再linux——檔案中都講過了,這里也不贅述了,直接來講一講CPU如何去訪問磁盤的,
磁盤和CPU、記憶體的互動
CPU使用一種稱為記憶體映射I/O的技術來向I/O設備發送命令,在使用記憶體映射I/O的系統中,地址空間中有一塊地址是為與I/O設備通信保留的,每個這樣的地址稱為I/O埠,
來看一個簡單的例子:
假設磁盤控制器映射到埠0xa0,隨后,CPU通過執行三個對地址0xa0的存盤指令發起磁盤讀:
- 發送一個命令字,告訴磁盤發起一個讀,其中還發送了其他引數
- 指明應該讀的邏輯塊號
- 指明應該存盤磁盤扇區內容的主存地址
當CPU發出請求之后,它可不會采用同步的方式,這是對CPU性能的極大浪費,它會先處理其他的事情,
而磁盤收到這么一個讀命令,它將邏輯塊號翻譯成一個扇區地址,讀該扇區的內容,然后將這些內容傳送到主存,這期間不需要CPU的干涉,這個程序就叫直接記憶體訪問,當資料到主存之后,CPU就會發送一個中斷信號來通知CPU,
博主說:
還不知道中斷是什么的,可以參考博客:系統呼叫程序
這里面講了軟中斷,但實際上磁盤應該屬于硬中斷,差不太多,理解就可,



區域性
一個程式傾向于參考臨近于其他最近參考過的資料項的資料項,或者最近參考過的資料項本身,這中傾向就稱為區域性原理,
區域性常常有兩種不同的形式:
- 時間區域性: 在良好時間區域性的程式中,被參考過一次的記憶體位置可能在不遠的將來再被多次參考
- 空間區域性: 在良好空間區域性的程式中,被參考過一次的記憶體位置的附近位置可能在不遠的將來被參考
參考文獻
[1] 深入理解計算機系統 第六章 存盤器層次結構
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274396.html
標籤:其他
