在Linux當(dāng)中,物理內(nèi)存的劃分之前已經(jīng)寫過一篇了,今天來講講內(nèi)存的具體分配
首先,內(nèi)存被分成一個(gè)一個(gè)的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)由不同的區(qū)域組成,當(dāng)在區(qū)域內(nèi)部需要使用物理內(nèi)存的時(shí)候,就是今天要講的伙伴系統(tǒng)登場的時(shí)候了。
首先,各個(gè)內(nèi)存區(qū)域的空閑可用物理內(nèi)存被分割成一個(gè)一個(gè)的鏈表,每個(gè)鏈表當(dāng)中的元素表示的空閑頁的大小都是相同的,且都是2的整數(shù)次冪,這一個(gè)個(gè)的鏈表,就按照整數(shù)次冪(之后叫order)的大小排列在一個(gè)數(shù)組當(dāng)中。
當(dāng)系統(tǒng)需要分配一個(gè)大小為k的空間的時(shí)候,會(huì)先將k按照2^order對其,之后就會(huì)先從本地節(jié)點(diǎn)上,按照order從小到達(dá)的次序去遍歷各個(gè)鏈表,直到找到剛好匹配。如果沒有剛好匹配,則需要在更大的鏈表上拿下一個(gè)更大塊的內(nèi)存,取出自己需要的之后,還要將剩下的部分塞回到對應(yīng)order的鏈表之上。如果當(dāng)前節(jié)點(diǎn)的所有鏈表均沒有匹配,則需要在其他節(jié)點(diǎn)上“遠(yuǎn)程調(diào)度”,這種情況對應(yīng)的消耗會(huì)比較大。
以上就是簡單的講述了伙伴系統(tǒng)的功能,其分配的基本單位是頁,一般為4k
由于buddy-system的基本單位為4k,但是內(nèi)核當(dāng)中的數(shù)據(jù)結(jié)構(gòu)沒有那么大,而且頻繁分配釋放也會(huì)造成大量不必要的消耗,這時(shí)候就需要slab分配器出場了(它在嵌入式的兄弟叫slob,大型機(jī)上的兄弟較slub),其實(shí)slab的功能不僅僅是一個(gè)分配器,也是一個(gè)緩存管理器,其運(yùn)行在伙伴系統(tǒng)之上。我們熟知的task_struct等很多內(nèi)核結(jié)構(gòu)都是由它來管理的。
當(dāng)我們要申請一個(gè)slab緩存的時(shí)候,需要制定要緩存的固定類型,比如task_struct,這樣,當(dāng)slab拿到物理內(nèi)存的時(shí)候,它就會(huì)把整塊的內(nèi)存排好,只用于存放task_struct,其他的數(shù)據(jù)類型也一樣,另外,所有的slab緩存是通過鏈表連在一起的。
當(dāng)確定了slab緩存的類型之后,它就會(huì)根據(jù)固定類型的數(shù)據(jù)長度,選取對齊位置,選擇和是的padding進(jìn)行對其,這個(gè)padding可以用來設(shè)置一些下一個(gè)空閑量偏移之類的東西。
這樣,當(dāng)內(nèi)核需要用到某一種數(shù)據(jù)類型的時(shí)候,就會(huì)先根slab去要,slab如果沒有,slab就會(huì)去找buddy-system,拿到物理內(nèi)存之后,就按照請求劃分,返回調(diào)用方想要的。
如果是釋放固定的類型,也不是直接返還給物理內(nèi)存,slab依舊持有,方便下一次調(diào)用的是時(shí)候,直接從緩存拿,而較少調(diào)用buddy-system的次數(shù)
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1416瀏覽量
41421 -
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213749
發(fā)布評論請先 登錄
Linux系統(tǒng)中通過預(yù)留物理內(nèi)存實(shí)現(xiàn)ARM與FPGA高效通信的方法

如何使用LAX_CODEGEN啟用動(dòng)態(tài)內(nèi)存分配?
如何查看S32DS中S32平臺(tái)的內(nèi)存分配?
golang內(nèi)存分配

Nand flash 和SD卡(SD NAND)存儲(chǔ)扇區(qū)分配表異同
Linux服務(wù)器卡頓救星之一招釋放Cache內(nèi)存
虛擬內(nèi)存溢出該怎么處理 虛擬內(nèi)存在服務(wù)器中的應(yīng)用
Linux下如何管理虛擬內(nèi)存 使用虛擬內(nèi)存時(shí)的常見問題
什么是虛擬內(nèi)存分頁 Windows系統(tǒng)虛擬內(nèi)存優(yōu)化方法
虛擬內(nèi)存不足如何解決 虛擬內(nèi)存和物理內(nèi)存的區(qū)別
求助,關(guān)于LM386芯片內(nèi)ESD保護(hù)電路設(shè)計(jì)和引腳分配情況求解
邏輯內(nèi)存和物理內(nèi)存的區(qū)別
轉(zhuǎn)載 golang內(nèi)存分配

內(nèi)存管理的硬件結(jié)構(gòu)

Linux內(nèi)核中的頁面分配機(jī)制

評論