夥伴地址,夥伴系統

夥伴的概念, 滿足以下三個條件的稱爲夥伴:  
( 1 ) 兩個塊大小相同
( 2 ) 兩個塊地址連續
( 3 ) 兩個塊必須是從同一個大塊中分離出來的。  

若塊大小爲4,則06F4h是06F0h的夥伴地址。
若塊大小爲16,則06E0h是06F0h的夥伴地址。
什麼是夥伴系統?
      夥伴系統的宗旨就是用最小的內存塊來滿足內核的對於內存的請求。在最初,只有一個塊,也就是整個內存,假如爲1M大小,而允許的最小塊爲64K,那麼當我們申請一塊200K大小的內存時,就要先將1M的塊分裂成兩等分,各爲512K,這兩分之間的關係就稱爲夥伴,然後再將第一個512K的內存塊分裂成兩等分,各位256K,將第一個256K的內存塊分配給內存,這樣就是一個分配的過程。下面我們結合示意圖來了解夥伴系統分配和回收內存塊的過程。
 
1 初始化時,系統擁有1M的連續內存,允許的最小的內存塊爲64K,圖中白色的部分爲空閒的內存塊,着色的代表分配出去了得內存塊。
2 程序A申請一塊大小爲34K的內存,對應的order爲0,即2^0=1個最小內存塊
   2.1 系統中不存在order 0(64K)的內存塊,因此order 4(1M)的內存塊分裂成兩個order 3的內存塊(512K)
   2.2 仍然沒有order 0的內存塊,因此order 3的內存塊分裂成兩個order 2的內存塊(256K)
   2.3 仍然沒有order 0的內存塊,因此order 2的內存塊分裂成兩個order 1的內存塊(128K)
   2.4 仍然沒有order 0的內存塊,因此order 1的內存塊分裂成兩個order 0的內存塊(64K)
   2.5 找到了order 0的內存塊,將其中的一個分配給程序A,現在夥伴系統的內存爲一個order 0的內存塊,一個order 1的內存塊,一個order 2的內存塊以及一個order 3的內存塊
3 程序B申請一塊大小爲66K的內存,對應的order爲1,即2^1=2個最小內存塊,由於系統中正好存在一個order 1的內存塊,所以直接用來分配
4 程序C申請一塊大小爲35K的內存,對應的order爲0,同樣由於系統中正好存在一個order 0的內存塊,直接用來分配
5 程序D申請一塊大小爲67K的內存,對應的order爲1
   5.1 系統中不存在order 1的內存塊,於是將order 2的內存塊分裂成兩塊order 1的內存塊
   5.2 找到order 1的內存塊,進行分配  www.2cto.com  
6 程序B釋放了它申請的內存,即一個order 1的內存塊
7 程序D釋放了它申請的內存
   7.1 一個order 1的內存塊回收到內存當中
   7.2由於該內存塊的夥伴也是空閒的,因此兩個order 1的內存塊合併成一個order 2的內存塊
8 程序A釋放了它申請的內存,即一個order 0的內存塊
9 程序C釋放了它申請的內存
   9.1 一個order 0的內存塊被釋放
   9.2 兩個order 0夥伴塊都是空閒的,進行合併,生成一個order 1的內存塊m
   9.3 兩個order 1夥伴塊都是空閒的,進行合併,生成一個order 2的內存塊
   9.4 兩個order 2夥伴塊都是空閒的,進行合併,生成一個order 3的內存塊
   9.5 兩個order 3夥伴塊都是空閒的,進行合併,生成一個order 4的內存塊
http://www.2cto.com/os/201206/134234.html
 
1 初始化時,系統擁有1M的連續內存,允許的最小的內存塊爲64K,圖中白色的部分爲空閒的內存塊,着色的代表分配出去了得內存塊。
 
2 程序A申請一塊大小爲34K的內存,對應的order爲0,即2^0=1個最小內存塊
 
   2.1 系統中不存在order 0(64K)的內存塊,因此order 4(1M)的內存塊分裂成兩個order 3的內存塊(512K)
 
   2.2 仍然沒有order 0的內存塊,因此order 3的內存塊分裂成兩個order 2的內存塊(256K)
 
   2.3 仍然沒有order 0的內存塊,因此order 2的內存塊分裂成兩個order 1的內存塊(128K)
 
   2.4 仍然沒有order 0的內存塊,因此order 1的內存塊分裂成兩個order 0的內存塊(64K)
 
   2.5 找到了order 0的內存塊,將其中的一個分配給程序A,現在夥伴系統的內存爲一個order 0的內存塊,一個order 1的內存塊,一個order 2的內存塊以及一個order 3的內存塊
 
3 程序B申請一塊大小爲66K的內存,對應的order爲1,即2^1=2個最小內存塊,由於系統中正好存在一個order 1的內存塊,所以直接用來分配
 
4 程序C申請一塊大小爲35K的內存,對應的order爲0,同樣由於系統中正好存在一個order 0的內存塊,直接用來分配
 
5 程序D申請一塊大小爲67K的內存,對應的order爲1
 
   5.1 系統中不存在order 1的內存塊,於是將order 2的內存塊分裂成兩塊order 1的內存塊
 
   5.2 找到order 1的內存塊,進行分配  www.2cto.com  
 
6 程序B釋放了它申請的內存,即一個order 1的內存塊
 
7 程序D釋放了它申請的內存
 
   7.1 一個order 1的內存塊回收到內存當中
 
   7.2由於該內存塊的夥伴也是空閒的,因此兩個order 1的內存塊合併成一個order 2的內存塊
 
8 程序A釋放了它申請的內存,即一個order 0的內存塊
 
9 程序C釋放了它申請的內存
 
   9.1 一個order 0的內存塊被釋放
 
   9.2 兩個order 0夥伴塊都是空閒的,進行合併,生成一個order 1的內存塊m
 
   9.3 兩個order 1夥伴塊都是空閒的,進行合併,生成一個order 2的內存塊
 
   9.4 兩個order 2夥伴塊都是空閒的,進行合併,生成一個order 3的內存塊
 
   9.5 兩個order 3夥伴塊都是空閒的,進行合併,生成一個order 4的內存塊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章