1.概述
在Linux中,內核對一致和非一致內存訪問系統使用相同的數據結構,因此針對各種不同形式的內存布局,各個算法幾乎沒有什麼差別。在UMA系統上,只使用一個NUMA結點來管理整個系統內存。
首先內在劃分為結點。每個結點關聯到系統中的一個處理器,在內核中表示為pg_data_t的結構。
深入Linux內核架構 pdf版下載見 http://www.linuxidc.com/Linux/2012-06/62984.htm
各個結點又劃分為內存域,是內存的進一步細分。例如,對可用於(ISA設備的)DMA操作的內存區是有限制的。只有前16M適用,還有一個高端內存區域無法直接映射。在二者之間是通用的“普通”內存區。因此一個結點最多有3個內存域組成,如下圖
內核引入了下列常量來枚舉系統中的所有內存域:
◆ ZONE_DMA標記適合DMA的內存域。該區域的長度依賴於處理器類型。
◆ ZONE_DMA32標記了使用32位地址字可尋址、適合DMA的內存域。顯然只有在64位系統上兩種DMA內存域才有差別。
◆ ZONE_NORMAL標記了可直接映射到內核段的普通內存域。這是在所有體系結構上保證都會存在的唯一內存域,但無法保證該地址范圍對應了實際的物理內存。
◆ ZONE_HIGHMEM標記了走出內核段的物理內存。
此外內核定義了一個偽內存域ZONE_MOVABLE,在防止物理內存碎片的機制中需要使用該內存域。
MAX_NR_ZONES充當結束標記,在內核想要迭代系統中的所有內存域時,會用到該常量。
各個內在域都關聯了一個數組,用來組織屬於該內存域的物理內存頁(內核中稱為頁幀)。對每個頁幀,都分配了一個struct page的結構以及所需的管理數據。
出於性能考慮,在為進程分配內存時,內核總是試圖在當前運行的CPU相關系的NUMA結點上進行。但這並不總是可行的,例如,該結點的內存可能已經用盡。對此類情況,每個結點都提供了一個備用列表。該列表包含了其他結點,可用於代替當前結點分配內存。列表項的位置越靠後,就越不適合分配。