這個系列會從 userspace 看到的記憶體現象一路追到 Linux kernel 的設計:虛擬記憶體、page table、page fault、COW、buddy/slab allocator、page cache、swap、memory reclaim、cgroup 與 OOM。目標是建立一套能用在 production debugging 的 Linux memory mental model。
Linux 記憶體管理是我一直想系統整理的主題。平常我們很常看到一些看似簡單、但其實牽到很深的問題:為什麼 free 顯示記憶體快滿了,系統卻還跑得好好的?為什...
如果只從程式的角度看,記憶體好像很單純。宣告變數、配置 buffer、呼叫 malloc(),拿到一個位址,接著讀寫它。可是這個位址通常不是實體 RAM 上真正...
昨天提到,每個 process 都有自己的虛擬位址空間。不過 kernel 不會把整個位址空間當成一大塊平面來管理。它會把有意義的區間拆成多個 VMA,也就是...
VMA 告訴 kernel 某段虛擬位址應該怎麼處理,但 CPU 每次讀寫記憶體時,需要的是更具體的答案:這個虛擬位址到底對應到哪個實體頁面?這就是 page...
page table 解決了虛擬位址到實體位址的對應問題,但它也帶來一個效能問題。每次 CPU 存取記憶體,如果都要走多層 page table,成本會非常高。...
很多人第一次聽到 page fault,會直覺把它當成錯誤。畢竟名字裡有 fault,看起來像程式壞掉了。但在 Linux 記憶體管理裡,page fault...
Linux 管理記憶體時,常會區分 anonymous memory 和 file-backed memory。這個差異會影響 page fault 怎麼處理、...
Demand paging 是 Linux 記憶體管理裡很核心的策略。它的想法很直接:不要在 process 要求位址空間時就立刻付出所有成本,而是等它真的讀寫...
在 Unix-like 系統裡,fork() 會建立一個幾乎和 parent process 相同的 child process。直覺上,kernel 好像必須...
前幾篇談到 page fault、demand paging 和 copy-on-write,都會在需要時向 kernel 取得新的 physical page...