虛擬內存、物理內存

虛擬內存和物理內存的聯繫和區別

對於32位的機器,每個進程都認爲自己有4G的內存空間,但是實際上虛擬內存對於的物理內存可能只有一點。

進程得到的4G的虛擬內存是連續的地址空間,但是實際上,它是被分割成多個物理內存碎片,還有一些部分存儲在外部磁盤存儲器中,需要的時候進行數據交換。

進程訪問一個地址可能會經歷的過程:

  1. 每次訪問一個地址,首先要把地址翻譯成實際的物理內存地址
  2. 所有的進程共享一塊物理內存,每個進程只把目前需要的虛擬內存映射到物理內存上。
  3. 進程需要知道哪些地址空間的數據在物理內存上,哪些在磁盤上。通過頁表來記錄。
  4. 頁表每個表項分爲兩個部分,第一部分記錄是否在物理內存上,第二部分記錄在物理內存的的地址。
  5. 當進程訪問某個地址的時候,先會去看頁表,如果數據不在物理內存上,就會發生缺頁異常。
  6. 缺頁異常的處理過程是,操作系統阻塞該進程,從硬盤中換入對應的也到內存裏,然後該進程就緒,如果內存滿了,就找一個頁覆蓋。怎麼覆蓋就需要看操作系統的頁面置換算法。

在這裏插入圖片描述

總結

當每個進程創建的時候都分配的4G的虛擬內存,當進程還沒有開始運行的時候,程序的代碼段和數據段實際上都放在磁盤中,此時是虛擬內存和磁盤文件之間的映射關係叫做存儲器映射。
當進程開始運行的時候,進程去尋找頁表,頁表中的地址不在物理內存上,因此就會發生缺頁異常,就會從磁盤拷貝數據按照頁面置換算法,拷貝數據同時置換對應的頁面。

在malloc中我們知道操作系統只是分配的虛擬內存給進程。

優點

  1. 既然每個進程的內存空間都是一致而且固定的(32位平臺下都是4G),所以鏈接器在鏈接可執行文件時,可以設定內存地址,而不用去管這些數據最終實際內存地址,這交給內核來完成映射關係
  2. 不同進程使用同一段代碼的時候,比如庫文件代碼,就可以在屋裏內存中只存儲一份這樣的代碼,只要設置映射關係即可。
  3. 程序分配連續空間的時候,只要在虛擬空間中分配連續的內存,物理空間上可以用碎片化的內存來進行分配。這樣可以有效的利用物理內存空間,減小內存碎片的產生。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章