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 - thats 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 cant use CMA areas dont 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 orders pages become unavailable */ free_pages - z-free_area[o].nr_free o; /*nr_freeo转换为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 orders pages become unavailable */ free_pages - z-free_area[o].nr_free o; /*nr_freeo转换为order中空闲页面数*/ /* Require fewer higher order pages to be free */ min 1; if (free_pages min) return false; }Q:为什么min1,即minmin/2?A:高阶分配对连续内存要求更高,但允许更低的水位(通过 min 1)这部分代码很好的体现了保守估计:扣除所有可能用于分配的页(包括低阶页),确保分配后水位安全逐级放宽要求:高阶分配对连续内存要求更高,但允许更低的水位(通过 min 1)紧急通道:通过 ALLOC_HIGH/ALLOC_HARDER放宽水位要求,适应紧急分配场景。

相关新闻

Windows下快速安装Python GDAL指南

Windows下快速安装Python GDAL指南

在Windows系统下安装GDAL包(适用于Python 3.7版本)的完整指南: 步骤1:确认环境信息 打开命令提示符(cmd)执行: python -c "import platform; print(platform.architecture()[0], platfo…

2026/7/3 15:31:38 阅读更多 →
AI模型训练:数据获取与增强

AI模型训练:数据获取与增强

数据是训练一切模型的基础,因此如何获取数据就成了一个先行条件。 1.常见的机器学习数据集 (1)MNIST 属于计算机视觉领域,手写数字灰度图,包含有六万的训练集以及一万的测试集。 (2)ImageNet…

2026/7/3 15:31:40 阅读更多 →
系统思考:以客户为中心

系统思考:以客户为中心

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

2026/7/5 7:08:28 阅读更多 →

最新新闻

体验过市场口碑好的鱼缸工厂,实际效果究竟怎么样?

体验过市场口碑好的鱼缸工厂,实际效果究竟怎么样?

家人们,我一直都超爱养鱼,之前家里那个鱼缸用了没多久就出问题了,水质老是浑浊,还时不时漏水,搞得我特别闹心。所以我就想着换个新的,做了好多功课,最后选了小境同学家的鱼缸,毕竟它…

2026/7/5 8:44:29 阅读更多 →
2026图片去水印方法:手机电脑免费工具与在线网站、PS教程

2026图片去水印方法:手机电脑免费工具与在线网站、PS教程

在日常学习、素材整理、个人作品归档的场景中,图片水印往往会影响画面完整性,干扰视觉观感,不少用户都在寻找简单、高效、适配手机和电脑的图片去水印方式。2026年主流的图片去水印方案主要分为三大类:手机端免费工具、电脑端专业…

2026/7/5 8:44:29 阅读更多 →
AI建站工具避坑指南:高频问题与解决方案全解析

AI建站工具避坑指南:高频问题与解决方案全解析

技术越先进,顾虑就越多。搜“AI建站工具靠谱吗”的人,心里往往藏着十个八个问题。怕被坑、怕不好用、怕未来被套牢。这篇指南不回避任何尖锐问题,把用户最关心的十个核心顾虑摊开来谈,并给出客观的解答和避坑方案。Q1:…

2026/7/5 8:42:28 阅读更多 →
07| 深入理解本地套接字

07| 深入理解本地套接字

引言上一篇文章中,我们讲了 UDP。很多同学都知道 TCP 和 UDP,但是对本地套接字却不甚了解。实际上,本地套接字是 IPC,也就是本地进程间通信的一种实现方式。除了本地套接字以外,其它技术,诸如管道、共享消息…

2026/7/5 8:40:28 阅读更多 →
如何挑选最适合你的乡墅赋能培训课程?

如何挑选最适合你的乡墅赋能培训课程?

引言随着乡村别墅市场的蓬勃发展,越来越多的企业和个人开始关注这一领域。然而,进入这个市场并不容易,从战略定位到施工交付,每个环节都需要专业知识和经验。因此,选择一个合适的乡墅赋能培训课程变得尤为重要。本文将…

2026/7/5 8:40:28 阅读更多 →
全铝蜂窝墙板选材关键指标与行业对比分析

全铝蜂窝墙板选材关键指标与行业对比分析

行业现状:从“能用”到“好用”的选材升级当前国内建材市场,全铝蜂窝墙板正处于快速普及阶段。随着绿色建筑标准提升与消费端对环保、防火性能的关注度增加,这一源自航空蜂窝技术的金属复合板材逐渐从工业、公共建筑渗透至住宅、商业空间。然…

2026/7/5 8:38:23 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻