虛擬記憶體與需求分頁

虛擬記憶體(virtual memory)

想像一張很小的書桌和一個巨大的檔案櫃。你只能處理桌面放得下的東西,但你的專案也許要塞滿一百個資料夾。訣竅很簡單:桌上只留你此刻正在用的資料夾,其餘的放在櫃子裡。當你要拿一個不在桌上的資料夾時,就去把它取出來,而為了騰出空間,就把一個你已經不再碰的放回去。對你而言,整個專案彷彿就在手邊,即使書桌一次只放得下幾個資料夾。虛擬記憶體對一個執行中的程式做的正是這個把戲:書桌是實體 RAM、櫃子是磁碟,而取出與放回都由作業系統替你完成。

具體來說,虛擬記憶體把程式被允許使用的龐大邏輯位址空間,與實際存在的有限實體記憶體分開。一個程式可能被編譯成使用完整的 64 位元位址空間,遠超過任何機器的 RAM,但它仍能順利執行,因為在任何一瞬間,只有它正在主動觸碰的那一小部分需要常駐於 RAM。其餘的待在後備儲存(磁碟或 SSD)上,依需求被帶進來,並在空間吃緊時被推出去。硬體與作業系統合力把程式使用的每一個邏輯位址轉譯成真正的實體位置,或在所需的部分目前不在記憶體時陷入(trap)作業系統。

為什麼重要:虛擬記憶體帶來三大好處。它讓單一程式可以比實體 RAM 還大(否則它根本無法執行)。它讓更多程式可以同時常駐,因為每個程式都只把作用中的部分留在記憶體裡,提高了多元程式規劃的程度。它也加快了啟動,因為程式可以在尚未完全載入前就開始執行。一個關鍵而誠實的提醒是:虛擬記憶體不會讓一個本來就放得進 RAM 的程式跑得更快——它是讓本來放不下的程式得以執行。如果一個程式的作用足跡對可用 RAM 而言太大,它反而可能因為作業系統不斷搬移分頁(輾轉現象,thrashing)而跑得慢得多。虛擬記憶體是記憶體管理最宏大的錯覺:每個程式都被給予一種它其實並不擁有的、巨大而私有且連續的記憶體假象。

一台機器有 8 GB 的 RAM,但你卻同時執行了一個影片編輯器、開著 40 個分頁的瀏覽器,以及一款遊戲,它們宣稱的記憶體加起來共 25 GB。一切仍能執行,因為在任何時刻真正在使用的只有幾 GB;其餘的住在磁碟上,需要時才被分頁進來。

所有程式位址空間的總和可以遠遠超過實體 RAM。

虛擬記憶體不等於置換空間。虛擬記憶體是整個錯覺(邏輯空間大於 RAM);置換空間只是用來存放目前不在 RAM 中之分頁的磁碟區域。這個錯覺是建立在分頁加上後備儲存之上,而非單靠磁碟。

又称
VM虛擬記憶