在Linux當中,物理內存的劃分之前已經寫過一篇了,今天來講講內存的具體分配
首先,內存被分成一個一個的節點,每個節點由不同的區域組成,當在區域內部需要使用物理內存的時候,就是今天要講的伙伴系統登場的時候了。
首先,各個內存區域的空閑可用物理內存被分割成一個一個的鏈表,每個鏈表當中的元素表示的空閑頁的大小都是相同的,且都是2的整數次冪,這一個個的鏈表,就按照整數次冪(之后叫order)的大小排列在一個數組當中。
當系統需要分配一個大小為k的空間的時候,會先將k按照2^order對其,之后就會先從本地節點上,按照order從小到達的次序去遍歷各個鏈表,直到找到剛好匹配。如果沒有剛好匹配,則需要在更大的鏈表上拿下一個更大塊的內存,取出自己需要的之后,還要將剩下的部分塞回到對應order的鏈表之上。如果當前節點的所有鏈表均沒有匹配,則需要在其他節點上“遠程調度”,這種情況對應的消耗會比較大。
以上就是簡單的講述了伙伴系統的功能,其分配的基本單位是頁,一般為4k
由于buddy-system的基本單位為4k,但是內核當中的數據結構沒有那么大,而且頻繁分配釋放也會造成大量不必要的消耗,這時候就需要slab分配器出場了(它在嵌入式的兄弟叫slob,大型機上的兄弟較slub),其實slab的功能不僅僅是一個分配器,也是一個緩存管理器,其運行在伙伴系統之上。我們熟知的task_struct等很多內核結構都是由它來管理的。
當我們要申請一個slab緩存的時候,需要制定要緩存的固定類型,比如task_struct,這樣,當slab拿到物理內存的時候,它就會把整塊的內存排好,只用于存放task_struct,其他的數據類型也一樣,另外,所有的slab緩存是通過鏈表連在一起的。
當確定了slab緩存的類型之后,它就會根據固定類型的數據長度,選取對齊位置,選擇和是的padding進行對其,這個padding可以用來設置一些下一個空閑量偏移之類的東西。
這樣,當內核需要用到某一種數據類型的時候,就會先根slab去要,slab如果沒有,slab就會去找buddy-system,拿到物理內存之后,就按照請求劃分,返回調用方想要的。
如果是釋放固定的類型,也不是直接返還給物理內存,slab依舊持有,方便下一次調用的是時候,直接從緩存拿,而較少調用buddy-system的次數
-
內核
+關注
關注
3文章
1384瀏覽量
40442 -
Linux
+關注
關注
87文章
11351瀏覽量
210513
發布評論請先 登錄
相關推薦
Linux服務器卡頓救星之一招釋放Cache內存
虛擬內存溢出該怎么處理 虛擬內存在服務器中的應用
Linux下如何管理虛擬內存 使用虛擬內存時的常見問題
什么是虛擬內存分頁 Windows系統虛擬內存優化方法
虛擬內存不足如何解決 虛擬內存和物理內存的區別
求助,關于LM386芯片內ESD保護電路設計和引腳分配情況求解
FreeRTOS如何在中斷中調用內存分配函數?
物理內存模型的演變
Linux內核內存管理之內核非連續物理內存分配
![<b class='flag-5'>Linux</b>內核<b class='flag-5'>內存</b>管理之內核非連續<b class='flag-5'>物理</b><b class='flag-5'>內存</b><b class='flag-5'>分配</b>](https://file1.elecfans.com/web2/M00/C1/9D/wKgaomXX-KCADAsrAAAaZXMwKKg445.png)
Linux內核內存管理之slab分配器
![<b class='flag-5'>Linux</b>內核<b class='flag-5'>內存</b>管理之slab<b class='flag-5'>分配</b>器](https://file1.elecfans.com/web2/M00/C1/74/wKgaomXWoxyANWqjAAAWqSNs_YU725.png)
評論