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