news 2026/4/15 10:31:13

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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放宽水位要求,适应紧急分配场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 20:52:36

ubuntu通过windows主机访问网络

背景&#xff1a;校园网限制用户连接数量 方法&#xff1a;用usb网卡。用一台windows主机连接校园网登录&#xff0c;插usb网卡连网线到ubuntu机器&#xff1b;ubuntu机器不需要什么额外配置&#xff0c;windows更改网络适配器设置&#xff0c;把 校园网连接->属性->共享…

作者头像 李华
网站建设 2026/4/13 22:15:49

Doris与Flink整合实战:构建流批一体的大数据处理平台

Doris与Flink整合实战&#xff1a;构建流批一体的大数据处理平台 关键词&#xff1a;Doris、Flink、流批一体、大数据处理平台、实时计算 摘要&#xff1a;本文聚焦于Doris与Flink的整合&#xff0c;旨在构建流批一体的大数据处理平台。详细介绍了Doris和Flink的核心概念及两者…

作者头像 李华
网站建设 2026/4/12 9:16:41

【C标准库】一文吃透 C 语言 assert 断言

文章目录一、assert 是什么&#xff1f;二、基本语法和使用步骤2.1 核心语法2.2 最简单的示例三、assert 的工作机制3.1 如何定义 NDEBUG&#xff08;关闭断言&#xff09;&#xff1f;四、assert 的适用场景五、assert 的使用禁忌禁忌1&#xff1a;断言中包含有副作用的表达式…

作者头像 李华
网站建设 2026/4/3 4:43:55

社会网络仿真软件:NetLogo_(17).NetLogo教学与研究资源

NetLogo教学与研究资源 在社会网络仿真的研究和教学中&#xff0c;NetLogo 提供了丰富的资源和工具&#xff0c;帮助用户更好地理解和应用这一强大的仿真平台。本节将详细介绍 NetLogo 的教学与研究资源&#xff0c;包括官方文档、示例模型、在线教程、社区支持以及第三方资源等…

作者头像 李华
网站建设 2026/4/10 8:21:35

社会网络仿真软件:NodeXL_(3).NodeXL安装与基本设置

NodeXL安装与基本设置 在开始使用NodeXL进行社会网络分析之前&#xff0c;首先需要安装NodeXL并进行一些基本设置。本节将详细介绍如何安装NodeXL&#xff0c;并配置其基本环境&#xff0c;以便您能够顺利地进行后续的社会网络仿真和分析工作。 安装NodeXL NodeXL是一个基于…

作者头像 李华