# Buddy memory system
1. 分块：把空闲页面分成N个组，每组中块的大小是2的幂次方个面。2^0=1, 2^1=2, 2^2=4...  
2. 伙伴块：两个连续的块，且大小相等，并且合并后可以迭代合并为最大的块。   
寻找到伙伴块的方法： 当块大小为n时，寻找到的伙伴块必须满足，合并后的大块的左边（低内存）区域的大小应该是合并大块的k倍，即2kn的大小（k为非负整数）。
3. 块分配：当需要分配一个内存大小为n时，需要分配一个内存块，块的大小为m，且m满足: m/2 < n and m>=n. 通过这个限制条件，我们可以获得要分配的块的大小，并且到对应的块组寻找有没有空闲块，如果有的话就把这个块分配出来，如果没有的话就把继续寻找到上一级块组，如果上一级有的话，就将这个空闲块拆分为两个并且分配一个块出来，另一个块归入下一级块组中。如果上一级也没有空闲块的话，就继续向上一级寻找，递归寻找到合适的块。  
4. 类似于块分配的逆向操作，回收一个块时会首先检测其伙伴块是否空闲，如果空闲的话，回收块会与伙伴块合并为更大的块，并且在上一级块组中寻找伙伴块合并，递归进行此操作，直到无法再次合并为止。  
