linux內存管理是一個相當複雜的機制,這裏只是基礎的內存管理知識結構,不包括頁面換出換入。
可以從以下角度思考問題
用戶地址空間:
用戶內存請求被認爲是不緊迫的
用戶訪問是危險的 權限控制
用戶程序典型應用:
shell中運行個命令,全新的地址空間
正在運行的程序裝入了別一個程序exec,進程標識不變,線性區變了
用戶程對文件作內存映射
用戶malloc
用戶棧增長
IPC共享內存
多線程共享
內存管理數據結構設計原因,其考慮的問題。
UMA 與 NUMA
DMA
NORMAL
HIGHMEM
可阻塞路徑中分配內存 永久內存映射
不可阻塞路徑中分配內存 保留頁池 try… 臨時內核映射
碎片:
內:
外:1 2 4 8 16 …1024
memzone中:
申請內存要考慮NUMA,從本CPU結點到其他CPU結點,從HIGHMEM到NORMAL到DMA的優先級
夥伴系統
內核經常請求和釋放單個頁框,定義每CPU頁框高速緩存。 一個頁可能是熱的,在CPU緩存中。
從夥系統到每CPU高速緩存
從每CPU高速緩存到夥伴系統
每次申請和釋放都是批量的,因此有上限、下限、批量值。
slab分配器
對象構造與析構
對象緩存
內核反覆申請一些固定大小對象
對象對齊
不同slab中有相同偏移量的對象可能放在高速緩存到同一行中。通過着色避免。
每CPU本地高速緩存 降低自旋鎖的競爭
非連續內存區 vmalloc
對內存請求不是很頻繁。
沒有外碎片
缺頁異常處理程序考慮:
是編程錯誤導致?
是無效線性地址 進程地址空間,介有待分配
寫時複製?
內存頁面換入換出。算法。
**
linux內存管理數據結構之間的關係
**