回覆列表
  • 1 # 使用者8128104578540

    有mmu這個東西,可以分配虛擬地址(題中邏輯地址,下同),再加上核心的支援,可以提升物理記憶體的利用率。

    講一下Linux Kernel的處理,當執行一個程式時,核心並不會把整個程式完全載入到物理記憶體中,而是分配好虛擬地址,載入可執行檔案的部分到物理記憶體,只分配了虛擬地址而程式未載入到物理記憶體的部分,會在頁表上做標記。

    當程式執行到只有虛擬地址而沒有對應物理記憶體的地方時,處理器會發生異常,然後核心就分配對應的物理記憶體頁,把磁碟上的資料載入到物理記憶體,再從異常中返回,程式就能繼續執行。這個過程,使用者態的程式是無法感知到的。

    這樣,就算分配的虛擬地址大於實際的分配的物理記憶體也是沒有問題的。透過這種機制,假設我有一個遠大於物理記憶體的程式,也是能執行的。在系統物理記憶體用光的情況下,當程式執行到新的地方,而這部分只分配了虛擬地址,沒有對應物理記憶體時,核心在缺頁異常中搜索最不常執行的地方,斷開物理記憶體與原來虛擬地址的連線,把這塊物理記憶體分配給當前程式將要執行的新的虛擬地址,然後把磁碟上的程式載入到物理記憶體,這樣程式又能快樂的運行了。

    綜上,虛擬地址會比物理地址多,而且也是有必要。計算機裡有一個重要的情況,基本上很多東西都是區域性的,一個程式雖大(比如我們的假設,磁碟上的程式遠大於物理記憶體),但經常執行的地方卻不多。cache也是根據這個情況設計出來的,雖然可能只有幾十兆,但是效能提升非常高。

    上面說了單程序的情況,下面說說多程序的情況。多程序時,活躍的程序可能就那麼幾個,其他基本上在睡大覺。32位機上,每個程序都分了4g虛擬地址空間,但是真正需要全部把程式載入到物理記憶體的不多,或者,我一個程式原來用了很多記憶體,但後面不怎麼執行,核心在記憶體緊張時,會把這部分物理記憶體釋放掉,分配給其他用途。

    前面說的是程式部分,現在說說資料部分,或者說是堆記憶體這塊(malloc分配的)。如果這部分記憶體不常使用,核心會把他們丟入交換空間(swap,位於磁碟上)這個冷宮。等到真正需要時,才把資料從交換空間拿到物理記憶體。

    綜上,這幾種情形,使用了虛擬地址,可以讓物理記憶體可以使用得更高效。邏輯地址比物理地址多不言而喻了吧。

    ps:我深入到細節的這種講述不知道好不好理解,文字又比較多。

  • 中秋節和大豐收的關聯?
  • 如何找到值得讓自己放下手機的興趣愛好?