Linux 內核內存管理子系統全面解析與體系構建

一、前言: 為什么內存管理是核心知識

內存管理是 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. 系統學習路線

  1. 了解 Linux 虛擬內存分配 (mm_struct / vma)
  2. 缺頁處理流程 (do_page_fault -> handle_mm_fault)
  3. 頁表結構 PGD → PTE 分析
  4. Buddy 分配器:alloc_pages()
  5. kmalloc 分配路徑
  6. 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)
  • 能否用簡潔詞說清楚動畫軟件設計者的同理

六、總結:架設體系解階式學習

  1. 總觀基本組成:分段,分頁,物理,SLAB,swap
  2. 接通內核組件:形成動態場景連接
  3. 配合清單、思維圖、代碼進階
  4. 最后進入一些特殊場景:NUMA、緩存分析、優化相關

這是一份基于概念 + 結構 + 應用性問題的學習根基,也是深入 Linux Kernel 必經之路。

如果需要,我可以繼續給出“面向面試”的項目化問題和標準答案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908723.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鼠標的拖動效果

1、變量的設置 let isDragging false; let startX; let startY; let endX; let endY; let box null;isDragging : 表示是否推拽startX、startY:表示起始坐標,相對于元素endX、endY:表示結束坐標,相對于元素box&…

SwaggerFuzzer:一款自動化 OpenAPI/Swagger 接口未授權訪問測試工具

SwaggerFuzzer 🌐 一款自動化 OpenAPI/Swagger 接口未授權訪問測試工具🚀 工具介紹:SwaggerFuzzer? 核心功能亮點🚀 快速使用🧰 支持參數 📌 項目結構📥 獲取與下載 🌐 一款自動化 …

文獻閱讀:Exploring Autoencoder-based Error-bounded Compression for Scientific Data

目錄 論文簡介動機:為什么作者想要解決這個問題?貢獻:作者在這篇論文中完成了什么工作(創新點)?規劃:他們如何完成工作?離線訓練階段:在線壓縮階段 理由:通過什么實驗驗證它們的工作…

【業務框架】3C-相機-Cinemachine

概述 插件,做相機需求,等于相機老師傅多年經驗總結的工具 Feature Transform:略Control Camera:控制相機參數Noise:增加隨機性Blend:CameraBrain的混合列表指定一個虛擬相機到另一個相機的過渡&#xff…

設計一個算法:刪除非空單鏈表L中結點值為x的第一個結點的前驅結點

目錄 單鏈表的存儲結構定義如下 快慢指針法 三指針法版本① 三指針法版本② 單鏈表的存儲結構定義如下 typedef struct{Elemtype data;struct Node* next; }LNode,*LinkList; 快慢指針法 void deleteprex(LinkList L, Elemtype e) {if (L NULL || L->next NULL ||…

【Qt】:設置新建類模板

完整的頭文件模板 #ifndef %FILENAME%_H #define %FILENAME%_H/*** brief The %CLASSNAME% class* author %USER%* date %DATE%*/ class %CLASSNAME% { public:%CLASSNAME%();~%CLASSNAME%();// 禁止拷貝構造和賦值%CLASSNAME%(const %CLASSNAME%&) delete;%CLASSNAME%&a…

?**?CID字體?**? 和 ?**?Simple字體?**?

在PDF中,字體類型主要分為 ??CID字體?? 和 ??Simple字體?? 兩大類,它們的主要區別在于編碼方式和適用場景。以下是它們的詳細對比: ??1. CID字體(CID-keyed Fonts)?? CID(Character Identifie…

計組_導學

2025.05.31:老湯講408計組學習筆記 導學 第1章計算機系統概述:對計算機系統有全局的認識第2章總線系統:簡單且獨立,不會依賴其他內容,它是被依賴的第3章主存儲器:只有了解主存儲器的內部結構,才能理解在主存中是如何存儲二進制的第4章數據的表示與運算:各種編碼以及計算…

【GPT模型訓練】第二課:張量與秩:從數學本質到深度學習的基礎概念解析

這里寫自定義目錄標題 張量(Tensor)的定義關鍵特點:示例: 張量的秩(Rank)示例:“秩”的拼音常見混淆點 總結 張量(Tensor)的定義 在數學和物理學中,張量是一…

RabbitMQ work模型

Work 模型是 RabbitMQ 最基礎的消息處理模式,核心思想是 ??多個消費者競爭消費同一個隊列中的消息??,適用于任務分發和負載均衡場景。同一個消息只會被一個消費者處理。 當一個消息隊列綁定了多個消費者,每個消息消費的個數都是平攤的&a…

【Linux操作系統】基礎開發工具(yum、vim、gcc/g++)

文章目錄 Linux軟件包管理器 - yumLinux下的三種安裝方式什么是軟件包認識Yum與RPMyum常用指令更新軟件安裝與卸載查找與搜索清理緩存與重建元數據 yum源更新1. 備份現有的 yum 源配置2. 下載新的 repo 文件3. 清理并重建緩存 Linux編輯器 - vim啟動vimVim 的三種主要模式常用操…

73常用控件_QFormLayout的使用

目錄 代碼?例: 使? QFormLayout 創建表單. 除了上述的布局管理器之外, Qt 還提供了 QFormLayout , 屬于是 QGridLayout 的特殊情況, 專 ??于實現兩列表單的布局. 這種表單布局多?于讓??填寫信息的場景. 左側列為提?, 右側列為輸?框 代碼?例: 使? QFormLayout 創…

蘭亭妙微 | 醫療軟件的界面設計能有多專業?

從醫療影像系統到手術機器人控制界面,從便攜式病原體檢測設備到多平臺協同操作系統,蘭亭妙微為眾多醫療設備研發企業,打造了兼具專業性與可用性的交互界面方案。 我們不僅做設計,更深入理解醫療場景的實際需求: 對精…

鴻蒙開發修改版本幾個步驟

鴻蒙開發修改版本幾個步驟 比如:5.0.4(16)版本改為5.0.2(14)版本 一、項目下的build-profile.json5 "products": [{"name": "default","signingConfig": "default&qu…

Flask 基礎與實戰概述

一、Flask 基礎知識 什么是 Flask? Flask 是一個基于 Python 的輕量級 Web 框架(微框架)。 特點:核心代碼簡潔,給予開發者更多選擇空間。 與 Django 對比: Django 創建空項目生成多個文件,Flask 僅需一個文件即可實現簡單應用(如 "Hello, World!")。 Flask …

Linux安全加固:從攻防視角構建系統免疫

Linux安全加固:從攻防視角構建系統免疫 構建堅不可摧的數字堡壘 引言:攻防對抗的新紀元 在日益復雜的網絡威脅環境中,Linux系統安全已從被動防御轉向主動免疫。2023年全球網絡安全報告顯示,高級持續性威脅(APT)攻擊同比增長65%,平均入侵停留時間縮短至48小時。本章將從…

Java嚴格模式withResolverStyle解析日期錯誤及解決方案

在Java中使用DateTimeFormatter并啟用嚴格模式(ResolverStyle.STRICT)時,解析日期字符串"2025-06-01"報錯的根本原因是:模式字符串中的年份格式yyyy被解釋為YearOfEra(紀元年份),而非…

Java中的泛型底層是怎樣的

Java 泛型深入底層原理解析:類型擦除與橋方法的真相 一、Java中的偽泛型 Java 從 JDK 1.5 引入泛型之后,大大提升了代碼的類型安全性與可讀性。但泛型的底層實現并不像 C 的模板機制那樣是“真正的泛型”,Java 的泛型是偽泛型,在…

Spring Boot 從Socket 到Netty網絡編程(上):SOCKET 基本開發(BIO)與改進(NIO)

前言 無論是軟件還是硬件的本質都是要解決IO問題(輸入、輸出),再說回網絡編程本質上都是基于TCP/UP的開發,socket是在此基礎上做的擴展與封裝,而Netty又是對socket做的封裝。本文旨在通過相關案例對socket進行探討。 一…