页帧分配器和物理内存分配器
页帧分配器在malloc
前完成,物理内存由slab
分配器实现。一次物理内存分配的过程如下:
graph LR
K(kmalloc)
S(slab)
B(buddy_system_allocator)
V(vmalloc)
B-- 物理页帧 -->S--物理内存块-->K
S--物理内存块-->K
B-- 物理页帧--> V
页帧分配器
类型: buddy_system_allocator |
bitmap |
bitmap
使用位图结构保存页面信息
优点:
- 实现简单
- 分配复杂度O(n), 回收O(1)
缺点:
- 无法记录额外信息,比如页面引用数量 (维护全局的数据结构,记录页面使用信息)
- 分配速度不理想
伙伴系统
可以用来分配内存,也可以分配物理页帧,这里按照linux的方式,将伙伴系统用来分配物理页帧。其将所有的可用物理内存组织为连续的物理页帧,并按照2的幂次记录连续物理页帧的使用情况。每次请求只能按照2的幂次进行分配,如果当前幂次的连续页帧不存在,则向下一个幂次进行请求,直到无法请求成功。
Slab分配器
由于伙伴系统只分配页帧,因此需要一个分配器分配不同大小的物理内存需求。