操作系統筆記(3)

夥伴系統

固定分區和動態分區方案都是存在缺陷。

固定分區方案限制了活動進程的數量,並且若可用分區的大小與進程大小很不匹配,則內存空間的利用率就會非常低。
動態分區的維護非常複雜,並且會引入進行壓縮的額外開銷。

由此,就像是對於查看和修改複雜度這種一般,這種情況下也出現了一種很具有吸引力的這種方案:夥伴系統

夥伴系統中可用內存塊的大小爲\(2^K\)個字,L≤K≤U,其中\(2^L\)表示分配的最小塊的尺寸,\(2^U\)表示分配的最大塊的尺寸,\(2^U\)表示可供分配的整個內存的大小

而分配的流程如下:

最初,整個可供分配的空間被視爲一個大小爲\(2^U\)的塊。若請求的大小s滿足\(2^{U-1}\)<s≤\(2^U\),那麼整個空間將都會被分配。
否則的話,這個塊分裂爲兩個大小相等夥伴,大小均爲\(2^{U-1}\)。如果存在\(2^{U-2}\)<s≤\(2^{U-1}\),則給請求分配兩個夥伴中的一個;
否則,其中的一個夥伴又被分成兩半。
持續這一過程,直到產生≥s的最小塊,並分配給該請求。
在任何時候,夥伴系統中爲所有大小爲\(2^i\)的“空洞”維護一個列表。空洞可通過對半分裂從i+1列表中移除,並在i列表中產生兩個大小爲\(2^i\)的夥伴
當i列表中一對夥伴都變成未分裂的塊時,將它們從i列表中移除,合併爲i+1的列表中的一個塊。

請求大小爲k的塊,並且k滿足\(2^{i-1}\)<k≤\(2^i\),下面是一個尋找大小爲\(2^i\)空間的算法例子


void get_hole(int i)
{
  if(i==(U+1)) <failure>;
  if(<i_list empty>)
  {
    get_hole(i+1);
    <split hole into buddies>;
    <put buddies on i_list>;
  }
  <take first hole on i_list>;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章