去的進程,交換後台進程將搜索其整個虛擬內存區域以找到那些沒有共享或者加鎖的區域。
Linux並不會將選中的進程的整個可交換頁麵都交換出去,它隻刪除一小部分頁麵。
如果內存被加鎖則頁麵不能被交換或者丟棄。
Linux交換算法使用頁麵衰老算法。每個頁麵有一個計數器來告訴核心交換後台進程這個頁麵是否值得交換出去(此計數器包含在mem_map_t結構中)。當頁麵沒有使用或者沒有找到時將會衰老;交換後台進程僅僅交換出那些老頁麵。缺省操作是:當頁麵被首次分配時,其年齡初始值為3,每次引用其年齡將加3,最大值為20。每次核心交換後台進程運行它來使頁麵衰老-將年齡減1。這個缺省操作可以改變並且由於這個原因它們被存儲在swap_control數據結構中。
如果頁麵變老了(age=0),則交換後台進程將進一步來處理它。dirty頁麵可以被交換出去。Linux在PTE中使用一個硬件相關位來描敘頁麵的這個特性(見圖3.2)。然而不是所有的dirty頁麵都有必要寫入到交換文件中去。進程的每個虛擬內存區域可能有其自身的交換操作(由vm_area_struct結構中的vm_ops指針表示),在交換時使用的是這些方法。否則,交換後台進程將在交換文件中分配一個頁麵並將頁麵寫到設備上去。
頁麵的頁表入口被標誌成無效但是它包含了頁麵在在交換文件中位置的信息,包括一個表示頁麵在交換文件中位置的偏移值以及使用的是哪個交換文件。但是不管使用的是哪種交換算法,以前那個物理頁麵將被標誌成空閒並放入free_area中。Clean(或者notdirty)的頁麵可以丟棄同時放入free_area以備重新使用。
如果有足夠的可交換進程頁麵被交換出去或丟棄,則交換後台進程將再次睡眠。下次它醒來時將考慮係統中的下一個進程。通過這種方法,交換後台進程一點一點地將每個進程的可交換或可丟棄物理頁麵收回知道係統再次處於平衡狀態。這比將整個進程交換出去要公平得多。
【𝗼𝗼𝗽.𝘁𝘄 無錯章節】
TheSwapCache
當將頁麵交換到交換文件中時,Linux總是避免頁麵寫,除非必須這樣做。當頁麵已經被交換出內存但是當有進程再次訪問時又要將它重新調入內存。隻要頁麵在內存中沒有被寫過,則交換文件中的拷貝是有效的。
Linux使用swapcache來跟蹤這些頁麵。這個swapcache是一個頁表入口鏈表,每個對應於係統中的物理頁麵。這是一個對應於交換出頁麵的頁表入口並且描敘頁麵放置在哪個交換文件中以及在交換文件中的位置。如果swapcache入口為非0值,則表示在交換文件中的這一頁沒有被修改。如果此頁被修改(或者寫入)。則其入口從swapcache中刪除。
當Linux需要將一個物理頁麵交換到交換文件時,它將檢查swapcache,如果對應此頁麵存在有效入口,則不必將這個頁麵寫到交換文件中。這是因為自從上次從交換文件中將其讀出來,內存中的這個頁麵還沒有被修改。
swapcache中的入口是已換出頁麵的頁表入口。它們雖被標記為無效但是為Linux提供了頁麵在哪個交換文件中以及文件中的位置等信息。
頁麵的換入
保存在交換文件中的dirty頁麵可能被再次使用到,例如,當應用程序向包含在已交換出物理頁麵上的虛擬內存區域寫入時。對不在物理內存中的虛擬內存頁麵的訪問將引發頁麵錯誤。由於處理器不能將此虛擬地址轉換成物理地址,處理器將通知操作係統。由於已被交換出去,此時描敘此頁麵的頁表入口被標記成無效。處理器不能處理這種虛擬地址到物理地址的轉換,所以它將控製傳遞給操作係統,同時通知操作係統頁麵錯誤的地址與原因。這些信息的格式以及處理器如何將控製傳遞給操作係統與具體硬件有關。
。少更間時作操找查使成排安意特構結據數tcurts_aera_mv的程進,大重係關間時與碼代些這。止為到找到直置位的址地擬虛錯出含包找查中tcurts_aera_mv的程進此在過通它。構結據數tcurts_aera_mv的域區存內擬虛的應對址地擬虛錯出含包敘描位定將碼代理處誤錯麵頁關相器理處
。似類麵前和分部餘其程過理處錯麵頁,後域區存內效有的址地擬虛錯出到找且並作操關相器理處些這完行執
。存內入理物進換交麵頁將便以息信些這用利xuniL。中口入表頁入放息信要必的麵頁此位定把並效無成記標麵頁些這將器理處的有所是但,關有型類器理處與式格的口入表頁的麵頁出換已。存內理物入進換交其將須必xuniL,麵頁出換已個一是口入表頁的到找果如。口入表頁找尋址地擬虛錯出為碼代理處錯麵頁用通
。理處殊特須無麵頁通普定假xuniL是能可這,作操nipaws有沒果如。同不許少有麵頁出換已的通普和麵頁享共V統係出換已為因-程過理處的麵頁存內享共V統係出換已是這。它用使會xuniL則nipaws在存域區存內擬虛此對果如。nipaws:序程子的中存內理物到換交域區存內擬虛此將含包能可構結據數tcurts_aera_mv。口入表頁的息信置位麵頁含包個一有擁且並址地存內擬虛錯出道知xuniL時此
。出取中口入表頁從息信置位中件文換交在麵頁於關。入讀麵頁出換已將並麵頁理物配分將統係
。中件文換交於在存經已麵頁為因,寫次這除免以可xuniL,出換新重求要被且並寫被有沒麵頁果如。除刪中ehcacpaws從口入其時同,ytrid為記標被麵頁時這,誤錯麵頁個一另生產將則,入寫被後隨麵頁果如。寫可為記標再不口入表頁的它且並中ehcacpaws在留保被麵頁則作操寫是不問訪的誤錯麵頁起引果如
刪中ehcacpaws從被將麵頁個這,作操寫是作操的出讀中件文換交從麵頁起引果如