目錄
1、物理內(nèi)存的主要問題?
2、Linux段頁式存儲中的頁表
3、進程訪問內(nèi)存基本流程
4、進程訪問虛擬地址時如何確認是否有頁?
5、缺頁異常是什么?如何處理?
6、page分頁的策略與page status
7、swaping和paging的區(qū)別與聯(lián)系
8、overcommit 和OOM killer
1、物理內(nèi)存:
1)多個進程時,每個進程都給4G物理內(nèi)存,分配完了只能等待;
2)進程直接訪問物理內(nèi)存,可修改其他進程的數(shù)據(jù)/內(nèi)核地址數(shù)據(jù);
3)內(nèi)存隨機分配,容易出現(xiàn)錯誤。
2、頁表共三個部分組成:
此處討論兩級頁表:
線性地址
CR3 -- 頁目錄表(包含目錄項) -- 頁表 ( 包含頁表項)
物理地址
(頁表項)--頁面
3、內(nèi)存訪問:
進程 -- 內(nèi)存 -- 虛擬地址 -- 物理內(nèi)存 -- 物理地址
4、根據(jù)線性地址中的偏移量決定
偏移量占低12位,第0位是存在位,P=1表示頁表項指向的該頁在內(nèi)存中,如果P=0,表示該頁不在內(nèi)存中。
5、缺頁異常:
頁表中對應(yīng)的數(shù)據(jù)不在物理內(nèi)存中。
處理:
把進程需要的數(shù)據(jù)從磁盤上緩存到物理內(nèi)存中。內(nèi)核調(diào)用頁面異常處理程序:
通過“頁面置換算法”,找一個目標(biāo)覆蓋頁,將該頁內(nèi)容寫到磁盤中,將進程所需數(shù)據(jù)緩存到物理頁上,有效位變?yōu)?。
6、page status共四種:
1)已分配內(nèi)存,未mapping(minor page fault)
free中的shared buffer作為虛擬地址中的一部分,當(dāng)虛擬地址沒有完全mapping到物理內(nèi)存,虛擬地址不夠用的時候,會引發(fā)soft(minor) page fault,需要等一小會兒完全mapping 了才行。
2)未分配物理內(nèi)存(major page fault)。
3)已分配物理內(nèi)存并已經(jīng)mapping。
這是正常類型的page
4)已經(jīng)分配物理內(nèi)存已經(jīng)mapping,但被swap out了。
這種情況下是物理內(nèi)存不夠用了,整個程序都被swap出去了。
進程的working set是指當(dāng)前在物理內(nèi)存中,屬于該進程的pages組成的集合。
shrink working set指的是進程運行過程中縮小working set
page分為free page和dirty page,swap指的是將dirty page寫到交換分區(qū)去。
OOM是指系統(tǒng)已經(jīng)沒有足夠的內(nèi)存給進程使用,即能free的都已經(jīng)free了,能swap out的也已經(jīng)swap out了,再也不能擠出物理內(nèi)存的情況。
page的四種交換策略:
需要時才交換;
系統(tǒng)空閑時交換;
換出但不立即釋放;
把頁面換出推遲到不能再推遲為止。
7、swapping針對程序,paging針對頁面
swapping指的整個進程,在物理內(nèi)存和磁盤間swap in/swap out
tips:swap的數(shù)據(jù)kernel還是知道,因為metadata還在內(nèi)核內(nèi)存中。
進程中的線程結(jié)構(gòu),堆,棧必須被swap。
paging指的物理內(nèi)存不夠用時程序中的頁面移入/移出磁盤
8、overcommit和OOM killer
linux虛擬內(nèi)存的分配一般是“請求多少分配多少”,然而分配后不會完全映射到物理內(nèi)存上,比如請求4M內(nèi)存,內(nèi)存僅有1M也答應(yīng);因為通常不一定會用到4M;
但也會有真的不夠用的情況,類似銀行的“擠兌危機”。這時候就需要有相應(yīng)機制來處理,這就是OOM。當(dāng)物理內(nèi)存不夠用,磁盤該swap out的也swap out了,這時候就會出現(xiàn)OOM(out-of-memory),于是內(nèi)核調(diào)用OOM killer將一些進程kill以釋放內(nèi)存。
overcommit setting文件:
/proc/sys/vm/overcommit_memory
OOM配置文件:
/proc/1/oom_score_adj