記憶體管理之buddy system

2021-07-26 04:20:23 字數 1335 閱讀 7330

buddy system介紹

buddy system是一種記憶體管理方法,它使得分配正確大小的記憶體塊以及相鄰記憶體合併都可以更快速地進行。(用普通的演算法對free的記憶體按大小排序並分配是很快的,但是記憶體合併非常的複雜。)buddy system主要使用的是基於2的冪運算,而這也正是計算機所擅長的。

buddy system具體實現

在buddy system中,分配器只分配特定大小的記憶體塊,並且有許多的free list,每乙個對應乙個特定大小。這些特定的大小通常都是2的冪數,或者是乙個斐波那契序列,使得任意乙個記憶體塊(不包括最小size的)都可以被分為兩個更小的特點大小記憶體塊。

當分配器從記憶體收到乙個請求,它會迴圈處理請求的size,直到找到最符合需求的某個特定的size,並返回這個size的free list中第乙個記憶體塊。如果這個size的free list是空的,分配器會把更大的記憶體塊**為幾個該size的記憶體塊,並將其中乙個返回,把剩下的加入到該size的free list中。

當記憶體塊被**時,也可能會把相鄰的記憶體塊合併為乙個更大size的記憶體塊。為了更易實現,free list會按照位址順序對記憶體塊進行儲存。buddy system的最大優勢就是合併非常方便。

分配記憶體例項

乙個二進位制buddy system分配器可能包括16, 32, 64kb等大小的記憶體塊。一開始可能只有一塊64kb的記憶體塊,當應用請求需要乙個8kb的記憶體塊時,分配器會先檢查8kb的free list,然後發現沒有這個大小的free記憶體塊。然後它便會吧這個64kb的記憶體塊分宜兩個32kb的,再把乙個32kb的分為兩個16kb的,再把其中乙個分為兩個8kb記憶體塊,然後分配器把其中乙個8kb記憶體塊返回給應用,並將剩餘的8kb, 16kb, 32kb的儲存到相應的free list中。如果應該再請求乙個10kb的記憶體塊,分配器就會迴圈這個請求直至16kb,並從16kb的free list中返回乙個給應用,這樣也導致會有6kb記憶體的浪費。

如果是斐波那契buddy system就可能會使用16, 32, 48, 80, 120, 208…bytes大小的記憶體塊,使得每個size都是前兩個size之和。當**記憶體塊時,得到的兩個記憶體塊size就是前兩個size各一塊。

buddy system優缺

乙個buddy system可能性能非常好,也可能很差,這主要取決於所支援的size與記憶體請求的符合度以及返回記憶體塊的模式。迴圈操作通常都會造成大量的記憶體浪費,也被稱作內部碎片。但一直也可以將所支援的size差距設小來進行 改善。

記憶體管理之概念

程式裝入和鏈結 程式在經過編譯成目標模組 obj 檔案,鏈結程式鏈結之後,需要將對應的模組裝入記憶體,有三種方式 1 絕對裝入 絕對裝入程式按照裝入模組中的位址,將程式和資料裝入記憶體。由於程式中的邏輯位址與實際位址完全相同,不需要對程式和資料的位址進行修改。只適用於單道程式環境 也就是說,基本上接...

記憶體管理之alloc pages exact

kernel 5.8.11 定義在 mm page alloc.c alloc pages exact 分配物理上連續的精確頁數。size 要分配的位元組數 gfp mask 分配的 gfp 標誌不能包含 gfp comp 此函式與alloc pages 相似,不同之處在於,它分配最少數量的頁面以滿...

C 記憶體管理之四 動態記憶體管理

三 new delete拓展 四 記憶體耗盡怎麼辦 new delete與malloc free都是用於管理動態記憶體。其中malloc free是c標準庫函式,用於c程式的動態記憶體管理 new delete是c 的運算操作符,用於動態記憶體管理,功能完全覆蓋malloc free。new new...