当前位置: 首页 > news >正文

linux内核伙伴系统分配物理页面时水位判断zone_watermark_ok

linux内核物理页面分配函数alloc_pages(...)在进行页面分配时非常重要的一个步骤就是判断当前Zone中可用页面减去分配需求页面后的剩余可用页面和低水位值(ALLOC_WMARK_LOW)之间的关系,如果低于最水位值则开始直接回收,否则可以继续分配。

其中判断关键步骤由函数zone_watermark_ok(...)实现,下面开始分析该函数

bool zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,int classzone_idx, int alloc_flags) { return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags,zone_page_state(z, NR_FREE_PAGES)); }

zone_watermark_ok->__zone_watermark_ok

#define ALLOC_HARDER 0x10 /* try to alloc harder */ #define ALLOC_HIGH 0x20 /* __GFP_HIGH set */ #define ALLOC_CPUSET 0x40 /* check for correct cpuset */ #define ALLOC_CMA 0x80 /* allow allocations from CMA areas */ #define ALLOC_FAIR 0x100 /* fair zone allocation */ /* Return true if free pages are above 'mark'. This takes into account the order of the allocation. */ static bool __zone_watermark_ok(struct zone *z, unsigned int order,unsigned long mark, int classzone_idx, int alloc_flags,long free_pages) { /* free_pages may go negative - that's OK */ /*mark值为水位值,分配物理页面后剩余的物理页面和水位值之间的关系*/ long min = mark; int o; long free_cma = 0; /*去除需要分配的物理页面*/ free_pages -= (1 << order) - 1; if (alloc_flags & ALLOC_HIGH) min -= min / 2; if (alloc_flags & ALLOC_HARDER) min -= min / 4; #ifdef CONFIG_CMA /* If allocation can't use CMA areas don't use free CMA pages */ if (!(alloc_flags & ALLOC_CMA)) free_cma = zone_page_state(z, NR_FREE_CMA_PAGES); #endif if (free_pages - free_cma <= min + z->lowmem_reserve[classzone_idx]) return false; for (o = 0; o < order; o++) { /* At the next order, this order's pages become unavailable */ free_pages -= z->free_area[o].nr_free << o; /*nr_free<<o转换为order中空闲页面数*/ /* Require fewer higher order pages to be free */ min >>= 1; if (free_pages <= min) return false; } /*free_pages > min即可*/ return true; }

注意下面部分代码:

if (alloc_flags & ALLOC_HIGH) min -= min / 2; if (alloc_flags & ALLOC_HARDER) min -= min / 4;

Q:为什么存在min -= min / 2; min -= min / 4; 的操作?

A:当分配请求携带ALLOC_HIGH或ALLOC_HARDER标志时,内核会放宽水位检查(如min减半),允 许分配后剩余页略低于lowmem_reserve[]
if (alloc_flags & ALLOC_HIGH)
min -= min / 2;
/*高优先级分配:水位要求减半,这样对水位的要就就降低,允许在不满足条件下也能优先分配*/
if (alloc_flags & ALLOC_HARDER)
min -= min / 4;
/*更紧急分配:水位要求减1/4,这样对水位的要就就降低,允许在不满足条件下也能优先分配*/

这里体现了通过 ALLOC_HIGH/ALLOC_HARDER放宽水位要求,适应紧急分配场景。

继续下面这部分代码:

if (free_pages - free_cma <= min + z->lowmem_reserve[classzone_idx]) return false;

要求:zone空闲页面小于水位值和zone紧急内存(lowmem_reserve)之和。

zone->lowmem_reserve[]的保留内存是逻辑上的最小空闲页保障,而非物理上已分配的内存块。

其使用体现在:

正常分配:从Zone的空闲页中分配,通过水位检查确保分配后剩余页≥ min + lowmem_reserve[idx](即不突破预留底线)。

极端情况:高优先级分配或OOM killer可能临时突破预留底线,动用原本应保留的空闲页,但这是应急机制,非常规分配。

继续分析下面代码:

for (o = 0; o < order; o++) { /* At the next order, this order's pages become unavailable */ free_pages -= z->free_area[o].nr_free << o; /*nr_free<<o转换为order中空闲页面数*/ /* Require fewer higher order pages to be free */ min >>= 1; if (free_pages <= min) return false; }

Q:为什么min>>=1,即min=min/2?

A:高阶分配对连续内存要求更高,但允许更低的水位(通过 min >>= 1)

这部分代码很好的体现了:

保守估计:扣除所有可能用于分配的页(包括低阶页),确保分配后水位安全

逐级放宽要求:高阶分配对连续内存要求更高,但允许更低的水位(通过 min >>= 1)

紧急通道:通过 ALLOC_HIGH/ALLOC_HARDER放宽水位要求,适应紧急分配场景。

http://www.jsqmd.com/news/319084/

相关文章:

  • ubuntu通过windows主机访问网络
  • 基于微信小程序的社区养老服务平台【源码+文档+调试】
  • 基于微信小程序的校车购票平台【源码+文档+调试】
  • 2026新版Python3.14.2安装全攻略
  • 社会网络仿真软件:NetLogo_(17).NetLogo教学与研究资源
  • ④YT代码去除冗余
  • Python连接KingbaseES全指南
  • 【C标准库】一文吃透 C 语言 assert 断言
  • 从 JSON Schema 到企业级动态数据模型:动态表单的终极演进路线
  • 社会网络仿真软件:NetLogo_(13).社会网络仿真在公共卫生领域的应用
  • 社会网络仿真软件:NetLogo_(16).NetLogo模型分享与发布
  • Doris与Flink整合实战:构建流批一体的大数据处理平台
  • 社会网络仿真软件:NetLogo_(16).NetLogo与其他软件的集成
  • 选九影网络做游戏定制开发,硬核技术壁垒,全流程技术护航
  • 搬了 - guiding
  • 社会网络仿真软件:NetLogo_(12).NetLogo模型调试与测试
  • 书单推荐之豆包高效学习:AI时代的教育破局指南
  • 社会网络仿真软件:NetLogo_(12).社会网络仿真在社会科学中的应用
  • 告别 `print` 调试:构建生产级 Python 应用的日志系统
  • 计算机Java毕设实战-基于springboo的社团成员活动策划组织管理系统(【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 为什么不同天猫超市购物卡回收平台价格不一样?
  • 计算机Java毕设实战-基于小程序的上班企业考勤签到签退下班打卡系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Google Maps 多 Marker 场景下 InfoWindow
  • 手动搭MySQL MGR集群太费时间?一键自动化工具安排上
  • 数据库运维核心:MySQL主从复制与读写分离的部署与维护
  • 当我们系统出现msvcr100.dll文件丢失问题 免费下载方法分享
  • 搬了
  • 当系统出现找不到msvcr120.dll文件问题 免费下载方法分享
  • 社会网络仿真软件:NetLogo_(17).社会网络仿真的伦理与隐私问题
  • 社会网络仿真软件:NodeXL_(3).NodeXL安装与基本设置