✅ 空闲页面的管理
空闲内存管理的基本单位是页面。Linux内核管理的每个内存空闲块都是2的幂次方个页面,大小为order。
存放:一个空闲页面的放在一起,2个空闲页面的放在一起,4个空闲页面的放在一起......(物理地址连续)一直到MAX_ORDER-1。(定义MAX_ORDER=11)最大连续空闲物理内存大小是4MB。
区域(zone)数据结free_area[MAX_ORDER]构中数组保存每个空闲内存块链表。
Struct free_area{
Struct list_head free_list[];//空闲页面的双链表
Int *map;
}
list_head是一个双向链表结构,链表中元素的类型将为struct page结构。
Map域指向一个位图,其大小取决于现有的页面数。free_area第k项位图的每一位,描述的就是大小为2k个页面的两个伙伴块的状态。如果位图的某位为0,表示一对兄弟块中或者两个都空闲,或者两个都被分配,如果为1,肯定有一块已被分配。当兄弟块都空闲时,内核把它们当作一个大小为2k+1的单独快来处理。
Linux内核物理内存三个层次:节点,区域,页面。节点下的每个区域都管理着自己的空闲物理页面。
·伙伴算法(内存分配算法)
减少外部碎片,允许快速分配与回收物理页面。
情景:当需求一个4个连续页面的时候,检查是否又大小为2^3-1个页面的空闲块满足,如果链表上又,就分配给用户,否则向下一个级别(order)的链表中查找。
可以借助二叉树的数据结构来实现伙伴算法的仿真模拟(具体待议)
·页面分配过程
在4K页面大小的系统中,每次最多分配4MB的连续物理内存。如果内核需要的内存大于4MB,只能连续多次申请4MB内存拼成大块内存,并且必须保证物理地址连续。
·页面回收过程
标记页面块空闲;查看相邻物理页面是否空闲,如果空闲合并成更大的的物理页面块;有合并要更新freearea[]中链表元素;更新统计信息。