Linux內存管理系統性總結

Linux內存管理系統性總結

內存管理核心架構圖

進程虛擬地址空間
頁表機制
物理內存分配
SLAB分配器
內核對象
用戶空間
虛擬內存區域 VMA
文件映射
匿名映射
頁面回收
反向映射
交換機制

詳細分析

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;  // 頁表項

地址轉換流程

CPU虛擬地址PML4表PDP表PD表PT表物理內存使用bits 47-39索引返回PDP基址使用bits 38-30索引使用bits 29-21索引使用bits 20-12索引物理地址 + 偏移(bits 11-0)CPU虛擬地址PML4表PDP表PD表PT表物理內存

關鍵機制

  1. 大頁支持

    • 2MB大頁:PMD直接指向物理頁
    • 1GB大頁:PUD直接指向物理頁
    • 減少TLB miss,提升性能
  2. 寫時復制(CoW)

    // mm/memory.c
    static vm_fault_t do_wp_page(struct vm_fault *vmf)
    {// 1. 檢查是否共享頁// 2. 分配新物理頁// 3. 復制內容// 4. 更新頁表項
    }
    
  3. 缺頁處理

    // 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()
    }
    
  4. 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;
};

分配流程

alloc_pages
所需階是否有空閑
從對應鏈表分配
向上查找更高階
找到空閑塊?
分裂塊并分配
嘗試回收或OOM

遷移類型

  1. MIGRATE_UNMOVABLE:內核核心數據結構
  2. MIGRATE_MOVABLE:用戶空間頁面
  3. MIGRATE_RECLAIMABLE:可回收頁面
  4. 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分配器

核心功能:高效分配內核小對象,減少內存碎片

三級緩存結構

kmem_cache
SLAB列表
滿SLAB
部分空SLAB
空SLAB
Per-CPU緩存

關鍵數據結構

// 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;     // 活躍對象數
};

分配流程

kmallocPer-CPU緩存Partial SLAB伙伴系統請求對象立即返回對象獲取一批對象提供對象分配新SLAB頁返回新頁初始化對象alt[Partial SLAB可用]返回對象alt[CPU緩存中有空閑對象-]kmallocPer-CPU緩存Partial SLAB伙伴系統
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類型

  1. 文件映射

    • 映射文件到內存(mmap)
    • 缺頁時從文件系統讀取(filemap_fault)
  2. 匿名映射

    • 堆/棧空間
    • 缺頁時分配零頁(do_anonymous_page)

VMA管理

進程內存描述符 mm_struct
VMA紅黑樹
VMA鏈表
快速查找
順序遍歷

反向映射

// mm/rmap.c
struct anon_vma {struct rw_semaphore rwsem;struct rb_root rb_root;  // 關聯的VMA
};
5. 內存回收機制

核心組件

  1. kswapd守護進程:后臺回收
  2. 直接回收:分配時觸發
  3. 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
};

回收流程

文件頁
匿名頁
頁面回收觸發
頁面類型
是否臟頁
寫回磁盤
直接回收
交換到swap
釋放頁面

系統級協作流程

用戶進程內核頁表伙伴系統SLABVMA管理malloc(申請內存)kmalloc返回對象alloc_pages返回頁面alt[小對象][大對象]首次訪問內存觸發缺頁異常查找VMA區域從文件讀取分配物理頁alt[文件映射][匿名映射]建立映射用戶進程內核頁表伙伴系統SLABVMA管理

關鍵源碼路徑

  1. 頁表機制

    • arch/x86/mm/fault.c(缺頁處理)
    • mm/memory.c(頁表操作)
  2. 伙伴系統

    • mm/page_alloc.c(核心分配邏輯)
  3. SLAB分配器

    • mm/slub.c(SLUB實現)
    • mm/slab_common.c(通用接口)
  4. 虛擬內存管理

    • mm/mmap.c(VMA創建/刪除)
    • mm/vmalloc.c(非連續內存分配)
  5. 內存回收

    • mm/vmscan.c(頁面回收)
    • mm/swap_state.c(交換管理)

性能優化技術

  1. Per-CPU緩存:SLAB和伙伴系統均實現
  2. 預讀機制:文件映射缺頁時預加載
  3. 透明大頁(THP):自動合并小頁
  4. 內存壓縮(zswap):減少交換I/O
  5. 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_tTLB, 大頁
伙伴系統物理頁幀管理zone, free_area遷移類型, per-CPU緩存
SLAB分配器小對象高效分配kmem_cache, slabCPU緩存, 對象重用
VMA管理虛擬地址空間布局vm_area_struct紅黑樹, 反向映射
內存回收內存資源回收lruvec, anon_vmaLRU算法, 交換壓縮

此架構實現了從進程虛擬地址空間到物理內存的完整映射,通過多級緩存和智能回收策略,在保證隔離性和安全性的同時,最大化內存利用率和訪問性能。

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

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

相關文章

MySQL 運算符實戰:9 道經典練習題解析

MySQL 運算符實戰:9 道經典練習題解析 運算符是 MySQL 查詢的 “靈魂”,靈活運用各類運算符能讓數據篩選更加精準高效。本文通過 9 道實戰練習題,詳解邏輯運算符、比較運算符及模糊匹配的用法,幫你快速掌握運算符的核心應用場景。…

【R語言】更換電腦后,如何在新設備上快速下載原來設備的 R 包?

【R語言】更換電腦后,如何在新設備上快速下載原來設備的 R 包? 在日常使用 R 進行數據分析時,我們往往會安裝很多包(packages),一旦更換電腦,手動一個一個重新安裝會非常麻煩。本文介紹一種簡單…

如何在 Ubuntu 24.04 或 22.04 LTS 上安裝 PowerShell

在本教程中,我們將學習如何在 Ubuntu 24.04 Noble 或 22.04 Jammy JellyFish Linux 中通過命令終端安裝 Microsoft Windows PowerShell。 Windows PowerShell 既是一個命令行外殼程序,也是一種腳本語言。它擁有超過 130 個遵循一致語法和命名約定的命令行工具,稱為 cmdlet(…

基于支持向量機的數據回歸預測(libsvm) SVM

一、作品詳細簡介 1.1附件文件夾程序代碼截圖 全部完整源代碼,請在個人首頁置頂文章查看: 學行庫小秘_CSDN博客?編輯https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夾說明 1.2.1 main.m主函數文件 這段 MATLAB 代碼實現…

Flowith-節點式GPT-4 驅動的AI生產力工具

本文轉載自:Flowith-節點式GPT-4 驅動的AI生產力工具 - Hello123工具導航 ** 一、節點式 AI 工作流革新者:Flowith 深度解析 二、產品核心定位 Flowith 是一款基于 GPT-4 Turbo 的節點式 AI 生產力工具,突破傳統單線程聊天模式&#xff0c…

MySQL的事務日志:

目錄 redo(重做日志): 特點: 組成: 整體流程: redo log buffer與redo log file之間的刷盤策略: 異步刷盤: 同步刷盤: 拆中策略: undo(回…

JavaScript 中 throw error 與 throw new Error(error) 的用法及區別,分別適合什么場景使用?

JavaScript 中 throw error 與 throw new Error(error) 的用法及區別 在 JavaScript 中,throw 關鍵字用于拋出異常。當代碼遇到某些錯誤或異常情況時,可以通過拋出錯誤來通知程序,方便后續的錯誤處理。盡管 throw 的使用看似簡單&#xff0c…

鴻蒙自帶組件效果大全

圖形變換-視效與模糊-通用屬性-ArkTS組件-ArkUI(方舟UI框架)-應用框架 - 華為HarmonyOS開發者 注意:找到需求效果之后先對一下版本 視距 圖像效果 圖片裁剪 顏色漸變 前景屬性設置 外描邊設置: 視效設置: 組件內容模糊 運動模糊 點擊回彈效果…

ISP算法如何優化提升成像質量

ISP算法通過多維度技術協同優化成像質量,核心優化路徑如下:一、降噪與細節增強?AI驅動降噪?深度學習模型實時識別噪點模式,暗光場景信噪比提升5倍以上,同時保留紋理細節。時空域聯合降噪技術抑制運動模糊,鬼影消除率…

單例模式及優化

單例模式是一種創建型設計模式,其核心是確保一個類在程序中只能存在唯一實例,并提供一個全局訪問點。這種模式適用于需要集中管理資源(如日志、配置、連接池)的場景,避免資源沖突和重復創建的開銷。 一、介紹 類型 單例…

Dockerfile優化指南:利用多階段構建將Docker鏡像體積減小90%

更多如果你已經跟隨我們之前的教程,親手將自己的應用裝進了Docker這個“魔法盒子”,那你可能很快就會遇到一個幸福但又尷尬的煩惱:你親手構建的Docker鏡像,竟然像一個塞滿了石頭和棉被的行李箱,臃腫不堪,笨…

英文PDF翻譯成中文怎么做?試試PDF翻譯工具

在全球化快速發展的時代,跨語言交流變得愈發頻繁,無論是學術研究、商務合作還是日常學習,都離不開一個高效、準確的翻譯工具。尤其是對于PDF文件的翻譯需求,更是日益增長。今天,就讓我們一起深入了解幾款在PDF翻譯領域…

macOS使用brew切換Python版本【超詳細圖解】

目錄 一、更新Homebrew倉庫 二、安裝pyenv 三、將pyenv添加到bash_profile文件中 四、使.bash_profile文件的更改生效 五、安裝需要的Python版本 六、設置全局使用的Python版本 七、檢查Python版本是否切換成功 pyenv常用命令 一、更新Homebrew倉庫 brew update 這個…

[矩陣置零]

初始思路分析 這段代碼實現了將矩陣中元素為0的行和列全部置零的功能。主要思路是使用標記數組記錄需要置零的行和列。以下是詳細分析&#xff1a; 1. 初始化階段 int m matrix.size(); int n matrix[0].size(); vector<bool> row(m), col(n);獲取矩陣的行數m和列數n創…

redis-集成prometheus監控(k8s)

一. 簡介&#xff1a; 關于redis的簡介和部署&#xff0c;可以參考單獨的文章redis-sentinel基礎概念及部署-CSDN博客&#xff0c;這里就不細說了。這里只講講如何在k8s中部署export并基于prometheus做redis的指標采集。 二. 實現方式&#xff1a; 首先我們需要先部署exporter…

OVS:ovn為什么默認選擇Geneve作為二層隧道網絡協議?

首先確認 Geneve 是一種封裝協議,可能提供比 VLAN 或 VXLAN 更靈活的擴展能力,這對 OVN 的多租戶場景很重要。可能需要支持更多元數據字段,比如攜帶網絡策略信息,這符合 SDN 集中控制的需求。 性能方面需要考慮封裝效率和硬件支持情況,雖然 Geneve 頭部稍大,但現代網卡的…

grep命令要點、詳解和示例

grep技術要點 1) 工作模型&#xff08;3 件事&#xff09; 輸入&#xff1a;從文件或標準輸入&#xff08;-&#xff09;讀入&#xff0c;一次按“行”處理&#xff08;除非用 -z 改成以 NUL 作為“行”分隔&#xff09;。匹配&#xff1a;把每一行拿去和模式&#xff08;patte…

nVidia Tesla P40使用anaconda本地重編譯pytorch3d成功加載ComfyUI-3D-Pack

背景 自己用的是nVidia Tesla P40&#xff0c;垃圾佬專屬卡 使用下面的由YanWenKun提供的ComfyUI-3D-Pack預安裝環境&#xff0c;但在本地編譯pytorch3d這一步出錯&#xff0c;后面有出錯信息&#xff0c;如果有和我一樣的卡一樣的問題&#xff0c;參看此文的解決方法 老版本…

網絡基礎——協議認識

文章目錄網絡基礎網絡的發展——引出一些概念協議認識初識協議協議分層協議分層的模型再談協議為什么要有TCP/IP協議TCP/IP協議的宏觀認識宏觀理解TCP/IP協議和操作系統的關系協議的真正本質網絡基礎 本篇文章&#xff0c;我們將正式進入網絡部分的學習。這是網絡部分的第一篇…

云原生俱樂部-RH134知識點總結(2)

這一章的內容也會比較多&#xff0c;因為預期三篇文章更完RH134系列&#xff0c;所以每章安排的內容都比較多&#xff0c;并且RH134上面的都是重點&#xff0c;一點也不好寫。昨天一天將RH124系列寫完了&#xff0c;今天爭取將RH134系列寫完。至于我為什么要著急將這些寫完&…