首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

glibc 記憶體管理架構深度剖析:虛擬記憶體、分頁、段與分配機制

     編輯:關於C語言

虛擬記憶體:程式眼中的線性位址空間

每個行程看到的是獨立、線性的 0~MAX 虛擬位址空間,但並非連續——部分區段可能缺失(無對應實體記憶體)。虛擬記憶體以頁為單位管理(通常 4KB),每頁對應實體記憶體中的幀。分頁機制讓作業系統能將暫不用的頁交換到磁碟,實現記憶體超額使用。

頁與幀的多對多關係

  • 頁可能無對應幀(缺頁、全零頁共用零頁幀)。
  • 多個頁(屬不同行程)可共用同一幀(如動態連結庫 printf 程式碼)。

缺頁中斷與換頁機制

行程存取無幀對應的頁 → CPU 觸發缺頁例外 → 核心掛起行程 → 調度建立頁-幀對應(換入) → 恢復行程。此過程涉及磁碟 IO,頻繁發生會嚴重降低效能。

記憶體分配的兩大途徑

方式說明可釋放?
exec 族函式建立虛擬空間、載入程式映像不可(行程結束自動回收)
程式設計介面malloc/mmap/sbrk 等可(free/munmap)

記憶體映射 I/O (mmap)

將虛擬頁直接對應常規檔案,存取虛擬記憶體即隱含檔案讀寫。按需分頁特性:只在實際存取觸發頁面錯誤時才進行 IO,極適合大檔案隨機存取。

段式管理:行程虛擬位址的邏輯劃分

虛擬位址空間按段組織,配合分頁形成段頁式管理。三大核心段:

段名內容特性
Text Segment指令、字面常數、靜態常數exec 載入,唯讀,全生命週期固定大小
Data Segment全域/靜態變數、堆積exec 預載初始值,可擴縮(brk/sbrk),有最小固定空間
Stack Segment函式呼叫框架、區域變數隨堆疊增長自動擴展,不會自動縮減

glibc 分配器實作要點

  • ptmalloc (pthreads malloc):基於 dlmalloc,多執行緒場景下每執行緒維護獨立 arena 減少鎖競爭。
  • 小區塊:使用快取池(fastbins, smallbins)滿足頻繁小型分配。
  • 大區塊:直接向核心請求 mmap 區域,釋放時 munmap 歸還 OS。
  • 記憶體對齊:所有分配地址對齊至 16 位元組(64 位元系統),滿足 SIMD 指令需求。

總結

理解虛擬記憶體分頁、段式劃分、缺頁機制與 glibc 分配器策略,有助於診斷記憶體洩漏、碎片化、效能抖動等疑難雜症,也是系統級效能調優的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved