页分配流程:供学习参考
转自http://www.cnblogs.com/tolimit/
- 遍历zonelist,从zonelist中获取一个zone
- 检查zone如果分配后,空闲页框是否会低于allow_low
- 对此zone回收一些文件映射页和slab使用的页
- 再次检查zone如果分配后,空闲页框是否会低于allow_low
- 尝试从此zone分配页框(1个页优先从每CPU高速缓存分配,连续页框优先从需要的类型(migratetype)分配,如果不行再从其他migratetype分配)
- free_order小于11的情况, free_order++, 再次尝试第5步.如果free_order大于等于11, 则走第7步
- 跳到第1步,遍历zonelist结束则到下一步
- 再重新遍历zonelist一次,如果重新遍历过则到下一步
- 进入慢速分配
- 唤醒所有kswapd内核线程
- 再次尝试一次1~7步骤进行分配
- 如果有ALLOC_NO_WATERMARKS,则尝试分配预留的内存
- 进行异步内存压缩,然后尝试分配内存
- 尝试调用__alloc_pages__direct_reclaim()进行内存回收,然后尝试分配内存
- 使用oom杀掉oom_score较大的进程,每个进程都有一个oom_score(在/proc/PID/oom_score)
- 尝试轻同步内存压缩,然后尝试分配内存
- 压缩后再次尝试1~7步骤进行分配