日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内存不足时缩减缓存,Linux内存及页面缓存管理概要总结

發(fā)布時間:2023/12/2 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内存不足时缩减缓存,Linux内存及页面缓存管理概要总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

物理內(nèi)存管理

頁面內(nèi)存管理

Linux把物理內(nèi)存劃分為若干個大小相同(通常是4k)的頁面,每個頁面使用struct page描述,在內(nèi)核初始化時會根據(jù)物理內(nèi)存大小和頁面大小,初始化一個struct page數(shù)組mem_map[]對系統(tǒng)中所有的頁面進行統(tǒng)一管理。

物理頁面描述

使用Node,Zone,Page三級結(jié)構(gòu)進行管理。

對于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地址空間,內(nèi)核態(tài)占用高128T地址空間,所有物理內(nèi)存都可以被映射到內(nèi)核,所以沒有HighMem Zone(其實也是有的,只是跟32位的有區(qū)別)。

Page是內(nèi)核物理內(nèi)存管理的最小單位,包含各種該頁面內(nèi)存的狀態(tài)信息,分配狀況等。

物理頁面分配

使用Buddy,以2的N次方個頁面為單位進行內(nèi)存分配,主要解決外部碎片問題。

物理頁面回收

回收類型

內(nèi)存中并非所有物理頁面都是可以進行回收的,內(nèi)核占用的頁不會被換出,只有與用戶空間建立了映射關系的物理頁面才會被換出??偟膩碚f,以下這些種物理頁面可以被 Linux 操作系統(tǒng)回收:

進程映射所占的頁面,包括代碼段,數(shù)據(jù)段,堆棧以及動態(tài)分配的“存儲堆”( malloc 分配的)。

用戶空間中通過 mmap()把文件內(nèi)容映射到內(nèi)存所占的頁面。

匿名頁面(沒有映射到文件的都是匿名映射,用戶空間的堆和棧):進程用戶模式下的堆棧以及是使用 mmap 匿名映射的內(nèi)存區(qū)(共享內(nèi)存 區(qū))。注:堆棧所占頁面一般不被換出。

特殊的用于 slab 分配器的緩存,比如用于緩存文件目錄結(jié)構(gòu) dentry 的 cache,以及用于緩存索引節(jié)點 inode 的 cache

tmpfs 文件系統(tǒng)使用的頁。

回收時機

周期性的檢查:這是由后臺運行的守護進程 kswapd 完成的。該進程定期檢查當前系統(tǒng)的內(nèi)存使用情況,當發(fā)現(xiàn)系統(tǒng)內(nèi)空閑的物理頁面數(shù)目少于特定的閾值時,該進程就會發(fā)起頁面回收的操作。

“內(nèi)存嚴重不足”事件的觸發(fā):在某些情況下,比如,操作系統(tǒng)忽然需要通過伙伴系統(tǒng)為用戶進程分配一大塊內(nèi)存,或者需要創(chuàng)建一個很大的緩沖區(qū),而當時系統(tǒng)中 的內(nèi)存沒有辦法提供足夠多的物理內(nèi)存以滿足這種內(nèi)存請求,這時候,操作系統(tǒng)就必須盡快進行頁面回收操作,以便釋放出一些內(nèi)存空間從而滿足上述的內(nèi)存請求。 這種頁面回收方式也被稱作“直接頁面回收”。

swap內(nèi)存管理

在低速磁盤上選定一塊空間,以頁面大小(通常是4k)為單位劃分空間(開頭還有4k的swap分區(qū)描述結(jié)構(gòu)),以頁面為單位進行管理。

虛擬內(nèi)存管理

內(nèi)核態(tài)虛擬內(nèi)存管理

內(nèi)核態(tài)虛擬內(nèi)存分配

使用slab分配器(嵌入式系統(tǒng)使用輕量級slub分配器,大型服務器使用支持大量大內(nèi)存分配的slob分配器),主要解決外部碎片問題。

在此基礎上創(chuàng)建一系列的頁面緩存,比如task_struct,inode,file緩存。

kmalloc使用slab創(chuàng)建一系列以2的N次方大小為單位的頁面緩存進行內(nèi)存分配,所以分配的內(nèi)存的物理連續(xù)的,且地址空間位于Normal Zone。

vmalloc與vmalloc使用的分配方法稍有不同,分配的內(nèi)存可能是屋里不連續(xù)的,且映射空間在HighMem Zone。

用戶態(tài)虛擬內(nèi)存分配

malloc進行內(nèi)存分配實際上是通過brk和mmap函數(shù)實現(xiàn)的,brk和mmap函數(shù)僅僅是在進程的task_struc中創(chuàng)建新的vma,以及為進程創(chuàng)建新的頁表,并未進行實際內(nèi)存分配。

實際內(nèi)存分配發(fā)生在當用戶初次訪問內(nèi)存引起的缺頁中斷中,使用buddy分配器以頁面為單位進行分配。

頁面緩存管理

命名頁面,比如所有的文件或者塊設備所對應的頁面緩沖,也就是有后備存儲的緩沖。在Linux的所有文件或者塊設備的IO過程中,除了使用DirectIO方式之外,全部會使用內(nèi)存進行緩沖。如果使用read/write方式,則會有塊緩沖,如果使用mmap方式,則會使用頁緩沖。在新版的Linux內(nèi)核中,這二者已經(jīng)融為一體,使用相同的不同的數(shù)據(jù)結(jié)構(gòu)描述相同的數(shù)據(jù)頁面,且對于inode相同的文件或塊設備,其緩沖在整個內(nèi)核中只有唯一的一份。

匿名頁面,比如用戶態(tài)分配的內(nèi)存,無論是brk還是mmap分配,也就是沒有后備存儲的頁面。

在頁面回收時,對于命名頁面,如果為臟則陷入后備存儲后丟棄,對于匿名頁面,如果為臟則寫入swap存儲。

頁面緩存回收使用LRU2Q算法,將不常用的頁面釋放掉。

用戶態(tài)可以對命名頁面進行控制的函數(shù)

fadvise系列函數(shù),控制緩存頁面的加載,丟棄。

mlock系列函數(shù),鎖定或解鎖緩存頁面。

mincore函數(shù), 查看命名頁面狀態(tài)。

總結(jié)

以上是生活随笔為你收集整理的linux内存不足时缩减缓存,Linux内存及页面缓存管理概要总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。