操作系统学习笔记(九):连续内存分配——伙伴系统
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); //检查,测试 }
相关文章推荐
- 操作系统学习笔记(十):非连续内存分配——背景
- 操作系统学习笔记(23)--系统内存获取
- [linux内存]伙伴系统学习笔记(二)--内存系统初始化
- 操作系统笔记:(一)物理内存分配1:连续内存分配
- 操作系统学习-17. 内存的连续分配方式
- [linux内存]伙伴系统学习笔记(三)--分配器API
- 操作系统的学习(3)——物理内存管理:非连续内存分配
- 操作系统 笔记(三)计算机体系结构,地址空间、连续内存分配(四)非连续内存分配:分段,分页
- 操作系统笔记:(二)物理内存分配2:非连续内存分配
- [linux内存]伙伴系统学习笔记(一)——概念
- [linux内存]伙伴系统学习笔记(二)--内存系统初始化
- [linux内存]伙伴系统学习笔记(一)——概念
- [linux内存]伙伴系统学习笔记(三)--分配器API
- 伙伴系统的内存分配浅析
- linux操作系统学习笔记(三)系统启动及服务管理
- C语言学习笔记:内存分配
- 【0基础Python学习笔记08】-基础知识-LINUX系统进程/内存监控
- JVM 学习笔记(三) 垃圾收集器与内存分配策略
- 查看系统可分配连续内存大小