伙伴的概念, 满足以下三个条件的称为伙伴: ( 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为15.1 系统中不存在order 1的内存块,于是将order 2的内存块分裂成两块order 1的内存块5.2 找到order 1的内存块,进行分配 www.2cto.com6 程序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的内存块m9.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的内存块