linux内存不足时缩减缓存,Linux内存及页面缓存管理概要总结
物理內(nèi)存管理
頁面內(nèi)存管理
Linux把物理內(nèi)存劃分為若干個(gè)大小相同(通常是4k)的頁面,每個(gè)頁面使用struct page描述,在內(nèi)核初始化時(shí)會(huì)根據(jù)物理內(nèi)存大小和頁面大小,初始化一個(gè)struct page數(shù)組mem_map[]對(duì)系統(tǒng)中所有的頁面進(jìn)行統(tǒng)一管理。
物理頁面描述
使用Node,Zone,Page三級(jí)結(jié)構(gòu)進(jìn)行管理。
對(duì)于NUMA計(jì)算機(jī),有多個(gè)Node,非NUMA計(jì)算機(jī)則只有一個(gè)Node。
每個(gè)Node中有3個(gè)Zone,分別為DMA,Normal和HighMem(有的還有DMA32等其他Zone,不是必須,有的有特殊用途,此處忽略)。在32位CPU中,DMA為從3G開始的16M地址空間,Normal為接下來的880M地址空間,HighMem為最后的128M地址空間。在64位CPU中,由于目前只用了48位地址,共256T地址空間,內(nèi)核態(tài)占用高128T地址空間,所有物理內(nèi)存都可以被映射到內(nèi)核,所以沒有HighMem Zone(其實(shí)也是有的,只是跟32位的有區(qū)別)。
Page是內(nèi)核物理內(nèi)存管理的最小單位,包含各種該頁面內(nèi)存的狀態(tài)信息,分配狀況等。
物理頁面分配
使用Buddy,以2的N次方個(gè)頁面為單位進(jìn)行內(nèi)存分配,主要解決外部碎片問題。
物理頁面回收
回收類型
內(nèi)存中并非所有物理頁面都是可以進(jìn)行回收的,內(nèi)核占用的頁不會(huì)被換出,只有與用戶空間建立了映射關(guān)系的物理頁面才會(huì)被換出。總的來說,以下這些種物理頁面可以被 Linux 操作系統(tǒng)回收:
進(jìn)程映射所占的頁面,包括代碼段,數(shù)據(jù)段,堆棧以及動(dòng)態(tài)分配的“存儲(chǔ)堆”( malloc 分配的)。
用戶空間中通過 mmap()把文件內(nèi)容映射到內(nèi)存所占的頁面。
匿名頁面(沒有映射到文件的都是匿名映射,用戶空間的堆和棧):進(jìn)程用戶模式下的堆棧以及是使用 mmap 匿名映射的內(nèi)存區(qū)(共享內(nèi)存 區(qū))。注:堆棧所占頁面一般不被換出。
特殊的用于 slab 分配器的緩存,比如用于緩存文件目錄結(jié)構(gòu) dentry 的 cache,以及用于緩存索引節(jié)點(diǎn) inode 的 cache
tmpfs 文件系統(tǒng)使用的頁。
回收時(shí)機(jī)
周期性的檢查:這是由后臺(tái)運(yùn)行的守護(hù)進(jìn)程 kswapd 完成的。該進(jìn)程定期檢查當(dāng)前系統(tǒng)的內(nèi)存使用情況,當(dāng)發(fā)現(xiàn)系統(tǒng)內(nèi)空閑的物理頁面數(shù)目少于特定的閾值時(shí),該進(jìn)程就會(huì)發(fā)起頁面回收的操作。
“內(nèi)存嚴(yán)重不足”事件的觸發(fā):在某些情況下,比如,操作系統(tǒng)忽然需要通過伙伴系統(tǒng)為用戶進(jìn)程分配一大塊內(nèi)存,或者需要?jiǎng)?chuàng)建一個(gè)很大的緩沖區(qū),而當(dāng)時(shí)系統(tǒng)中 的內(nèi)存沒有辦法提供足夠多的物理內(nèi)存以滿足這種內(nèi)存請求,這時(shí)候,操作系統(tǒng)就必須盡快進(jìn)行頁面回收操作,以便釋放出一些內(nèi)存空間從而滿足上述的內(nèi)存請求。 這種頁面回收方式也被稱作“直接頁面回收”。
swap內(nèi)存管理
在低速磁盤上選定一塊空間,以頁面大小(通常是4k)為單位劃分空間(開頭還有4k的swap分區(qū)描述結(jié)構(gòu)),以頁面為單位進(jìn)行管理。
虛擬內(nèi)存管理
內(nèi)核態(tài)虛擬內(nèi)存管理
內(nèi)核態(tài)虛擬內(nèi)存分配
使用slab分配器(嵌入式系統(tǒng)使用輕量級(jí)slub分配器,大型服務(wù)器使用支持大量大內(nèi)存分配的slob分配器),主要解決外部碎片問題。
在此基礎(chǔ)上創(chuàng)建一系列的頁面緩存,比如task_struct,inode,file緩存。
kmalloc使用slab創(chuàng)建一系列以2的N次方大小為單位的頁面緩存進(jìn)行內(nèi)存分配,所以分配的內(nèi)存的物理連續(xù)的,且地址空間位于Normal Zone。
vmalloc與vmalloc使用的分配方法稍有不同,分配的內(nèi)存可能是屋里不連續(xù)的,且映射空間在HighMem Zone。
用戶態(tài)虛擬內(nèi)存分配
malloc進(jìn)行內(nèi)存分配實(shí)際上是通過brk和mmap函數(shù)實(shí)現(xiàn)的,brk和mmap函數(shù)僅僅是在進(jìn)程的task_struc中創(chuàng)建新的vma,以及為進(jìn)程創(chuàng)建新的頁表,并未進(jìn)行實(shí)際內(nèi)存分配。
實(shí)際內(nèi)存分配發(fā)生在當(dāng)用戶初次訪問內(nèi)存引起的缺頁中斷中,使用buddy分配器以頁面為單位進(jìn)行分配。
頁面緩存管理
命名頁面,比如所有的文件或者塊設(shè)備所對(duì)應(yīng)的頁面緩沖,也就是有后備存儲(chǔ)的緩沖。在Linux的所有文件或者塊設(shè)備的IO過程中,除了使用DirectIO方式之外,全部會(huì)使用內(nèi)存進(jìn)行緩沖。如果使用read/write方式,則會(huì)有塊緩沖,如果使用mmap方式,則會(huì)使用頁緩沖。在新版的Linux內(nèi)核中,這二者已經(jīng)融為一體,使用相同的不同的數(shù)據(jù)結(jié)構(gòu)描述相同的數(shù)據(jù)頁面,且對(duì)于inode相同的文件或塊設(shè)備,其緩沖在整個(gè)內(nèi)核中只有唯一的一份。
匿名頁面,比如用戶態(tài)分配的內(nèi)存,無論是brk還是mmap分配,也就是沒有后備存儲(chǔ)的頁面。
在頁面回收時(shí),對(duì)于命名頁面,如果為臟則陷入后備存儲(chǔ)后丟棄,對(duì)于匿名頁面,如果為臟則寫入swap存儲(chǔ)。
頁面緩存回收使用LRU2Q算法,將不常用的頁面釋放掉。
用戶態(tài)可以對(duì)命名頁面進(jìn)行控制的函數(shù)
fadvise系列函數(shù),控制緩存頁面的加載,丟棄。
mlock系列函數(shù),鎖定或解鎖緩存頁面。
mincore函數(shù), 查看命名頁面狀態(tài)。
總結(jié)
以上是生活随笔為你收集整理的linux内存不足时缩减缓存,Linux内存及页面缓存管理概要总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适合自我激励的句子195个
- 下一篇: 密友是什么意思