常用的記憶體管理演算法的簡要介紹

2021-08-30 07:01:45 字數 1987 閱讀 3488

主要是介紹一下常用的記憶體管理演算法以及相關的資料結構.

三種型別:

[size=medium]1 sequential fit[/size]

包括first fit,next fit,以及best fit

這種演算法的實現基本來說都是基於乙個雙向鍊錶或者迴圈鍊錶來儲存所有的free memory.而且一般都會使用kunth的boundary tag演算法來合併臨近的記憶體(這個演算法可以去網上搜尋下,這裡就不介紹了).

其中free block的順序一般為fifo,lifo或者address order(ao).

而從free list中分配block則有三種方法. 第一種 就是 first fit,也就是從頭開始搜尋,找到第乙個可以滿足請求大小的block. 第二種是next fit,它是從最後一次搜尋停止的地方開始搜尋,找到下乙個滿足請求大小的block.

第三種是best fit,它是每次都是遍歷list,然後找到滿足請求大小的最小的那個block.

fist fit : 當找到的block比請求的大的話,就分割這個block將剩餘的插入到free list中.我們可以看到,這樣的話會使得前面的block越來越小,從而導致每次搜尋都會越來越遠.

next fit: 可以看做是優化版的 first fit.

best fit: 它是從生成的記憶體碎片來看,最好的一種策略,因為它會產生最小的碎片.可是由於它會每次遍歷所有block,所以它的效率比較低.為了解決它的碎片問題,那就是每次提交給請求者的記憶體都會大於等於它的請求值.不過這樣會導致記憶體浪費. 而segreganted fit演算法可以看做是best fit的一種很好的補充(下面會介紹這個演算法).

[size=medium]2 segreganted free list[/size]

這種資料結構其實也就是將相同大小的block放在乙個鍊錶,然後將將這些鍊錶再組合成乙個鍊錶或者陣列(可以看到memcached也就是用的這種演算法).當請求到來時,從最合適的size大小的鍊錶中取得乙個block.而一般block的大小都是2的次冪.比如2,4,8等等.

segreganted fit演算法

也就是當請求到來時,會將每次提交的值按一定的規則對齊,然後從free list搜尋的話就按對齊後的這個值來搜尋,一般都是先從陣列或者鍊錶中去的當前的size class然後再在這個size class中搜尋可用的block(memcached也就是使用的這種記憶體管理演算法).

[size=medium]3 buddy system[/size]

包括binary buddy和double buddy.

buddy system可以說是segreganted free list的乙個變體.它只不過提供了乙個受限制的但是高效的分割和組合記憶體塊的演算法.在乙個簡單的buddy結構中,整個記憶體堆被分為兩個塊,這兩個塊就稱作一對buddy.而當記憶體請求到來時,它會像segreganted free list中處理的那樣,先將請求大小對齊,然後再遞交給buddy system.將會不斷地平均切割記憶體,直到得到乙個最小的滿足請求的大小的塊.而當記憶體塊被釋放時,它會嘗試合併記憶體塊,而合併記憶體塊的話,乙個記憶體塊只能和它的buddy合併.

可以看下面的圖:

[img]

binary buddy

這個是最簡單的也是最流行的,所有的buddy大小都是2的次冪,然後每次分割都是將乙個塊分為相等的兩個塊.這個缺點就是容易造成記憶體碎片.

fibonacci buddy

和binary buddy 類似,只不過buddy大小是按fibonacci排列(16, 32, 48, 80, 128, 208...)

double buddy

這個它會使用兩個buddy system,比如乙個是按binary buddy(2,4,8,16...)而另乙個則使用2的倍數並且起始數是乙個不同的值(3,6,12....).當請求到來,會選擇乙個最合適的塊.這個會很大的降低記憶體碎片.

通過這個解決方法我們也可以在segreganted fit中使用,也就是我們可以提供兩種機制,也就是每次提供一對記憶體塊給請求,然後選擇最合適的(可以試下改進memcached).

記憶體管理演算法

buddy演算法的優缺點 1 儘管夥伴記憶體演算法在記憶體碎片問題上已經做的相當出色,但是該演算法中,乙個很小的塊往往會阻礙乙個大塊的合併,乙個系統中,對記憶體塊的分配,大小是隨機的,一片記憶體中僅乙個小的記憶體塊沒有釋放,旁邊兩個大的就不能合併。2 演算法中有一定的浪費現象,夥伴演算法是按2的冪次...

記憶體管理演算法 Buddy夥伴演算法

buddy演算法的優缺點 1 儘管夥伴記憶體演算法在記憶體碎片問題上已經做的相當出色,但是該演算法中,乙個很小的塊往往會阻礙乙個大塊的合併,乙個系統中,對記憶體塊的分配,大小是隨機的,一片記憶體中僅乙個小的記憶體塊沒有釋放,旁邊兩個大的就不能合併。2 演算法中有一定的浪費現象,夥伴演算法是按2的冪次...

記憶體管理演算法 Buddy夥伴演算法

buddy system記憶體管理,努力讓記憶體分配與相鄰記憶體合併能快速進行 對於普通演算法來講,合併記憶體相當困難 它利用的是計算機擅長處理2的冪運算。我們建立一系列空閒塊列表,每一種都是2的倍數。舉個例子,如果最小分配單元是8位元組,整個記憶體空間有1m。我們建立8位元組記憶體塊鍊錶,16位元...