一、前言: 為什么內存管理是核心知識
內存管理是 Linux 內核最核心也最復雜的子系統之一,其作用包括:
- 為軟件提供獨立的虛擬內存空間,實現安全隔離
- 分配/回收物理內存資源,維持系統穩定
- 支持不同類型的內存分配器,最優化性能
- 應對內存壓力,培育回收策略,防止系統 OOM
對于 Linux 內核/嵌入式/系統級程序員而言,熟悉內存管理系統是基礎能力。
二、全局觀察:內存管理子系統結構
縱向分層:內存管理三大場景
分層 | 功能 | 關鍵組件 |
---|---|---|
地址轉換機制 | 虛擬地址 → 物理地址 | MMU, 分段+分頁, TLB |
物理頁級管理 | 分配和回收物理頁 | struct page, zone, buddy |
內核對象分配 | 提供高效率小內存塊分配 | SLAB/SLUB, kmalloc, vmalloc |
橫向分模塊:實際功能分布
- 虛擬內存管理 (VMM)
- 分頁/頁表機制
- 物理內存分配器 (Buddy System)
- 內核小對象分配器 (SLAB)
- 頁面回收與 swap 機制
三、核心模塊分析
1. 分段 + 分頁:地址轉換的基石
- 分段(Segmentation):只在 x86 有效,Linux 采用 flat model,基本忽略
- 分頁(Paging):進程地址分成頁,用頁表維護,支持缺頁中斷、TLB、COW、hugetlb
2. 物理內存管理:Buddy System
- 分配 granularity :頁(page)
- 劃分為 zone(DMA/Normal/HighMem)
- 通過 free_area 鏈表管理 2^n 大小頁塊
- 分裂與合并策略,避免碎片
3. SLAB 分配器:小對象高效分配
- 構成:cache 結構,內部 slab,實際物理 page
- 分配路徑:kmalloc → kmem_cache_alloc → slab 內分配
- 支持 slab 裝慎化 (object constructor), 并免別重復初始化
- SLUB 是高性能環境下默認分配器
4. 頁面回收 & Swap
- 回收模型:后臺線程 kswapd + 前端直接回收 direct reclaim
- 培育 LRU 列表:active/inactive 分類,區分文件頁和匿名頁
- swap 把匿名頁寫入 swap 分區,重新讀取時產生 swapin
- zswap/zram 提供內存壓縮緩存,降低 swap IO
- OOM Killer 根據計算的 score 選擇被殺死程序
四、怎樣建立自己的學習體系
1. 給自己定位和目標
- 對內核加載/進程場景關注:先看 VMM + Buddy
- 對性能有需求:深挑 SLAB/回收
2. 系統學習路線
- 了解 Linux 虛擬內存分配 (mm_struct / vma)
- 缺頁處理流程 (do_page_fault -> handle_mm_fault)
- 頁表結構 PGD → PTE 分析
- Buddy 分配器:alloc_pages()
- kmalloc 分配路徑
- swap / reclaim 進階分析
3. 配合實操 + 清單
- 觀看 /proc/meminfo /proc/slabinfo
- 使用 kmemleak / slabtop 進行分析
- 用 GDB/QEMU 追蹤頁表處理
- 建立一份居住的進度清單 + 思維圖
五、面試角度應對模型
面試常見問題
問題 | 基本回答思路 |
---|---|
Linux 是否使用分段? | 采用 Flat Model,沒有分段隔離 |
Buddy 如何合并或分裂頁塊? | 2^n 分裂,同級 Buddy 合并 |
SLAB 和 Buddy 關系? | SLAB 依賴 Buddy 分配整頁,內部再分裂 |
kmalloc 與 vmalloc 區別 | kmalloc 返回連續物理內存,vmalloc 是虛擬連續 |
swap 與 zswap 差別 | swap 是硬盤 IO,zswap 是 RAM 壓縮 |
OOM 如何選擇殺死進程 | oom_score, memory usage, badness 算法 |
面試要點分析
- 是否掌握核心數據結構 (page/mm_struct/slab cache)
- 是否知道基本處理流程 (缺頁、oom、swap)
- 能否用簡潔詞說清楚動畫軟件設計者的同理
六、總結:架設體系解階式學習
- 總觀基本組成:分段,分頁,物理,SLAB,swap
- 接通內核組件:形成動態場景連接
- 配合清單、思維圖、代碼進階
- 最后進入一些特殊場景:NUMA、緩存分析、優化相關
這是一份基于概念 + 結構 + 應用性問題的學習根基,也是深入 Linux Kernel 必經之路。
如果需要,我可以繼續給出“面向面試”的項目化問題和標準答案。