linux支援多種硬體體系結構,因此linux必須採用通用的方法來描述記憶體,以方便對記憶體進行管理,為此,linux有了記憶體節點、記憶體區、頁框的概念。
記憶體節點(node)
:主要依據cpu訪問代價的不同而劃分。多cpu下環境下,本地記憶體和遠端記憶體就是不同的節點。核心以struct pg_data_t來描述記憶體節點。
記憶體分割槽(zone)
:linux對記憶體節點再進行劃分,分為不同的分割槽。核心以struct zone來描述記憶體分割槽。通常乙個節點分為dma、normal和high memory記憶體區。
為什麼高階記憶體的邊界是896m?因為32位linux虛擬記憶體空間為0-4g,其中0-3g用於使用者態,3g-4g用於核心態。這意味著核心只有1g的虛擬位址空間,如果物理記憶體超過1g,核心就無法映**。linux採取的策略是,核心位址空間的前896m採用固定對映,對映方法是:虛擬位址-3g = 實體地址,只能對映到實體地址的前896m。也就是說核心虛擬位址空間的3g到3g+896m這部分,頁表的對映是固定的,系統初始化時就建立起來。而虛擬位址空間的最後128m,也就是3g+896m到4g部分採用動態對映,也就是說頁表對映的實體地址可變的。在系統執行過程中,通過更新頁表,就可以對映到不同的實體地址,當然也包括高階物理記憶體。
這主要解決了兩個問題:第一,這可以使核心位址空間對映到高階物理記憶體;第二,虛擬位址空間的3g+896m到4g部分,連續的虛擬位址空間可以對映到非連續的物理記憶體,只要通過更新頁表就可以做到,這和使用者態的虛擬記憶體對映採用了同樣這種方法。這在沒有大段連續的空閒實體地址時是非常重要的。
頁框(page frame)
:linux採用頁式記憶體管理,頁是物理記憶體管理的基本單位,每個記憶體分割槽又由大量的頁框組成。核心以struct page來描述頁框。頁框有很多屬性,這些屬性描述了這個頁框的狀態、用途等,例如是否被分配。
上圖中的zone_mem_map是乙個頁框的陣列,它記錄了乙個記憶體分割槽的所有頁框的使用情況。
備用記憶體區
:
在乙個記憶體區分配頁時,如果這個記憶體區沒有滿足條件的記憶體頁,則需要從其它記憶體區或從其它記憶體節點分配。linux為每個記憶體區都建立了備用記憶體區列表,當前記憶體區沒有滿足條件的記憶體時,就從備用記憶體區分配。比如,系統中有4個記憶體節點a,b,c,d,每個記憶體節點又分為dma、normal、highmemory記憶體區。對節點b來說,記憶體區分配列表可能是
b(highmemory)、b(normal)、b(dma)、
a(highmemory)、a(normal)、a(dma)、
c(highmemory)、c(normal)、c(dma)、
d(highmemory)、d(normal)、d(dma)。
分配記憶體時,優先從本地記憶體節點分配,再從其它記憶體節點分配。對乙個記憶體節點,優先從highmemory分配,再從normal或dma分配。
Linux交換分割槽記憶體優化
一般預設值都是60 也就是說,你的內存在使用到100 60 40 的時候,就開始出現有交換分割槽的使用。大家知道,記憶體的速度會比磁碟快很多,這樣子會加大系統io,同時造的成大量頁的換進換出,嚴重影響系統的效能,所以我們在作業系統層面,要盡可能使用記憶體,對該引數進行調整。要想永久調整的話,需要將 ...
Linux記憶體管理之二 記憶體節點和記憶體分割槽
uma和numa uma uniform memory access 即一致性記憶體訪問。這種情況下,cpu訪問記憶體的任何位置,代價都是一樣的。numa non uniform memory access 即非一致性記憶體訪問。這種情況下,cpu訪問不同位置的記憶體,代價是不一樣的。在多cpu情況...
2015 08 24記憶體分割槽
1 記憶體區域的劃分 從低到高 1.棧區 2.堆區 重點 3.靜態區 全域性區 4.常量區 5.區 2 static intnumber 10 被static 修飾的全域性變數生命週期隨著程式的建立而建立,隨著程式的消失而消失 3 區域性變數 定義在函式內部的變數就叫做區域性變數,區域性變數都是儲存...