12 虛擬內存

程序大到無法一次性裝入內存,或內存中運行的程序過多無法容納下時就需要用到虛擬內存技術。
在程序運行的過程中,由CPU產生虛擬地址,該虛擬地址經過MMU(內存管理單元)轉換成物理地址,然後使用物理地址去訪問內存。那麼虛擬地址存在的原因是什麼?爲何不能由CPU直接產生物理地址呢?原因有三

  1. 使用虛擬地址可以更加高效的使用物理內存。在計算機中物理內存是有限的,像筆記本一般爲4G或者8G,對於現代多任務系統來說這顯然是不夠的。比如我們需要看一個4G以上大小的視頻或者開了多個應用程序需要佔用的空間大於4G,這個時候物理內存就不夠了。存在虛擬內存的情況下,可以爲每個程序分配足夠大小的虛擬地址空間,但不必一次性全部載入內存,這些地址空間在一開始並沒有真正的對應的物理地址,而是在真正使用時纔去對應(重定位)。這樣在訪問後面的地址空間時就可以將前面在當前沒有訪問的物理頁釋放掉或者交換到硬盤中。這樣這個物理頁又可以對應新的虛擬地址,從而使物理內存可以充分的利用。
  2. 使用虛擬地址可以使內存的管理更加便捷(動態)。在程序編譯的時候就會生成虛擬地址,對於不同的機器或者對於同一臺機器的不同時間,該虛擬地址可以對應不同的物理頁。試想如果沒有虛擬地址,那麼編譯時產生的物理地址在某些機器上可能已經被佔用而不能訪問,從而導致程序需要重新編譯
  3. 爲了安全性考慮,在使用虛擬地址的時候,暴露給程序員的永遠都是虛擬地址,而具體的物理地址在哪裏只有系統才瞭解,這樣就提高了系統的封裝性。

下面來看看虛擬內存具體的工作過程。

虛擬內存是將邏輯地址映射到物理地址的橋樑。邏輯地址是分段的(代碼段、數據段等),暴露給程序員的是分段,而爲了提高物理內存的而使用率和運行效率,實際的物理內存是分頁。所以需要藉助虛擬內存:首先爲程序分配虛擬內存,將程序中的各段分配到虛擬內存的閒置空間中;然後再將虛擬內存中的各段再分成若干頁,映射到物理內存的頁框中。如下圖所示

那麼地址翻譯(重定位)的過程就是:由CS:ip通過查段表計算虛擬地址,然後由虛擬地址通過查頁表計算物理地址。從用戶的角度來看就是段的訪問,從物理內存的角度就是分成一頁一頁。如下圖所示

段頁結合的實際內存管理的步驟爲:爲進程分配虛擬內存——>建段表——分配物理內存——>建頁表——>內存動態管理
段頁結合式內存下程序如何載入內存:即上面的分配虛擬內存和物理內存
1.虛擬內存割出一段區域給用戶,存放數據段、代碼段等
2.把用戶的數據段分割成頁,再映射到物理內存上。
程序、虛擬內存+物理內存的樣子如下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章