引用來自 centos.org 的部署指南那是,
交換空間在 Linux 中,當實體記憶體 (RAM) 已滿時使用。
然後維基百科還說,
術語「交換」[用於]描述在 RAM 和磁碟之間移動記憶體頁面的行為,以及儲存頁面的磁碟區域。
現在,為什麼在某些情況下,交換空間中的資料比實體記憶體中的資料大?我相信,當系統需要的記憶體多於物理可用的記憶體時,核心會交換較少使用的頁面,並將記憶體立即提供給需要記憶體的當前應用程式(進程)。因此交換空間儲存的資料不得大於 RAM。
這是我來自的地方,請參閱下面提供的螢幕截圖。
答案1
你對虛擬記憶體有什麼誤解。程式和作業系統始終在虛擬記憶體中運行。如果您 malloc 10 個位元組、1000 萬個或 100 億個位元組,則您正在分配虛擬記憶體。您的程式碼、堆疊空間(自動儲存、分配等)、全域儲存(如果有)也都位於虛擬記憶體中。如果您取得某個內容的位址(如 中所示)&myVariable
,則結果是虛擬位址。您「永遠」不會在虛擬記憶體作業系統下使用實體記憶體位址。
作業系統所需的虛擬位址空間加上您正在執行的所有程式的總和將例行公事地即使在當今的系統上,也超過了 RAM 的大小。對於單一程式來說甚至也是如此。因此,單一進程的 RAM 使用量+「交換空間」很容易超過 RAM。
哎呀,虛擬記憶體的全部意義 - 嗯,重要的一點之一 - 是允許您編寫需要比 RAM 更多「記憶體」(無論是程式碼、資料還是其他)的程式碼。
正如其他人在評論中所說,由作業系統決定總虛擬位址空間(對於作業系統+所有進程)的哪一部分保留在 RAM 中,哪一部分保留在磁碟上(在「交換」空間中)。如果您引用不在RAM 中的虛擬位址空間的某些頁面(在x86/x64 系統上通常為4 KB),作業系統會為您「交換它」(我們也說「將其分頁」或「將其故障”) ”,因為這是由“頁面錯誤”引起的)。稍後,作業系統可能會認為 RAM 不足,並可能從 RAM 中刪除一些最舊引用或最不經常引用的內容。如果自從上次將這些內容放入RAM 後對其進行了修改,則修改後的版本必須保存在磁碟上- 這就是為什麼這些內容被放入「交換空間」(或Windows 術語中的頁面檔案)中。
順便說一句,如果虛擬記憶體內容不在 RAM 中,則頁面檔案/交換檔案/交換空間目前並不是保存虛擬記憶體內容的唯一位置。映射文件(通常包括每個代碼文件)是另一個地方。程式碼在 RAM 中很少被修改,因此通常只換入,而不換出。如果它必須從 RAM 中遺失,它就會被刪除,如果再次需要,可以從它最初來自的相同檔案中換回。