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

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



3.7Linux頁(yè)面cache



圖3.6 Linux頁(yè)面Cache


Linux使用頁(yè)面cache的目的是加快對(duì)磁盤(pán)上文件的訪問(wèn) 。內(nèi)存映射文件以每次一頁(yè)的方式讀出并將這些頁(yè)面存儲(chǔ)在頁(yè)面cache中 。圖3.6表明頁(yè)面cache由page_hash_table,指向mem_map_t數(shù)據(jù)結(jié)構(gòu)的指針數(shù)組組成 。

Linux中的每個(gè)文件通過(guò)一個(gè)VFS inode(在文件系統(tǒng)一章中講敘)數(shù)據(jù)結(jié)構(gòu)來(lái)標(biāo)識(shí)并且每個(gè)VFS inode都是唯一的,它可以并僅可以描敘一個(gè)文件 。頁(yè)表的索引從文件的VFS inode和文件的偏移中派生出來(lái) 。

從一個(gè)內(nèi)存映射文件中讀出頁(yè)面,例如產(chǎn)生換頁(yè)請(qǐng)求時(shí)要將頁(yè)面讀回內(nèi)存中,系統(tǒng)嘗試從頁(yè)面cache來(lái)讀出 。如果頁(yè)面在cache中,則返回頁(yè)面失效處理過(guò)程一個(gè)指向mem_map_t數(shù)據(jù)結(jié)構(gòu);否則此頁(yè)面將從包含映象的文件系統(tǒng)中讀入內(nèi)存并為之分配物理頁(yè)面 。

在映象的讀入與執(zhí)行過(guò)程中,頁(yè)面cache不斷增長(zhǎng) 。當(dāng)不再需要某個(gè)頁(yè)面時(shí),即不再被任何進(jìn)程使用時(shí),它將被從頁(yè)面cache中刪除 。

3.8換出與丟棄頁(yè)面
當(dāng)系統(tǒng)中物理內(nèi)存減少時(shí),Linux內(nèi)存管理子系統(tǒng)必須釋放物理頁(yè)面 。這個(gè)任務(wù)由核心交換后臺(tái)進(jìn)程(kswapd )來(lái)完成 。

核心交換后臺(tái)進(jìn)程是一種特殊的核心線程 。它是沒(méi)有虛擬內(nèi)存的進(jìn)程,在物理地址空間上以核心態(tài)運(yùn)行 。核心交換后臺(tái)進(jìn)程的名字容易使人誤解,其實(shí)它完成的工作比僅僅將頁(yè)面交換到系統(tǒng)的交換文件中要多得多 。其目標(biāo)是保證系統(tǒng)中有足夠的空閑頁(yè)面來(lái)維持內(nèi)存管理系統(tǒng)運(yùn)行效率 。

此進(jìn)程由核心的init進(jìn)程在系統(tǒng)啟動(dòng)時(shí)運(yùn)行,被核心交換定時(shí)器周期性的調(diào)用 。

當(dāng)定時(shí)器到時(shí)后,交換后臺(tái)進(jìn)程將檢查系統(tǒng)中的空閑頁(yè)面數(shù)是否太少 。它使用兩個(gè)變量:free_pages_high 和free_page_low來(lái)判斷是否該釋放一些頁(yè)面 。只要系統(tǒng)中的空閑頁(yè)面數(shù)大于free_pages_high,核心交換后臺(tái)進(jìn)程不做任何工作;它將睡眠到下一次定時(shí)器到時(shí) 。在檢查中,核心交換后臺(tái)進(jìn)程將當(dāng)前被寫(xiě)到交換文件中的頁(yè)面數(shù)也計(jì)算在內(nèi),它使用nr_async_pages來(lái)記錄這個(gè)數(shù)值;當(dāng)有頁(yè)面被排入準(zhǔn)備寫(xiě)到交換文件隊(duì)列中時(shí),它將遞增一次,同時(shí)當(dāng)寫(xiě)入操作完成后遞減一次 。如果系統(tǒng)中的空閑頁(yè)面數(shù)在free_pages_high甚至 free_pages_low以下時(shí),核心交換后臺(tái)進(jìn)程將通過(guò)三個(gè)途徑來(lái)減少系統(tǒng)中使用的物理頁(yè)面的個(gè)數(shù):

減少緩沖與頁(yè)面cache的大小,
將系統(tǒng)V類(lèi)型的內(nèi)存頁(yè)面交換出去,
換出或者丟棄頁(yè)面 。
如果系統(tǒng)中空閑頁(yè)面數(shù)低于free_pages_low,核心交換后臺(tái)進(jìn)程將在下次運(yùn)行之前釋放6個(gè)頁(yè)面 。否則它只釋放3個(gè) 。以上三種方法將依次使用直到系統(tǒng)釋放出足夠的空閑頁(yè)面 。當(dāng)核心交換后臺(tái)進(jìn)程試圖釋放物理頁(yè)面時(shí)它將記錄使用的最后一種方法 。下一次它會(huì)首先運(yùn)行上次最后成功的算法 。

當(dāng)釋放出足夠頁(yè)面后,核心交換后臺(tái)進(jìn)程將再次睡眠到下次定時(shí)器到時(shí) 。如果導(dǎo)致核心交換后臺(tái)進(jìn)程釋放頁(yè)面的原因是系統(tǒng)中的空閑頁(yè)面數(shù)小于free_pages_low,則它只睡眠平時(shí)的一半時(shí)間 。一旦空閑頁(yè)面數(shù)大于 free_pages_low則核心交換進(jìn)程的睡眠時(shí)間又會(huì)延長(zhǎng) 。

3.8.1減少Page Cache和Buffer Cache的大小
Page Cache和Buffer cache中的頁(yè)面將被優(yōu)先考慮釋放到free_area數(shù)組中 。Page Cache中包含的是內(nèi)存映射文件的頁(yè)面,其中有些可能是不必要的,它們浪費(fèi)了系統(tǒng)的內(nèi)存 。而B(niǎo)uffer Cache中包含的是從物理設(shè)備中讀寫(xiě)的緩沖數(shù)據(jù),有些可能也是不必要的 。當(dāng)系統(tǒng)中物理頁(yè)面開(kāi)始耗盡時(shí),從這些cache中丟棄頁(yè)面比較簡(jiǎn)單(它不需要象從內(nèi)存中交換一樣,無(wú)須對(duì)物理設(shè)備進(jìn)行寫(xiě)操作) 。除了會(huì)使對(duì)物理設(shè)備及內(nèi)存映射文件的訪問(wèn)速度降低外,頁(yè)面丟棄策略沒(méi)有太多的副作用 。如果策略得當(dāng),則所有進(jìn)程的損失相同 。

推薦閱讀