前面介紹了計算機系統的各種記憶體管理策略,例如分頁,分段等,所有這些策略都有相同的目標,就是同時將多個進程儲存在記憶體中,以便允許多道程式。然而,這些策略都傾向於要求每個進程在執行之前應完全處於記憶體中。
虛擬記憶體技術允許執行進程不必完全處於記憶體。這種方案的一個主要優點就是,程式可以大於實體記憶體。此外,虛擬記憶體將記憶體抽象成一個巨大的、統一的儲存陣列,進而實現了使用者看到的邏輯記憶體與實體記憶體的分離。這種技術使得程式設計師不再擔憂記憶體容量的限制。
虛擬記憶體還允許進程輕鬆共用檔案和實現共用記憶體。此外,它為建立進程提供了有效的機制。然而,虛擬記憶體的實現並不容易,並且使用不當還可能會大大降低效能。
說了這麼多,到底什麼是虛擬記憶體呢?
記憶體管理演算法的實現有一個基本要求,就是執行的指令應處於實體記憶體中。滿足這一要求的第一種方法是,將整個邏輯地址空間置於實體記憶體中。動態載入可以幫助緩解這種限制,但它通常需要特殊的預防措施和程式設計師的額外工作。
指令應處於實體記憶體以便執行的要求,似乎是必要的和合理的,但它也是有缺點的,因為它將程式的大小限制為實體記憶體的大小。事實上,通過實際程式的研究會發現,在許多情況下並不需要將整個程式置於記憶體中。
例如,分析以下內容:
-
程式通常具有處理異常錯誤條件的程式碼。由於這些錯誤很少實際發生,所以這些程式碼幾乎從不執行。
-
陣列、連結串列和表等所分配的記憶體量通常多於實際需要值。按
100X100
個元素來宣告的陣列,可能實際很少用到大於 10X10
個的元素。雖然組合程式的符號表可能有 3000 個符號的空間,但是程式平均可能用到的只有不到 200 個符號。
-
程式的某些選項和功能可能很少使用。例如,美國政府計算機的平衡預算程式多年來都沒有使用過。
即使在需要整個程式的情況下,也可能並不同時需要整個程式。分段能夠執行只有部分處於記憶體的程式,可以帶來許多好處:
-
程式不再受實體記憶體的可用量所限制。使用者可以為一個巨大的虛擬地址空間編寫程式,從而簡化了程式設計任務。
-
由於每個使用者程式可佔用較少的實體記憶體,因此可以同時執行更多的程式,進而增加 CPU 利用率和吞吐量,但沒有增加響應時間或週轉時間。
-
由於載入或交換每個使用者程式到記憶體所需的 I/O 會更少,使用者程式會執行得更快。因此,執行不完全處於記憶體的程式將使系統和使用者都受益。
虛擬記憶體將使用者邏輯記憶體與實體記憶體分開。這在現有實體記憶體有限的情況下,為程式設計師提供了巨大的虛擬記憶體(如圖 1 所示)。
圖 1 虛擬記憶體大於實體記憶體的圖例