Swap

什麼是惰性交換預留?

  • March 4, 2020

我正在閱讀Linux 程式介面

49.9 MAP_NORESERVE 和交換空間過度使用

一些應用程序創建大型(通常是私有匿名)映射,但只使用映射區域的一小部分。例如,某些類型的科學應用程序分配一個非常大的數組,但只對數組中幾個相隔很遠的元素(所謂的稀疏數組)進行操作。

如果核心總是為整個此類映射分配(或保留)足夠的交換空間,那麼可能會浪費大量的交換空間。相反,核心可以僅在實際需要時(即,當應用程序訪問頁面時)為映射的頁面保留交換空間。這種方法稱為惰性交換保留,其優點是應用程序使用的總虛擬記憶體可以超過 RAM 加上交換空間的總大小。

換句話說,惰性交換保留允許過度使用交換空間。只要所有程序不嘗試訪問其映射的整個範圍,這就可以正常工作。…

據我所知,交換空間是磁碟中的一塊空間,保留用於記憶體交換。當記憶體中的這些頁面處於非活動狀態時,它們會被交換到磁碟中的*交換空間中。*它就像記憶體/記憶體的二級記憶體。

那麼這個惰性交換預留機製到底是什麼鬼?

讓我用一個例子來說明我的困惑。

  1. >

一些應用程序創建大型(通常是私有匿名)映射……

好的,然後假設我malloc有一個大數組16384(4096*4)字節(創建大型(通常是私有匿名)映射),並且只對數組中幾個廣泛分離的元素進行操作。

然後一些非活動頁面被交換到交換空間,對嗎?假設0-4095(4096B),8192-12287(4096B)在記憶體中,所有其他非活動頁面4096-8191(4096B),12288-16383(4096B)被交換到交換空間中。

那麼這句話是什麼意思:

相反,核心可以僅在實際需要時(即,當應用程序訪問頁面時)為映射的頁面保留交換空間。

如果不留在交換空間4096-8191(4096B)中,這些非活動頁面(和)還能留在哪裡?文本似乎表明交換空間存在 3 級記憶體。 12288-16383(4096B)

memory -> swap space (disk) -> ????

Swap 並不是真正的記憶體二級記憶體。它是記憶體的幾個備份儲存之一。當核心需要分配一頁物理記憶體,但沒有足夠的空閒記憶體時,需要驅逐另一頁;只有當被驅逐頁面的內容是可丟棄的,或者可以從其他地方恢復時,它才能做到這一點。其他地方是備份儲存:它可以是磁碟上的文件(例如,用於執行檔或映射文件),或者某些交換區域。

當記憶體記帳跟踪過度使用時,交換保留開始發揮作用(參見LPI中的表 49-4 )。當不允許過度使用時,核心需要在分配時確定是否可以進行分配。對於私有可寫映射和共享匿名映射,這意味著它必須有足夠的地址空間,以及足夠的交換空間(這樣核心才能保證映射記憶體的內容可以寫入那裡,從而保證寫入到映射記憶體永遠不會導致SIGSEGV)。

過度使用需要惰性交換保留:這意味著核心可以分配交換支持的記憶體映射,而無需保留相應的交換空間。正如LPI中提到的,這允許程序分配比實際可用更多的記憶體,並且應該使用MAP_NORESERVE. 只有在寫入頁面時才會發生保留,這意味著寫入可能會失敗SIGSEGV或導致 OOM 殺手介入。

這對於比您的 16KiB 範例更大的分配變得重要。想像一下,您想要一個 64GiB、262,144×262,144 的稀疏數組,以使您的程序更易於編寫:在嚴格保留的情況下,您需要擁有所有可用的記憶體;沒有嚴格的保留,你不會,只有你寫的頁面才會被實際分配。

請注意,這都是 Linux 特定的,並且與所選的系統過度使用策略 ( ) 緊密相關/proc/sys/vm/overcommit_memory:在模式 1(總是過度使用)和 2(從不過度使用)中,MAP_NORESERVE不會改變任何東西,它只會在模式 0 中起作用。

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