我的世界做图的网站,如何使用手机看建设网站,工程建设概况,广州做网站公司培训目录
概述
一、快速路径分配
1、get_page_from_freelist
2、rmqueue()函数
二、慢速路径分配
1、分配流程
三、direct_compact 概述
物理内存分配步骤
1、初始化,参数初始化
2、内存充足#xff0c;快速分配 get_page_from_freelist
3、内存压力大#xff0c;慢速…目录
概述
一、快速路径分配
1、get_page_from_freelist
2、rmqueue()函数
二、慢速路径分配
1、分配流程
三、direct_compact 概述
物理内存分配步骤
1、初始化,参数初始化
2、内存充足快速分配 get_page_from_freelist
3、内存压力大慢速分配 __alloc_pages_slowpath
4、内存紧张内存规整direct_compact 一、快速路径分配
快速主要在WMARK_LOW水线上快速扫描各个内存区域是否有足够的内存空间如果有则从伙伴系统中申请如果没有则返回
1、get_page_from_freelist
遍历zonelist中的zone扫描zone的方向从高端到低端大部分从首选的zone扫描而不是遍历所有首选的计算通过gfp_mask换算参考gfp_zone()宏和first_zones_zonelist()宏alloc_context 函数,确定了从哪个zone开始扫描和分配内存的迁移类型等信息在分配之前判断zone的水位情况以及是否满足分配连续大小内存块的需求。函数zone_watermark_ok检查水位即使函数判断成功最终也可能分配失败原因1内存外碎片化严重2、可能无法借用其他迁移类型的内存__requeue_fallback函数有处理过程
如果满足水线要求则调用rmqueue进入伙伴系统分配
2、rmqueue()函数
从伙伴系统中取出内存若需要的内存块不能满足从大内存块中取。如order5内存不足则向6中取6中取出来从空闲链表中取出把其中一块分配出去把剩余的添加到order空闲链表中。处理器分配单个物理页面order0调用rmqueue_pcplist函数从Per-CPU变量per_cpu_pages中分配。这个数据结构有单页面列表分配效率高减少对zone相关锁的操作。每个zone里有一个这样的Per-CPU变量
分配成功后prep_new_page初始化分配的page 二、慢速路径分配
非常复杂包含异常处理GFP_ ALLOC_掩码处理内存回收 内存规整 OOM 等
__alloc_pages_slowpath
分配流程如下 慢速路径初始化参数 retry_cpuset: 调整内存分配策略alloc_flags采用更加激进方式 内存分配主要在允许的CPU相关联的NUMA节点上 内存水位线下调至WMARK_LOW 唤醒所有kswapd进程进行异步内存回收 触发直接内存整理direct_compact获取更多内存 retry: 进一步调整内存分配aloc_flags使用更加激进的内存分配手段 在内存分配时忽略水位线 直接触发内存回收direct_reclaim 再次触发直接内存整理direct_compact
OOM机制 nopage: 以上仍然不能分配如果设置__GFP_NOFAIL不允许失败则不停重试以上分配过程 fail: 分配失败输出经过信息。 got_pg 内存分配成功返回新申请的内存块
return page;
三、direct_compact
在页面回收时把可移动的聚在一起不可以移动的聚在一起去碎片化然后进行成块回收。 学习参考
https://course.0voice.com/v1/course/intro?courseId2agentId0