上一章我們梳理了node
,zone
,page frame
的整個流程,本章就來整理其關係和資料結構之間的關係。
numa(non-uniform memory access,非統一記憶體訪問)和uma(uniform memory access,統一記憶體訪問):
結點node:
zone:
頁幀page:
linux採用node、zone和頁**結構來描述物理記憶體的,如圖所示
linux採用乙個struct pg_data_t結構體來描述系統的記憶體,每乙個node都對應乙個struct pglist_data,系統中每個節點都掛接在乙個pgdat_list列表中,對於numa系統中乙個,使用的全域性變數struct pglist_data __refdata contig_page_data
。
下面就對結構體提的主要域進行說明
結構體成員變數
說明node_zones
該結點的zone型別,一般包括zone_highmem、zone_normal和zone_dma三類,包含了節點中各個記憶體域的資料結構
node_zonelists
指定了備用節點及其記憶體域列表,以便在當前結點沒有可用空間時,在備用結點分配記憶體
nr_zones
該結點的 zone 個數,可以從 1 到 3,但並不是所有的結點都需要有 3 個 zone
node_mem_map
它是 struct page 陣列的第一頁,該陣列表示結點中的每個物理頁框。根據該結點在系統中的順序,它可在全域性 mem_map 陣列中的某個位置
node_start_pfn
當前numa節點第一頁幀邏輯編號。在uma總是0.
node_present_pages
總共可用的頁面數
node_spanned_pages
總共的頁面數,包括有空洞的區域
kswapd
頁面**程序
每個結點的記憶體被分為多個塊,稱為zones,它表示記憶體中一段區域。乙個zone用struct_zone_t結構描述,zone的型別主要有zone_dma、zone_normal和zone_highmem。zone_dma位於低端的記憶體空間,用於某些舊的isa裝置,isa匯流排的直接記憶體儲存dma,只能對ram的前16mb進行定址。zone_normal的記憶體直接對映到linux核心線性位址空間的高階部分,許多核心操作只能在zone_normal中進行。因此對於核心來說, 不同範圍的物理記憶體採用不同的管理方式和對映方式,linux使用enum zone_type來標記核心所支援的所有記憶體區域
enum zone_type
其定義如下表所示
管理記憶體域
描述zone_dma
標記了適合dma的記憶體域.該區域的長度依賴於處理器型別.這是由於古老的isa裝置強加的邊界. 但是為了相容性,現代的計算機也可能受此影響
zone_dma32
標記了使用32位位址字可定址,適合dma的記憶體域,在32位系統中,本區域是空的, 即長度為0mb,在alpha和amd64系統上,該記憶體的長度可能是從0到4gb
zone_normal
標記了可直接對映到記憶體段的普通記憶體域.這是在所有體系結構上保證會存在的唯一記憶體區域
zone_highmem
標記了超出核心虛擬位址空間的物理記憶體段,因此這段位址不能被核心直接對映
zone_movable
核心定義了乙個偽記憶體域zone_movable,在防止物理記憶體碎片的機制memory migration中需要使用該記憶體域.供防止物理記憶體碎片的極致使用
zone_devic
為支援熱插拔裝置而分配的non volatile memory非易失性記憶體
zone是用struct zone_t描述的,它跟蹤頁框使用、空閒區域和鎖等資訊,結構體中主要域說明如下
結構體成員變數
說明watermark
水位值,wmark_min/wmark_lov/wmark_high,頁面分配器和kswapd頁面**中會用到
lowmem_reserve
zone中預留的記憶體,用於一些無論如何都不能失敗的關鍵性記憶體分配
zone_pgdat
執行所屬的pglist_data
pageset
per-cpu上的頁面,減少自旋鎖的爭用
zone_start_pfn
zone的起始記憶體頁面幀號
managed_pages
被buddy system管理的頁面數量
spanned_pages
zone中總共的頁面數,包含空洞的區域
present_pages
one裡實際管理的頁面數量
struct free_area free_area[max_order];
管理空閒頁面的列表
當系統中可用的記憶體比較少時,kswapd將被喚醒,並進行頁交換。如果需要記憶體的壓力非常大,程序將同步釋放記憶體。每個zone有三個闕值,成為pages_low/pages_min/pages_high,用於跟蹤該zone的記憶體壓力。
每個物理頁框都需要乙個對應的page結構來進行管理,記錄分配狀態,分配和**,互斥以及同步存在。 因為核心會為每乙個物理頁幀建立乙個struct page的結構體,因此要保證page結構體足夠的小,否則僅struct page就要占用大量的記憶體。出於節省記憶體的考慮,struct page中使用了大量的聯合體union。
本章梳理了node
,zone
,page frame
各個資料結構的成員變數和關係,對於linux中管理記憶體的各個結構體之間的關係圖如下圖所示
記憶體管理筆記
mrc手動記憶體管理 1.系統不會去檢查已釋放的物件,也就是說,當乙個物件的引用計數為0時,這個物件此時再呼叫其方法不會報錯,成為野指標 除非開啟殭屍除錯診斷,一旦開啟殭屍診斷就會發現崩潰。2.當把這個物件賦值為nil時,成為空指標 再呼叫其方法,將不會出錯,更不會崩潰。3.dealloc方法必須含...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...