日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--4.內(nèi)存管理( 九 )



可執(zhí)行映象的許多內(nèi)容都可以從映象文件中讀出并且可以很容易重讀出來 。例如,映象中的可執(zhí)行指令不能被映象本身修改,所以決不會(huì)寫到交換文件中去 。這些頁面直接丟棄就可以 。當(dāng)進(jìn)程再次引用它們時(shí),只需要從可執(zhí)行映象文件中讀入內(nèi)存即可 。

一旦確定了將要被交換出去的進(jìn)程,交換后臺(tái)進(jìn)程將搜索其整個(gè)虛擬內(nèi)存區(qū)域以找到那些沒有共享或者加鎖的區(qū)域 。

Linux并不會(huì)將選中的進(jìn)程的整個(gè)可交換頁面都交換出去,它只刪除一小部分頁面 。

如果內(nèi)存被加鎖則頁面不能被交換或者丟棄 。

Linux交換算法使用頁面衰老算法 。每個(gè)頁面有一個(gè)計(jì)數(shù)器來告訴核心交換后臺(tái)進(jìn)程這個(gè)頁面是否值得交換出 去(此計(jì)數(shù)器包含在mem_map_t結(jié)構(gòu)中) 。當(dāng)頁面沒有使用或者沒有找到時(shí)將會(huì)衰老;交換后臺(tái)進(jìn)程僅僅交換 出那些老頁面 。缺省操作是:當(dāng)頁面被首次分配時(shí),其年齡初始值為3,每次引用其年齡將加3,最大值為20 。每次核心交換后臺(tái)進(jìn)程運(yùn)行它來使頁面衰老-將年齡減1 。這個(gè)缺省操作可以改變并且由于這個(gè)原因它們被存儲(chǔ)在swap_control數(shù)據(jù)結(jié)構(gòu)中 。

如果頁面變老了(age=0),則交換后臺(tái)進(jìn)程將進(jìn)一步來處理它 。dirty頁面可以被交換出去 。Linux在PTE中使 用一個(gè)硬件相關(guān)位來描敘頁面的這個(gè)特性(見圖3.2) 。然而不是所有的dirty頁面都有必要寫入到交換文件 中去 。進(jìn)程的每個(gè)虛擬內(nèi)存區(qū)域可能有其自身的交換操作(由vm_area_struct結(jié)構(gòu)中的vm_ops指針表示),在 交換時(shí)使用的是這些方法 。否則,交換后臺(tái)進(jìn)程將在交換文件中分配一個(gè)頁面并將頁面寫到設(shè)備上去 。

頁面的頁表入口被標(biāo)志成無效但是它包含了頁面在在交換文件中位置的信息,包括一個(gè)表示頁面在交換文件中位置的偏移值以及使用的是哪個(gè)交換文件 。但是不管使用的是哪種交換算法,以前那個(gè)物理頁面將被標(biāo)志成空閑并放入free_area中 。Clean(或者not dirty)的頁面可以丟棄同時(shí)放入free_area以備重新使用 。

如果有足夠的可交換進(jìn)程頁面被交換出去或丟棄,則交換后臺(tái)進(jìn)程將再次睡眠 。下次它醒來時(shí)將考慮系統(tǒng)中 的下一個(gè)進(jìn)程 。通過這種方法,交換后臺(tái)進(jìn)程一點(diǎn)一點(diǎn)地將每個(gè)進(jìn)程的可交換或可丟棄物理頁面收回知道系 統(tǒng)再次處于平衡狀態(tài) 。這比將整個(gè)進(jìn)程交換出去要公平得多 。

3.9The Swap Cache
當(dāng)將頁面交換到交換文件中時(shí),Linux總是避免頁面寫,除非必須這樣做 。當(dāng)頁面已經(jīng)被交換出內(nèi)存但是當(dāng)有進(jìn)程再次訪問時(shí)又要將它重新調(diào)入內(nèi)存 。只要頁面在內(nèi)存中沒有被寫過,則交換文件中的拷貝是有效的 。

Linux使用swap cache來跟蹤這些頁面 。這個(gè)swap cache是一個(gè)頁表入口鏈表,每個(gè)對(duì)應(yīng)于系統(tǒng)中的物理頁面 。這是一個(gè)對(duì)應(yīng)于交換出頁面的頁表入口并且描敘頁面放置在哪個(gè)交換文件中以及在交換文件中的位置 。如果swap cache入口為非0值,則表示在交換文件中的這一頁沒有被修改 。如果此頁被修改(或者寫入) 。則其入口從swap cache中刪除 。

當(dāng)Linux需要將一個(gè)物理頁面交換到交換文件時(shí),它將檢查swap cache,如果對(duì)應(yīng)此頁面存在有效入口,則 不必將這個(gè)頁面寫到交換文件中 。這是因?yàn)樽詮纳洗螐慕粨Q文件中將其讀出來,內(nèi)存中的這個(gè)頁面還沒有被修改 。

swap cache中的入口是已換出頁面的頁表入口 。它們雖被標(biāo)記為無效但是為Linux提供了頁面在哪個(gè)交換文件中以及文件中的位置等信息 。


3.10頁面的換入
保存在交換文件中的dirty頁面可能被再次使用到,例如,當(dāng)應(yīng)用程序向包含在已交換出物理頁面上的虛擬內(nèi)存區(qū)域?qū)懭霑r(shí) 。對(duì)不在物理內(nèi)存中的虛擬內(nèi)存頁面的訪問將引發(fā)頁面錯(cuò)誤 。由于處理器不能將此虛擬地址轉(zhuǎn)換成物理地址,處理器將通知操作系統(tǒng) 。由于已被交換出去,此時(shí)描敘此頁面的頁表入口被標(biāo)記成無效 。處理器不能處理這種虛擬地址到物理地址的轉(zhuǎn)換,所以它將控制傳遞給操作系統(tǒng),同時(shí)通知操作系統(tǒng)頁面錯(cuò)誤的地址與原因 。這些信息的格式以及處理器如何將控制傳遞給操作系統(tǒng)與具體硬件有關(guān) 。

推薦閱讀