內(nèi)存主要是用來存儲(chǔ)系統(tǒng)和應(yīng)用程序的指令、數(shù)據(jù)、緩存等
內(nèi)存映射
內(nèi)存是需要安全機(jī)制保護(hù)的,所以只有內(nèi)核才可以直接訪問物理內(nèi)存。進(jìn)程如果要訪問內(nèi)存需要通過獨(dú)立的虛擬地址空間。
虛擬地址空間其實(shí)包含兩部分。一部分是內(nèi)核空間,另一部分就是用戶空間。
進(jìn)程有用戶態(tài)和內(nèi)核態(tài),用戶態(tài)下只能訪問用戶空間,只有切換到內(nèi)核態(tài)時(shí)才可以訪問內(nèi)核空間。
只有實(shí)際使用的虛擬內(nèi)存才會(huì)分配物理內(nèi)存,通過內(nèi)存映射來管理。
內(nèi)存映射其實(shí)就是將物理地址內(nèi)存映射到虛擬內(nèi)存。為每個(gè)進(jìn)程維護(hù)了一張頁表
頁表其實(shí)是存儲(chǔ)在CPU的內(nèi)存管理單元MMU中。當(dāng)發(fā)生缺頁中斷的時(shí)候,進(jìn)入內(nèi)核分配內(nèi)存,更新進(jìn)程頁表,然后返回用戶空間。
TLB是MMU中的高速緩存,通過減少上下文切換,可以減少TLB的刷新次數(shù),就可以提高TLB的使用率。進(jìn)而提高CPU的內(nèi)存訪問性能。
MMU是按照4KB為一頁進(jìn)行存儲(chǔ)的,如果是4GB內(nèi)存,那么就需要100多W頁表項(xiàng)進(jìn)行存儲(chǔ),才可以實(shí)現(xiàn)整個(gè)地址空間的映射。為了解決頁表項(xiàng)過多的問題,Linux提供了兩種機(jī)制,多級(jí)頁表&大頁
多級(jí)頁表其實(shí)就是按照多個(gè)層級(jí),最后按照對(duì)應(yīng)的偏移地址。如下就是通過4級(jí)頁表來管理。并且只存儲(chǔ)使用的內(nèi)存。
虛擬內(nèi)存空間分布
空間內(nèi)存分配其實(shí)就是按照 棧、文件映射、堆、數(shù)據(jù)段、只讀段。堆和文件映射是動(dòng)態(tài)分配的。
內(nèi)存分配與回收
內(nèi)存的分配是通過brk()和mmap()兩個(gè)函數(shù)進(jìn)行處理的。
brk() : 分配小于128K的內(nèi)存,使用完并不立即歸還給系統(tǒng),而是緩存起來重復(fù)利用
mmap() : 直接使用內(nèi)存映射來分配,也就是在文件映射段找一塊空閑內(nèi)存分配出去。
而當(dāng)內(nèi)存不足時(shí),
- 回收緩存:使用LRU算法等進(jìn)行回收。
- 回收不常用的內(nèi)存,通過交換分區(qū)直接寫到磁盤中
- 殺死進(jìn)程:內(nèi)存緊張時(shí)通過OOM,殺死占用大量內(nèi)存的進(jìn)程。
交換分區(qū) Swap
其實(shí)就是把一塊磁盤當(dāng)作內(nèi)存來使用,把不需要的進(jìn)程數(shù)據(jù)先存儲(chǔ)到磁盤中稱為幻出,把數(shù)據(jù)從磁盤拉入內(nèi)存稱為換入。
但是swap可以增加系統(tǒng)內(nèi)存,但是磁盤讀寫慢,所以會(huì)導(dǎo)致嚴(yán)重的內(nèi)存性能問題。
OOM
內(nèi)核的一種保護(hù)機(jī)制,監(jiān)控進(jìn)程內(nèi)存的使用情況,大概就是為每個(gè)進(jìn)程進(jìn)行評(píng)分oom_socre。占用分?jǐn)?shù)比較高的,就容易被殺死。
/proc
范圍在[-17, 15 ]可以進(jìn)行設(shè)置 -17是禁止。數(shù)值越少,越不容易被OOM殺死。
可以通過配置
echo -16 > /proc/$(pidof sshd)/oom_adj
如何查看內(nèi)存使用情況
total是總內(nèi)存、used是硬使用內(nèi)存,包含共享內(nèi)存、free是未使用內(nèi)存、shared是共享內(nèi)存的大小。
buff/cache 是緩存和緩沖區(qū)的大小。 available是新進(jìn)程可用內(nèi)存大小。
VIRT:進(jìn)程虛擬內(nèi)存大小
RES常駐內(nèi)存大小
SHR 共享內(nèi)存大小
%MEM是進(jìn)程占用內(nèi)存百分比。文章來源:http://www.zghlxwxcb.cn/news/detail-700386.html
小結(jié)
本篇主要簡(jiǎn)要介紹虛擬內(nèi)存、內(nèi)存如何分配、如何回收的、以及如何進(jìn)行查看內(nèi)存占用TOP、FREE兩個(gè)命令。文章來源地址http://www.zghlxwxcb.cn/news/detail-700386.html
到了這里,關(guān)于【操作系統(tǒng)】聊聊Linux內(nèi)存工作機(jī)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!