合租網(wǎng)站設(shè)計(jì)經(jīng)典廣告推廣詞
物理內(nèi)存的組織結(jié)構(gòu)
我們平時(shí)所稱的內(nèi)存也叫隨機(jī)訪問(wèn)存儲(chǔ)器也叫 RAM 。RAM 分為兩類:
- 一類是靜態(tài) RAM( SRAM ),這類 SRAM 用于 CPU 高速緩存 L1Cache,L2Cache,L3Cache。其特點(diǎn)是訪問(wèn)速度快,訪問(wèn)速度為 1 - 30 個(gè)時(shí)鐘周期,但是容量小,造價(jià)高。
- 另一類則是動(dòng)態(tài) RAM ( DRAM ),這類 DRAM 用于我們常說(shuō)的主存上,其特點(diǎn)的是訪問(wèn)速度慢 (相對(duì)高速緩存),訪問(wèn)速度為 50 - 200 個(gè)時(shí)鐘周期,但是容量大,造價(jià)便宜些(相對(duì)高速緩存)。
器模塊通常以 64 位為單位( 8 個(gè)字節(jié))傳輸數(shù)據(jù)到存儲(chǔ)控制器上或者從存儲(chǔ)控制器傳出數(shù)據(jù)。
多個(gè)存儲(chǔ)器模塊連接到存儲(chǔ)控制器上,就聚合成了主存。
DRAM 芯片就包裝在存儲(chǔ)器模塊中,每個(gè)存儲(chǔ)器模塊中包含 8 個(gè) DRAM 芯片,依次編號(hào)為0-7:
每一個(gè) DRAM 芯片的存儲(chǔ)結(jié)構(gòu)是一個(gè)二維矩陣,二維矩陣中存儲(chǔ)的元素稱為超單元(supercell),每個(gè) supercell 大小為一個(gè)字節(jié)(8 bit),每個(gè) supercell 都有一個(gè)坐標(biāo)地址(i,j)。
i 表示二維矩陣中的行地址,在計(jì)算機(jī)中行地址稱為 RAS (row access strobe,行訪問(wèn)選通脈沖)。 j 表示二維矩陣中的列地址,在計(jì)算機(jī)中列地址稱為 CAS (column access strobe,列訪問(wèn)選通脈沖)。
DRAM 芯片的訪問(wèn)
DRAM 芯片的 IO 單位為一個(gè) supercell ,也就是一個(gè)字節(jié)(8 bit)。
CPU 如何讀寫主存
CPU 從內(nèi)存讀取數(shù)據(jù)過(guò)程
假設(shè) CPU 現(xiàn)在需要將物理內(nèi)存地址為 A 的內(nèi)容加載到寄存器中進(jìn)行運(yùn)算。
對(duì)于第三步,存儲(chǔ)控制器如何通過(guò)物理內(nèi)存地址 A 從主存中讀取出對(duì)應(yīng)的數(shù)據(jù) X 的?
存儲(chǔ)控制器會(huì)將物理內(nèi)存地址轉(zhuǎn)換為 DRAM 芯片中 supercell 在二維矩陣中的坐標(biāo)地址(RAS,
CAS),并將這個(gè)坐標(biāo)地址發(fā)送給對(duì)應(yīng)的存儲(chǔ)器模塊。隨后存儲(chǔ)器模塊會(huì)將 RAS 和 CAS 廣播到存儲(chǔ)器模塊中的所有 DRAM 芯片。依次通過(guò) (RAS,CAS) 從 DRAM0 到 DRAM7 讀取到相應(yīng)的supercell 。
我們知道一個(gè) supercell 存儲(chǔ)了一個(gè)字節(jié)( 8 bit ) 數(shù)據(jù),這里我們從 DRAM0 到 DRAM7 依次讀
取到了 8 個(gè) supercell 也就是 8 個(gè)字節(jié),然后將這 8 個(gè)字節(jié)返回給存儲(chǔ)控制器,由存儲(chǔ)控制器將數(shù)
據(jù)放到存儲(chǔ)總線上。
- CPU 總是以 word size 為單位從內(nèi)存中讀取數(shù)據(jù),在 64 位處理器中的 word size 為 8 個(gè)字節(jié)。64 位的內(nèi)存每次只能吞吐 8 個(gè)字節(jié)。
- CPU 每次會(huì)向內(nèi)存讀寫一個(gè) cache line 大小的數(shù)據(jù)( 64 個(gè)字節(jié)),但是內(nèi)存一次只能吞吐?8 個(gè)字節(jié)。
所以在物理內(nèi)存地址對(duì)應(yīng)的存儲(chǔ)器模塊中,DRAM0 芯片存儲(chǔ)第一個(gè)低位字節(jié)( supercell ),DRAM1 芯片存儲(chǔ)第二個(gè)字節(jié),......依次類推 DRAM7 芯片存儲(chǔ)最后一個(gè)高位字節(jié)。
由于存儲(chǔ)器模塊中這種由 8 個(gè) DRAM 芯片組成的物理存儲(chǔ)結(jié)構(gòu)的限制,內(nèi)存讀取數(shù)據(jù)只能是按照
物理內(nèi)存地址,8 個(gè)字節(jié) 8 個(gè)字節(jié)地順序讀取數(shù)據(jù)。所以說(shuō)內(nèi)存一次讀取和寫入的單位是 8 個(gè)字
節(jié)。?
CPU 向內(nèi)存寫入數(shù)據(jù)過(guò)程
注:CPU 只會(huì)訪問(wèn)虛擬內(nèi)存地址,總線上傳輸?shù)氖俏锢韮?nèi)存地址,在操作總線之前,需要通過(guò)一個(gè)地址轉(zhuǎn)換硬件將虛擬內(nèi)存地址轉(zhuǎn)換為物理內(nèi)存地址,然后將物理內(nèi)存地址作為地址信號(hào)在總線上傳輸。
從 CPU 角度看物理內(nèi)存模型
FLATMEM 平坦內(nèi)存模型
將物理內(nèi)存劃分成連續(xù)的內(nèi)存頁(yè),每頁(yè)的大小是固定的,用一個(gè)數(shù)組來(lái)組織這些連續(xù)的物理內(nèi)存頁(yè) struct page 結(jié)構(gòu),其在數(shù)組中對(duì)應(yīng)的下標(biāo)即為 PFN。這種內(nèi)存模型就叫做平坦內(nèi)存模型。
內(nèi)核中使用了一個(gè) mem_map 的全局?jǐn)?shù)組用來(lái)組織所有劃分出來(lái)的物理內(nèi)存頁(yè)。mem_map 全局
數(shù)組的下標(biāo)就是相應(yīng)物理頁(yè)對(duì)應(yīng)的 PFN 。
在平坦內(nèi)存模型下 ,page_to_pfn 與 pfn_to_page 的計(jì)算邏輯非常簡(jiǎn)單,本質(zhì)就是基于mem_map 數(shù)組進(jìn)行偏移操作。?
Linux 早期使用的就是這種內(nèi)存模型,因?yàn)樵?Linux 發(fā)展的早期所需要管理的物理內(nèi)存通常不大
(比如幾十 MB),那時(shí)的 Linux 使用平坦內(nèi)存模型 FLATMEM 來(lái)管理物理內(nèi)存就足夠高效了。
內(nèi)核中的默認(rèn)配置是使用 FLATMEM 平坦內(nèi)存模型。
?
DISCONTIGMEM 非連續(xù)內(nèi)存模型
SPARSEMEM 稀疏內(nèi)存模型
隨著內(nèi)存技術(shù)的發(fā)展,內(nèi)核可以支持物理內(nèi)存的熱插拔了,這樣一來(lái)物理內(nèi)存的不連續(xù)就變?yōu)槌B(tài)了,在 DISCONTIGMEM 內(nèi)存模型中,其實(shí)每個(gè) node 中的物理內(nèi)存也不一定都是連續(xù)的,而且每個(gè) node 中都有一套完整的內(nèi)存管理系統(tǒng),如果 node 數(shù)目多的話,那這個(gè)開(kāi)銷就大了。
SPARSEMEM 稀疏內(nèi)存模型已經(jīng)完全覆蓋了前兩個(gè)內(nèi)存模型的所有功能,因此稀疏內(nèi)存模型可被用于所有內(nèi)存布局的情況。
什么是物理內(nèi)存熱插拔?
對(duì)于 SPARSEMEM 內(nèi)存模型,每個(gè) mem_section 都可以在系統(tǒng)運(yùn)行時(shí)改變 offline ,online 狀態(tài),以便支持內(nèi)存的熱插拔(hotplug)功能。 當(dāng) mem_section offline 時(shí), 內(nèi)核會(huì)把這部分內(nèi)存隔離開(kāi), 使得該部分內(nèi)存不可再被使用, 然后再把 mem_section 中已經(jīng)分配的內(nèi)存頁(yè)遷移到其他 mem_section 的內(nèi)存上。
從 CPU 角度看物理內(nèi)存架構(gòu)
一致性內(nèi)存訪問(wèn) UMA 架構(gòu)
非一致性內(nèi)存訪問(wèn) NUMA 架構(gòu)
注:NUMA 節(jié)點(diǎn)中可能會(huì)包含多個(gè) CPU,這些 CPU 均是物理 CPU。
在 NUMA 架構(gòu)下,只有 DISCONTIGMEM 非連續(xù)內(nèi)存模型和 SPARSEMEM 稀疏內(nèi)存模型是可用的。而 UMA 架構(gòu)下,前面介紹的三種內(nèi)存模型都可以配置使用。
NUMA 的內(nèi)存分配策略
NUMA 的內(nèi)存分配策略是指在 NUMA 架構(gòu)下 CPU 如何請(qǐng)求內(nèi)存分配的相關(guān)策略。
內(nèi)核如何管理 NUMA 節(jié)點(diǎn)
內(nèi)核如何統(tǒng)一組織 NUMA 節(jié)點(diǎn)
在內(nèi)核 2.4 版本之前,內(nèi)核使用一個(gè)單鏈表將這些 NUMA 節(jié)點(diǎn)串聯(lián)起來(lái);內(nèi)核 2.4 版本之后,內(nèi)核使用了一個(gè)全局?jǐn)?shù)組來(lái)管理所有的 NUMA 節(jié)點(diǎn)。
UMA 架構(gòu)下,內(nèi)核中只用一個(gè) NUMA 節(jié)點(diǎn)來(lái)管理所有物理內(nèi)存。?
NUMA 節(jié)點(diǎn)物理內(nèi)存區(qū)域的劃分?
內(nèi)核會(huì)根據(jù)各個(gè)物理內(nèi)存區(qū)域的功能不同,將 NUMA 節(jié)點(diǎn)內(nèi)的物理內(nèi)存主要?jiǎng)澐譃橐韵滤膫€(gè)物理內(nèi)存區(qū)域:
除了上面四種物理內(nèi)存區(qū)域,還有兩個(gè)區(qū)域:?
既然有了這些實(shí)際的物理內(nèi)存區(qū)域,那么內(nèi)核為什么又要?jiǎng)澐殖鲆粋€(gè) ZONE_MOVABLE?這樣的虛擬內(nèi)存區(qū)域呢??
?
內(nèi)核中請(qǐng)求分配的物理頁(yè)面數(shù)只能是 2 的次冪。
CPU 高速緩存
程序局部性原理表現(xiàn)為:時(shí)間局部性和空間局部性。時(shí)間局部性是指如果程序中的某條指令一旦執(zhí)行,則不久之后該指令可能再次被執(zhí)行;如果某塊數(shù)據(jù)被訪問(wèn),則不久之后該數(shù)據(jù)可能再次被訪問(wèn)??臻g局部性是指一旦程序訪問(wèn)了某個(gè)存儲(chǔ)單元,則不久之后,其附近的存儲(chǔ)單元也將被訪問(wèn)。?
?