您的位置:首页 > 其它

操作系统学习笔记(九):连续内存分配——伙伴系统

2019-05-15 23:02 141 查看

伙伴系统是连续存储分配的一种办法。它比较好地折中了分配和回收过程中分配块的位置碎片和合并的问题。伙伴系统地概念如下图:整个可分配分区大小为2的幂次方,当需要的内存空间大于当前块的一半的时候就将整个分区分配给进程,如果小于当前分区的一半,就将当前分区对半分开,将其中一半继续与需要的内存大小进行比较,递归进行下去,直到满足所需内存大小大于分区一半。可以看到这种分配方式内部碎片最大为分区大小的一半减一。知道了伙伴系统的思想,下面我们看下具体实现。

伙伴系统的实现:

数据结构:

  • 空闲块按大小和起始位置组织称二维数组;
  • 初始状态时,只有一个大小为 的空闲块;

分配过程:

  • 由小到大在空闲块数组中找最小的可用空闲块;
  • 如果空闲块过大,对可用空闲块进行二等分,一个放入空闲块列表,另一块继续比较,直到得到合适的可用空闲块。

分配示例:

释放过程:

  • 把释放的块放入空闲块数组
  • 合并满足合并条件的空闲块

合并条件:

  • 大小相同
  • 地址相邻
  • 起始地址小的块的地址必须是 的倍数。看起来有点抽象,其实就是地址较小的块的起始地址必须是要合并的块的大小的两倍的倍数。因此上图中三个256只有后面两个可以合并。

ucore实现:

其中我们最关心的是分配函数alloc_pages和回收函数free_pages

[code]struct pmm_manager{
const char *name;     //管理算法的名字
void (*init)(void);   //初始化
void (*init_memmap)(struct Page *base, size_t n);   //建立起管理数据结构
struct Page *(*alloc_pages)(size_t order);          //分配
void (*free_pages)(struct Page *base, size_t n);    //回收
size_t (*nr_free_pages)(void);                      //得到空闲分区内还有多大空间
void (*check)(void);  //检查,测试
}

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: