linux記憶體管理筆記 十九) 記憶體組織

2021-10-06 21:23:04 字數 3229 閱讀 9075

上一章我們梳理了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採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...