C語言中文網
首頁 > 編程筆記 > 操作系統筆記 閱讀:377

什么是虛擬內存,虛擬內存及其作用詳解

前面介紹了計算機系統的各種內存管理策略,例如分頁分段等,所有這些策略都有相同的目標,就是同時將多個進程保存在內存中,以便允許多道程序。然而,這些策略都傾向于要求每個進程在執行之前應完全處于內存中。

虛擬內存技術允許執行進程不必完全處于內存。這種方案的一個主要優點就是,程序可以大于物理內存。此外,虛擬內存將內存抽象成一個巨大的、統一的存儲數組,進而實現了用戶看到的邏輯內存與物理內存的分離。這種技術使得程序員不再擔憂內存容量的限制。

虛擬內存還允許進程輕松共享文件和實現共享內存。此外,它為創建進程提供了有效的機制。然而,虛擬內存的實現并不容易,并且使用不當還可能會大大降低性能。

說了這么多,到底什么是虛擬內存呢?

內存管理算法的實現有一個基本要求,就是執行的指令應處于物理內存中。滿足這一要求的第一種方法是,將整個邏輯地址空間置于物理內存中。動態加載可以幫助緩解這種限制,但它通常需要特殊的預防措施和程序員的額外工作。

指令應處于物理內存以便執行的要求,似乎是必要的和合理的,但它也是有缺點的,因為它將程序的大小限制為物理內存的大小。事實上,通過實際程序的研究會發現,在許多情況下并不需要將整個程序置于內存中。

例如,分析以下內容:
即使在需要整個程序的情況下,也可能并不同時需要整個程序。分段能夠執行只有部分處于內存的程序,可以帶來許多好處:
虛擬內存將用戶邏輯內存與物理內存分開。這在現有物理內存有限的情況下,為程序員提供了巨大的虛擬內存(如圖 1 所示)。

虛擬內存大于物理內存的圖例
圖 1 虛擬內存大于物理內存的圖例

因此,虛擬內存使得編程更加容易,因為程序員不再需要擔心有限的物理內存空間,只需要關注所要解決的問題。

進程的虛擬地址空間就是進程如何在內存中存放的邏輯(或虛擬)視圖。通常,進程從某一邏輯地址(如地址 0)開始,連續存放,如圖 2 所示。

虛擬地址空間
圖 2 虛擬地址空間

注意,在圖 2 中,隨著動態內存的分配,允許堆向上生長。類似地,隨著子程序的 不斷調用,還允許堆棧向下生長。堆與堆棧之間的巨大空白空間(或空洞)為虛擬地址的一部分,只有在堆與堆棧生長時,才需要實際的物理頁。包括空白的虛擬地址空間稱為稀疏地址空間。采用稀疏地址空間的優點是隨著程序的執行,堆棧或堆會生長或需要加載動態鏈接庫(或共享對象),此時可以填充這些空白。

前面講過,物理地址可以按幀來組織,并且分配給進程的物理幀也可以不連續。這就需要內存管理單元(MMU)將邏輯頁映射到內存的物理頁幀。

采用虛擬內存的共享庫
圖 3 采用虛擬內存的共享庫

除了將邏輯內存與物理內存分開外,虛擬內存允許文件和內存通過共享頁而為多個進程所共享。這帶來了以下好處:
  1. 通過將共享對象映射到虛擬地址空間中,系統庫可以為多個進程所共享。盡管每個進程都將庫視為其虛擬地址空間的一部分,但是駐留在物理內存中的庫的實際頁可由所有進程共享(圖 3)。通常,庫按只讀方式映射到與其鏈接的進程空間。
  2. 類似地,虛擬內存允許進程共享內存。進程之間可以通過使用共享內存來進行通信。虛擬內存允許一個進程創建一個內存區域,以便與其他進程共享。共享這個內存區域的進程認為,它是其虛擬地址空間的一部分,而事實上這部分是共享的,如圖 3 所示。
  3. 當通過系統調用 fork() 創建進程時,可以共享頁面,從而加快進程創建。

所有教程

優秀文章

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo