页
内核用page结构体表示系统的每个物理页(页框),描述当前时刻在相关物理页存放的东西
- flag:表示状态,包括是不是脏的、是否锁定在内存中
- _count:页的引用计数
区
Linux根据页的特性进行分组,划分为区
- ZONE_DMA:<16MB的内存页框。执行DMA操作,因为DMA只能使用特定的内存地址
- ZONE_NORMAL:≥16MB并<896MB的内存页框。能正常映射的页
- ZONE_HIGHEM:≥896MB的内存页框。高端内存,不能永久映射到内核地址空间,因为物理内存比虚拟内存大
伙伴系统算法
一种内存分配策略
- 伙伴:两个块有相同大小,物理地址是连续的
- 解决外碎片问题
- 实现:
- 把所有空闲页框分组为11个块链表,每个链表包含20到210个连续页框
- 请求时:
- 合适的,取走
- 小于需要的,寻找下一个更大的页块
- 大于需要的,把多出来的拼接到合适的链表;如果拼接时发现是连续的页框(是伙伴),则合并拼接到更大的链表,迭代这个过程
- 释放时:
- 放回合适的链表
- 如果放回时是连续的页框(是伙伴),迭代更新链表
slab机制
一种内存分配策略
- 解决内碎片问题,小内存区的请求问题
slab实现
- slab层把不同对象划分位高速缓存组,每个组存放不同类型的对象,比如task_struct_inod
- slab由一个或多个物理上连续的页组成,每个组由一个或多个slab组成
- 三种状态:slab满,就创建新slab;slab部分满,分配时先使用;slab空
- slab避免频繁分配和释放页
- 分配页:已发出一个分配新对象的请求;高速缓存不包含任何空闲对象,slab满
- 释放页:slab高速缓存中有太多空闲对象;定时器确定有完全未被使用的slab