Linux內存管理系統性總結
內存管理核心架構圖
詳細分析
1. 頁表機制(多級頁表轉換)
核心功能:虛擬地址到物理地址的轉換和內存保護
四級頁表結構(x86_64):
// arch/x86/include/asm/pgtable_types.h
typedef struct { pgdval_t pgd; } pgd_t; // 頁全局目錄
typedef struct { p4dval_t p4d; } p4d_t; // 頁四級目錄
typedef struct { pudval_t pud; } pud_t; // 頁上級目錄
typedef struct { pmdval_t pmd; } pmd_t; // 頁中間目錄
typedef struct { pteval_t pte; } pte_t; // 頁表項
地址轉換流程:
關鍵機制:
-
大頁支持:
- 2MB大頁:PMD直接指向物理頁
- 1GB大頁:PUD直接指向物理頁
- 減少TLB miss,提升性能
-
寫時復制(CoW):
// mm/memory.c static vm_fault_t do_wp_page(struct vm_fault *vmf) {// 1. 檢查是否共享頁// 2. 分配新物理頁// 3. 復制內容// 4. 更新頁表項 }
-
缺頁處理:
// arch/x86/mm/fault.c void do_page_fault(struct pt_regs *regs, unsigned long error_code) {// 調用鏈:// handle_mm_fault() -> __handle_mm_fault() -> handle_pte_fault() }
-
TLB:
4.1 定位:CPU內部的硬件緩存(通常為SRAM)
4.2 作用:緩存最近使用的頁表條目(PTE)
4.3 性能價值:
(1) 頁表訪問需4次內存訪問(4級頁表)
(2) TLB訪問僅需1-3個CPU周期(比內存快100倍+)
2. 伙伴系統(Buddy System)
核心功能:管理物理頁幀的分配與釋放,解決外部碎片
數據結構:
// mmzone.h
struct zone {struct free_area free_area[MAX_ORDER]; // 11個階(0-10)
};struct free_area {struct list_head free_list[MIGRATE_TYPES];unsigned long nr_free;
};
分配流程:
遷移類型:
MIGRATE_UNMOVABLE
:內核核心數據結構MIGRATE_MOVABLE
:用戶空間頁面MIGRATE_RECLAIMABLE
:可回收頁面MIGRATE_PCPTYPES
:per-CPU頁面
關鍵操作:
// mm/page_alloc.c
static struct page *__rmqueue(struct zone *zone, unsigned int order,int migratetype)
{// 1. 嘗試首選遷移類型// 2. 失敗時嘗試fallback類型
}
3. SLAB分配器
核心功能:高效分配內核小對象,減少內存碎片
三級緩存結構:
關鍵數據結構:
// mm/slab.h
struct kmem_cache {unsigned int size; // 對象實際大小unsigned int object_size; // 對象原始大小struct kmem_cache_node **node; // Per-NODE緩存struct array_cache __percpu *cpu_cache; // Per-CPU緩存
};struct slab {struct list_head list; // SLAB鏈表void *s_mem; // 第一個對象地址unsigned int active; // 活躍對象數
};
分配流程:
4. 虛擬內存區域(VMA)
核心功能:管理進程的虛擬地址空間布局
數據結構:
// mm_types.h
struct vm_area_struct {unsigned long vm_start; // 起始地址unsigned long vm_end; // 結束地址struct mm_struct *vm_mm; // 所屬內存結構pgprot_t vm_page_prot; // 訪問權限unsigned long vm_flags; // 標志位struct rb_node vm_rb; // 紅黑樹節點const struct vm_operations_struct *vm_ops; // 操作函數集struct file *vm_file; // 映射的文件
};
VMA類型:
-
文件映射:
- 映射文件到內存(mmap)
- 缺頁時從文件系統讀取(filemap_fault)
-
匿名映射:
- 堆/棧空間
- 缺頁時分配零頁(do_anonymous_page)
VMA管理:
反向映射:
// mm/rmap.c
struct anon_vma {struct rw_semaphore rwsem;struct rb_root rb_root; // 關聯的VMA
};
5. 內存回收機制
核心組件:
- kswapd守護進程:后臺回收
- 直接回收:分配時觸發
- OOM Killer:內存耗盡處理
LRU算法:
// mmzone.h
enum lru_list {LRU_INACTIVE_ANON = 0,LRU_ACTIVE_ANON = 1,LRU_INACTIVE_FILE = 2,LRU_ACTIVE_FILE = 3,LRU_UNEVICTABLE = 4,NR_LRU_LISTS
};
回收流程:
系統級協作流程
關鍵源碼路徑
-
頁表機制:
arch/x86/mm/fault.c
(缺頁處理)mm/memory.c
(頁表操作)
-
伙伴系統:
mm/page_alloc.c
(核心分配邏輯)
-
SLAB分配器:
mm/slub.c
(SLUB實現)mm/slab_common.c
(通用接口)
-
虛擬內存管理:
mm/mmap.c
(VMA創建/刪除)mm/vmalloc.c
(非連續內存分配)
-
內存回收:
mm/vmscan.c
(頁面回收)mm/swap_state.c
(交換管理)
性能優化技術
- Per-CPU緩存:SLAB和伙伴系統均實現
- 預讀機制:文件映射缺頁時預加載
- 透明大頁(THP):自動合并小頁
- 內存壓縮(zswap):減少交換I/O
- cgroup內存控制:容器級隔離
內存利用率優化技術
這是內存管理藝術的核心,通過各種技術減少浪費(碎片),讓有限物理內存服務更多進程和數據:
1,分頁:
1.1 基礎: 允許物理內存以頁為單位非連續分配,減少外部碎片。
1.2 按需分配: 進程申請大量內存時,操作系統通常只建立虛擬地址空間的映射,并不立即分配物理頁。直到進程首次訪問該頁面觸發頁面故障時,才分配物理頁幀并建立映射。這避免了分配但未使用的內存浪費。
2,虛擬內存:
2.1 核心思想: 利用磁盤空間(交換區/頁文件)擴展物理內存。
2.2 換頁: 當物理內存不足時,操作系統選擇一些“不活躍”的內存頁(頁面置換算法如LRU, Clock, LFU等決定),將其內容寫入磁盤,釋放其物理頁幀供其他進程使用。
2.3 效果: 使得進程的虛擬地址空間可以遠大于物理內存,允許多個大型進程同時運行(盡管部分在磁盤上)。極大地提高了物理內存的利用率。
3,寫時復制:
3.1 場景: fork()系統調用創建子進程,或共享內存映射。
3.2 機制: 初始時,父子進程共享相同的物理頁幀,并將這些頁標記為只讀。當任何一方試圖寫入共享頁時,觸發頁面故障。內核捕獲此故障,為該進程復制一個新物理頁幀,復制原內容,并更新該進程的頁表映射為可寫。然后恢復進程執行寫入操作。
3.3 優勢: 避免了在fork()后立即復制整個進程地址空間的巨大開銷,大量共享的只讀頁(如代碼段)無需復制。只有真正被修改的頁才需要物理復制。顯著節省內存。
4,內存壓縮:
機制: 在物理內存緊張但尚未達到需要換頁的程度時,內核將多個“可壓縮”的、最近未使用的頁內容壓縮存儲在一個物理頁幀中,釋放出空閑頁幀。
優勢: 比換頁到磁盤快得多(磁盤I/O慢),能緩解內存壓力,推遲甚至避免昂貴的換頁操作,提高響應速度。
5,高效的內存分配器:
目標: 管理堆內存,減少內部碎片和外部碎片,提高分配/釋放速度。
策略:
Slab分配器: 針對內核對象(如task_struct, inode等頻繁創建銷毀的小對象),預分配不同大小的Slab緩存,對象從Slab中快速分配釋放,避免反復向通用分配器申請,減少碎片。
伙伴系統: 管理物理頁幀分配,按2的冪次大小組織空閑鏈表,易于合并相鄰空閑塊,減少外部碎片。
用戶空間分配器: 如glibc的ptmalloc, jemalloc, tcmalloc,采用不同策略(如線程本地緩存、大小分級、惰性合并)來優化多線程下的性能和碎片。
6,共享內存:
機制: 允許多個進程將同一塊物理內存映射到各自的虛擬地址空間。
優勢: 進程間通信最高效的方式,避免了數據復制。節省物理內存(一份數據供多個進程訪問)。常用于數據庫、科學計算等需要大量數據共享的場景。
7, 內存過量使用:
機制: 允許系統承諾分配的內存總量超過實際物理內存+交換空間的總和。依賴于程序不會同時訪問所有已分配內存的特性(局部性原理)和高效的換頁機制。
風險與平衡: 如果所有進程同時大量訪問“承諾”的內存,會導致嚴重的抖動(頻繁換頁),性能急劇下降。操作系統需要謹慎監控和策略來管理風險。
總結表格
組件 | 核心功能 | 數據結構 | 優化技術 |
---|---|---|---|
頁表機制 | 地址轉換與保護 | pgd_t, pte_t | TLB, 大頁 |
伙伴系統 | 物理頁幀管理 | zone, free_area | 遷移類型, per-CPU緩存 |
SLAB分配器 | 小對象高效分配 | kmem_cache, slab | CPU緩存, 對象重用 |
VMA管理 | 虛擬地址空間布局 | vm_area_struct | 紅黑樹, 反向映射 |
內存回收 | 內存資源回收 | lruvec, anon_vma | LRU算法, 交換壓縮 |
此架構實現了從進程虛擬地址空間到物理內存的完整映射,通過多級緩存和智能回收策略,在保證隔離性和安全性的同時,最大化內存利用率和訪問性能。