伙伴地址,伙伴系统

伙伴的概念, 满足以下三个条件的称为伙伴:  
( 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的内存块
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章