Linux內存管理 -- 白話Linux page cache / swap cache/頁框回收

Linux內存管理 – 白話頁框回收

經過前面幾篇博客翻譯和閱讀Understaning Linux Virtutal Memory Manger,對於Linux頁框回收有了一些基本的理解。現在自己再來對照Linux kernel2.6.9源碼來做一些總結。

什麼是Page Cache?

在Linux中所謂的page cache就是指struct address_space。磁盤中一個文件或者其他虛擬文件(shmem)所對應的page每次都是經過同一個struct address_space來進行管理,便於此類型的page在多進程見進行共享,以及阻止一些不必要的磁盤IO。
如下圖中,兩個進程打開同一個文件file A,以及讀取文件內容:
address_space
從上圖中可以看出,page cache的作用主要是將磁盤中文件緩存到內存,並集中管理,便於回收利用。

什麼是Swap Cache?

系統中常常會有一些進程在初始化時要了很多memory(主要是通過malloc獲取的匿名page),初始化完成之後,這部分memory該進程不會經常用到,也沒有釋放。這就造成了內存的浪費。Linux就想了個辦法要把這些memory中的數據置換到磁盤中,然後將這個memory標記爲可回收,然後Linux中頁框回收機制就會將這些page回收然後將這些page讓給有需要的進程來用。
swap cache主要是要解決兩個層面的問題:
<1>哪些page可以加入到swap cache中?swap cache中page如何管理?
<2>swap cache中被交換到磁盤中page,如何知道放在磁盤哪個位置,再次被找回來 ?
第一個問題有一個特殊的address_space,swapper_space來管理,具體如何回收由下一小節說明。
第二個問題通過struct swap_info_struct來管理,其中最終要的是將原來這個page的對應的PTE替換成type + offset的形式。
swap

什麼是buffer Cache?

在page cache出現之前,文件的緩存或者塊設備的數據緩存叫做buffer cache。現在都叫page cache。

圖解頁框回收

  • 在Linux的每個Zone中有兩個list:active_list和inactive_list,這兩個list包含了該Zone中所有已經分配的page。其中active_list中表示正在使用的page,而inactive_list中是很少使用待回收的page。
  • 在下列兩種case下會觸發內存回收機制:從active_list的底部循環將active_list中符合條件的page添加待inactive_list,然後再從inactive_list中選擇合適的page釋放內存。
    • 每當alloc page時,如果發現memory不夠了,調用try_to_free_pages()來釋放內存。
    • 通過守護進程kswapd來check zone的memory water mark,發現內存到達低水位,觸發內存回收機制釋放內存。
      de
發佈了26 篇原創文章 · 獲贊 0 · 訪問量 2849
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章