虛擬記憶體

虛擬記憶體(virtual memory)

想像一棟公寓,每位住戶都拿到一模一樣的藍圖,上面寫著「你家從第 0 號房一直到第 1,000,000 號房,全都歸你」。每位住戶都按這份藍圖佈置房間,深信自己擁有這整片空間——但牆後其實有個大樓管理員,悄悄把每位住戶的「第 412 號房」對應到真實大樓中某個散落各處的櫃子,而且絕不會讓兩位住戶意外用到同一個櫃子。虛擬記憶體(virtual memory)對程式來說正是這種錯覺:每個程式都被告知自己擁有一大塊私有、編號整齊的記憶體,而硬體則暗中把這些虛構的位址對應到真實記憶體實際所在之處。

更精確地說,虛擬記憶體是兩件事的結合:位址轉換(程式用到的每一個記憶體位址都是虛擬位址,會在抵達真正的記憶體晶片前被轉換成實體位址)以及保護(轉換機制同時檢查這個程式到底有沒有權限碰這個位置)。轉換以固定大小的區塊進行:記憶體被切成一頁頁的分頁(page),一張分頁表(page table)記錄每個虛擬分頁目前住在哪個實體頁框,而一個叫做 MMU 的硬體單元會在每次存取時做這個查找。若需要的分頁不在實體記憶體中,就會發生分頁錯誤(page fault),陷入作業系統,由它從儲存裝置取回。

要誠實說清楚虛擬記憶體是什麼、不是什麼。它不是「額外的 RAM」,重點也不是把資料換到磁碟——換頁只是空間不夠時順帶發生的副作用。真正的目的有三:讓程式跑得比實體記憶體還大、把各個行程彼此隔離與保護(讓某個程式的臭蟲無法破壞另一個程式),以及讓載入器可以把程式放在實體記憶體的任何位置而不必改寫位址。它是硬體與作業系統的協同設計:MMU 在硬體中快速轉換,但作業系統擁有分頁表並負責處理錯誤。兩者缺一不可,而一次 TLB 未命中或分頁錯誤可能主宰執行時間。

同時開啟同一支程式的兩份。兩者都認為自己的程式碼從虛擬位址 0x400000 開始——但作業系統把每一份的虛擬分頁 0x400 對應到不同的實體頁框,於是它們並肩執行卻永不相撞。

兩個程式中同一個虛擬位址對應到兩個不同的實體位置——這正是這個錯覺的核心。

常見誤解:虛擬記憶體就是「把磁碟當成 RAM 用」。不對——它是位址轉換加上保護;磁碟換頁只是可有可無的後果,不是目的。即使 RAM 充足的系統,仍會用虛擬記憶體來做隔離與重定位。

又称
VM