1. 程式人生 > 實用技巧 >總結這些年所學的php難點linux恢復值ss_wap模式下的工作環境

總結這些年所學的php難點linux恢復值ss_wap模式下的工作環境

shrink_page_list(struct list_head *page_list, struct pglist_data *pgdat, struct scan_control *sc, enum ttu_flags ttu_flags, struct reclaim_stat *stat, bool force_reclaim)

初步被選出來的系統認為滿足條件的頁面放在 page_list 這個連結串列中,至於如何選擇滿足條件的頁面,是由記憶體回收演算法LRU決定,這是記憶體管理方面的知識,這裡不作詳細地描述。在這個函式中會對 page_list 連結串列中所有的頁面逐一處理,若是匿名的並且沒有被 swap cache 快取的頁面,通過 add_to_swap 函式通知 swap core 和 swap cache 把該頁面的資料交換出記憶體,隨後在 try_to_unmap 函式中修改該 page 對應的 pte,使其指向 swap entry 的 pte。因此 add_to_swap 函式則是 swap core 和 swap cache 與記憶體回收之間的橋樑。

Swap Out - 從記憶體到磁碟
核心在回收anonymous pages前,會把它們的內容複製到一個swap area的某個slot中儲存起來,這個過程叫做swap out,對應的執行函式是add_to_swap()。

首先需要呼叫get_swap_page()函式從swap area中分配空餘的slot,然後增加swap cache(交換快取)對準備swap out的頁面的指向,並標記這個頁面的狀態為"dirty"。由於swap cache的作用主要體現在swap in的過程中,因此將放在下文詳細介紹。

等到呼叫swap_writepage(),才會執行真正的I/O操作,將頁面的內容寫入外部的swap area,然後清除swap cache對頁面的指向,釋放頁面所佔的記憶體:

複製程式碼
int swap_writepage(struct page *page, struct writeback_control *wbc)
{
int ret = 0;

if (try_to_free_swap(page)) {
    unlock_page(page);
    goto out;
}
if (frontswap_store(page) == 0) {
    set_page_writeback(page);
    unlock_page(page);
    end_page_writeback(page);
    goto out;
}
ret = __swap_writepage(page, wbc, end_swap_bio_write);

out:
return ret;
}
複製程式碼

reference: