Memory

當程序大於記憶體大小時,在 UNIX/Linux 中會發生什麼?

  • December 21, 2016

我想知道嵌入式系統如何能夠執行大於記憶體大小的程序。如果我有 1 GB 的記憶體並且程序是 1.5 GB,程序會載入嗎?是否有隻使用可用記憶體的系統?

1. 虛擬記憶體

系統將確保程序將獲得請求的記憶體量,儘管它大於物理記憶體。通過這種方式,核心分配了它可以處理的最大物理記憶體大小的虛擬記憶體空間。例如,在 32 位機器上,核心預設為每個程序分配總共 2^32 即 4GB 的虛擬地址。

2.
過度使用 Linux 中還有一種叫做過度使用的東西,其中核心對記憶體分配請求的響應遠遠大於可用的物理記憶體。過度使用會使核心分配虛擬記憶體,而沒有任何保證相應的物理記憶體分配。

3.交換空間

隨著需要大量記憶體的程序啟動實際上使用了這麼多記憶體,核心開始掃描未使用的記憶體頁面,以及具有較低優先級或目前未執行的程序的記憶體頁面。它將這些數據交換到輔助儲存設備上的交換空間,並為您的程序釋放這些頁面。這稱為頁面竊取。

通過不斷重複第 3 步,即換入和換出頁面,核心設法向程序顯示它所請求的記憶體的錯覺,這可能大於物理可用的記憶體。現在正如您提到的嵌入式系統,我們必須考慮是否在系統上啟用了交換。如果是,則以上 3 點適用。如果不是,上述 3 點仍然適用,但唯一的問題是您的程序可能會崩潰或被 OOM(Out-Of-Memory)殺手殺死。如果核心認為合適,也有可能使用 OOM 殺手殺死其他程序以釋放更多頁面給您的程序。但是,只有在沒有交換空間的情況下才會發生這種情況。

引用自:https://unix.stackexchange.com/questions/117185