news 2026/6/15 17:58:40

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/6/15 16:32:25

系统思考:以客户为中心

周一的学习实验室&#xff0c;有小伙伴提到“控场力”。我当下的判断是&#xff1a;控场本身并不是能力&#xff0c;而是系统良性运转后的外显结果。 顺着这个判断继续拆&#xff0c;我们发现一个关键变量反复出现——是否真正以学员为中心、以客户为中心。 这让我想到企业里那…

作者头像 李华
网站建设 2026/6/15 11:39:56

计算机Java毕设实战-基于小程序的上班企业考勤签到签退下班打卡系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/15 14:11:00

书单推荐之豆包高效学习:AI时代的教育破局指南

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 书单推荐之豆包高效学习&#xff1a;AI时代的教育破局指南 为什么这本书值得每个家庭拥有&#x…

作者头像 李华
网站建设 2026/6/15 16:00:48

《以大制胜》精读笔记:与《影响力》《乌合之众》的非理性说服闭环

《影响力》精读笔记 《乌合之众》精读笔记 斯科特亚当斯在《以大制胜》中&#xff0c;以自身对说服术的终身研究为基础&#xff0c;结合2016年美国大选等真实案例&#xff0c;拆解了“武器级”说服的底层逻辑与实操方法。这本书并非单纯的技巧合集&#xff0c;更像是对人类非理…

作者头像 李华
网站建设 2026/6/15 9:34:06

Java计算机毕设之基于springboot的办公用品库存采购下发管理系统小程序的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/15 14:31:32

System Operations Management 1

1. Maintenance 维护 Explanation: The process of keeping something in good condition. 使某物保持良好状态的过程。 Example Sentences: &#xfeff;&#xfeff;• &#xfeff;Regular maintenance of the codebase is essential to keep the application secure …

作者头像 李华