Linux 內核原理之內存系統

buddy system

進程向內核申請內存需要地址連續的內存塊,linux如何處理來儘可能保持內存塊的連續的呢?答案buddy system。來看下buddy system內存地址分配策略。

首先假設系統一開始有共16個字節的內存,然後被分出去8 byte。狀態圖如下:

在這裏插入圖片描述
可以看到左邊數組中存放的都是等大的塊,內存不連續的等大塊以鏈表的方式存放在相應的索引處。

如果這個時候,有個2字節的請求,剩餘的6個字節就會被分別放在212^1222^2處。

當內存回收時,內核會在等大塊中,發現可以合併的內存塊,並放到更上層。比如上面的8個字節內存被釋放時,兩個8字節的內存塊會被發現是連續的,合併放到242^4位置。

buddy system存在內存碎片問題?

當內存被頻繁的申請和釋放,buddy system就會有內存碎片問題。進程要申請一塊內存,剩餘內存總量是夠的,但是內存地址不連續。

下面簡單舉個內存碎片的例子:

初始狀態:

{ [0-15] }

分配2 byte:
{ [0-7] } , { [8-11] } , { [12-13] }

申請5 byte
{ [8-11] } , {[12,13],[6-7]}(內存碎片), { [5-5] }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章