1. 程式人生 > >深入淺出記憶體管理-- 夥伴系統(buddy system)

深入淺出記憶體管理-- 夥伴系統(buddy system)

buddy system

夥伴系統是核心中用來管理實體記憶體的一種演算法,我們知道記憶體中有一些是被核心程式碼佔用,還有一些是被特殊用途所保留,那麼剩餘的空閒記憶體都會交給核心記憶體管理系統來進行統一管理和分配,
核心中會把記憶體按照頁來組織分配,隨著程序的對記憶體的申請和釋放,系統的記憶體會不斷的區域碎片化,到最後會發現,明明系統還有很多空閒記憶體,卻無法分配出一塊連續的記憶體,這對於系統來說並不是好事。而夥伴系統演算法就是為了緩解這種碎片化。
夥伴系統(buddy system)把系統中要管理的實體記憶體按照頁面個數分為不同的組,確切來說是分成了11個組,分別對應11種大小不同的連續記憶體塊,每組中的記憶體塊大小都相等,為2的冪次個物理頁。
那麼系統中就存在20~2

10這麼11種大小不同的記憶體塊,對應記憶體塊大小為4KB ~ 4KB * 2^10。也就是4KB ~ 4M。核心用11個連結串列來管理11種大小不同的記憶體塊。

記憶體分配

當分配記憶體時,會優先從需要分配的記憶體塊連結串列上查詢空閒記憶體塊,當發現對應大小的記憶體塊都已經被使用後,那麼會從更大一級的記憶體塊上分配一塊記憶體,並且分成一半給我們使用,剩餘的一半釋放到對應大小的記憶體塊連結串列上。
比如我們想要分配一個8KB大小的記憶體,但是發現對應大小的記憶體已經沒有了,那麼夥伴系統會從16KB的連結串列中查詢一個空閒記憶體塊,分成兩個8KB大小,把其中的一個8KB大小返回給申請者使用,剩下的8KB放到8KB對應的記憶體塊連結串列中進行管理。更壞的一種情況是,系統發現16KB大小的連續記憶體頁已經沒有了,那麼以此會向更高的32KB連結串列中查詢,如果找到了空閒記憶體塊,那麼就把32KB分成一個16KB和兩個8KB,16KB的記憶體塊放到16KB的連結串列進行管理,兩個8KB的記憶體塊一個返回給申請者,另一個放到8KB大小的連結串列進行管理。

記憶體釋放

當釋放記憶體時,會掃描對應大小的記憶體塊連結串列,檢視是否存在地址能夠連續在一起的記憶體塊,如果發現有,那麼就合併兩個記憶體塊放置到更大一級的記憶體塊連結串列上,以此類推。比如我們釋放8KB大小的記憶體,那麼會從對應的連結串列掃描是否有能夠合併的記憶體塊,如果有另一個8KB大小的記憶體和我們使用的記憶體地址連續,那麼就合併它們組成一個16KB大小的記憶體塊,然後接著掃描16KB大小的記憶體塊連結串列,繼續查詢合併的可能,以此類推下去。