每次核心交換后臺(tái)進(jìn)程都會(huì)嘗試去壓縮這些cache 。
它首先檢查mem_map頁面數(shù)組中的頁面塊看是否有可以從物理內(nèi)存中丟棄出去的 。當(dāng)系統(tǒng)中的空閑頁面數(shù)降低 到一個(gè)危險(xiǎn)水平時(shí),核心后臺(tái)交換進(jìn)程頻繁進(jìn)行交換,則檢查的頁面塊一般比較大 。檢查的方式為輪轉(zhuǎn),每次試圖壓縮內(nèi)存映象時(shí),核心后臺(tái)交換進(jìn)程總是檢查不同的頁面塊 。這是眾所周知的clock算法,每次在整個(gè)mem_map頁面數(shù)組中對(duì)頁面進(jìn)行檢查 。
核心后臺(tái)交換進(jìn)程將檢查每個(gè)頁面看是否已經(jīng)被page cache或者buffer cache緩沖 。讀者可能已經(jīng)注意到共享頁面不在被考慮丟棄的頁面之列,這種頁面不會(huì)同時(shí)出現(xiàn)在這兩種cache中 。如果頁面不在這兩者中任何一種之中時(shí),它將檢查mem_map頁面數(shù)組中的下一個(gè)頁面 。
緩存在buffer cache(或者頁面中的緩沖被緩存)中的頁面可以使緩沖分配和回收更加有效 。內(nèi)存壓縮代碼將 力圖釋放在受檢頁面中包含的緩沖區(qū) 。
如果頁面中包含的所有緩沖區(qū)都被釋放,這個(gè)頁面也將被釋放 。如果受檢頁面在Linux的page cache中,則它會(huì)從page cache中刪除并釋放 。
如果釋放出來了足夠的頁面,核心交換后臺(tái)進(jìn)程將等待到下一次被喚醒 。這些被釋放的頁面都不是任何進(jìn)程虛擬內(nèi)存的一部分,這樣無須更新頁表 。如果沒有足夠的緩沖頁面丟棄則交換進(jìn)程將試圖將一些共享頁面交換出去 。
3.8.2換出系統(tǒng)V內(nèi)存頁面
系統(tǒng)V共享內(nèi)存是一種用來在進(jìn)程之間通過共享虛擬內(nèi)存來實(shí)現(xiàn)進(jìn)程通訊的機(jī)制 。進(jìn)程是如何共享內(nèi)存將在IPC 一章中詳細(xì)討論 。現(xiàn)在只需要說明系統(tǒng)V共享內(nèi)存的任何區(qū)域都可以用一個(gè)shmid_ds數(shù)據(jù)結(jié)構(gòu)來表示就足夠了 。此結(jié)構(gòu)包含一個(gè)指向vm_area的鏈表指針,vm_area是為每個(gè)共享此虛擬內(nèi)存區(qū)域設(shè)計(jì)的結(jié)構(gòu) 。它們之間通過 vm_next_shared和vm_prev_shared指針來連接 。每個(gè)shmid_ds數(shù)據(jù)結(jié)構(gòu)包含一個(gè)頁表入口,每個(gè)入口描敘物理頁面與共享虛擬頁面之間的映射關(guān)系 。
核心交換后臺(tái)進(jìn)程同樣使用clock算法來將系統(tǒng)V共享內(nèi)存頁面交換出去 。
每次運(yùn)行時(shí),它要記得哪個(gè)共享虛擬內(nèi)存區(qū)域的哪個(gè)頁面是最后一個(gè)被交換出去的 。兩個(gè)索引可以協(xié)助它完成這項(xiàng)工作,其一是一組shmid_ds數(shù)據(jù)結(jié)構(gòu)的索引,另一個(gè)是系統(tǒng)V共享內(nèi)存區(qū)域的頁表入口鏈表的索引 。這能夠保證對(duì)系統(tǒng)V共享內(nèi)存區(qū)域作出公平的選擇 。
由于對(duì)于給定的系統(tǒng)V共享虛擬內(nèi)存的物理頁面框號(hào)被保存在所有共享此虛擬內(nèi)存區(qū)域進(jìn)程的頁表中,核心 交換后臺(tái)進(jìn)程必須同時(shí)修改所有的頁表以表示頁面不再在內(nèi)存而在交換文件中 。對(duì)于每個(gè)要交換出去的共享 頁面,核心交換后臺(tái)進(jìn)程可以在每個(gè)共享進(jìn)程的頁表中的頁表入口中找到它們(通過vm_area_struct數(shù)據(jù)結(jié) 構(gòu)) 。如果對(duì)應(yīng)此系統(tǒng)V共享內(nèi)存的頁面的進(jìn)程頁表入口是有效的,它可以將其轉(zhuǎn)變成無效,這樣換出頁表入口和共享頁面的用戶數(shù)將減一 。換出系統(tǒng)V共享頁表入口的格式中包含一個(gè)對(duì)應(yīng)于一組shmid_ds數(shù)據(jù)結(jié)構(gòu)的索引以及一個(gè)對(duì)系統(tǒng)V共享內(nèi)存區(qū)域的頁表入口索引 。
如果所有共享進(jìn)程的頁表都被修改后此頁面的記數(shù)為0則共享頁面可以被寫到交換文件中 。同樣指向此系統(tǒng)V共享內(nèi)存區(qū)域的shmid_ds數(shù)據(jù)結(jié)構(gòu)鏈表中的頁表入口也被換出頁表入口代替 。換出頁表入口雖然無效但是它包含一組打開的交換文件的索引,同時(shí)還能找到換出頁面在文件中的偏移 。當(dāng)頁面重新被帶入物理內(nèi)存時(shí),這些信息十分有用 。
3.8.3換出和丟棄頁面
交換后臺(tái)進(jìn)程依次檢查系統(tǒng)中的每個(gè)進(jìn)程以確認(rèn)誰最適合交換出去 。
比較好的候選者是那些可以被交換出去(有些是不可被交換出去的)并且只有一個(gè)或者幾個(gè)頁面在內(nèi)存中的進(jìn)程 。只有那些包含的數(shù)據(jù)無法檢索的頁面才會(huì)從物理內(nèi)存中交換到系統(tǒng)交換文件中去 。
推薦閱讀
- 以Linux做路由器的問題
- Linux 核心--1.前言
- 紅豆糖水的功效與作用 紅豆糖水的功效與作用禁忌
- Linux 核心--3.軟件基礎(chǔ)
- 認(rèn)識(shí)Linux操作系統(tǒng)下三大便利開源防火墻
- 如何在Linux中設(shè)置磁盤限額?
- Linux下的各種備份方法匯總
- Linux 內(nèi)核解讀入門
- linux使用經(jīng)驗(yàn)點(diǎn)滴
- 安裝 Linux 無盤工作站
