Ⅰ linux內存回收的三種方式
1. 快速內存回收:處於get_page_from_freelist()函數中,在遍歷zonelist過程中,對每個zone都在分配前進行判斷,如果分配後zone的空閑內存數量 < 閥值 + 保留頁框數量,那麼此zone就會進行快速內存回收。其中閥值可能是min/low/high的任何一種,因為在快速內存分配,慢速內存分配和oom分配過程中如果回收的頁框足夠,都會調用到get_page_from_freelist()函數,所以快速內存回收不僅僅發生在快速內存分配中,在慢速內存分配過程中也會發生。
2. 直接內存回收:處於慢速分配過程中,直接內存回收只有一種情況下會使用,在慢速分配中無法從zonelist的所有zone中以min閥值分配頁框,並且進行非同步內存壓縮後,還是無法分配到頁框的時候,就對zonelist中的所有zone進行一次直接內存回收。注意,直接內存回收是針對zonelist中的所有zone的,它並不像快速內存回收和kswapd內存回收,只會對zonelist中空閑頁框不達標的zone進行內存回收。在直接內存回收中,有可能喚醒flush內核線程。
3. kswapd內存回收:發生在kswapd內核線程中,每個node有一個swapd內核線程,也就是kswapd內核線程中的內存回收,是只針對所在node的,並且只會對分配了order頁框數量後空閑頁框數量 < 此zone的high閥值 + 保留頁框數量的zone進行內存回收,並不會對此node的所有zone進行內存回收。