page_alloc prep_move_freepages_block
prep_move_freepages_block()是伙伴系统中迁移类型转换前的准备工作函数负责计算待移动的 pageblock 范围并统计该范围内的空闲页和可移动页数量为后续的“偷页”决策提供依据。核心作用它本身不执行实际的页块移动而是完成两项关键准备确定可操作的 pageblock 范围根据传入的page计算其所属 pageblock 的起止 PFN并处理跨越 zone 边界的截断问题。统计关键计数计算该范围内有多少空闲页num_free以及其中有多少是可移动页num_movable供steal_suitable_fallback()判断“偷整个 pageblock”是否值得。参数解析参数含义zone目标内存区域page光标页cursor page用于定位所属 pageblockstart_pfn输出调整后的起始页帧号end_pfn输出调整后的结束页帧号包含num_free输出该范围内的空闲页总数num_movable输出其中可移动页的数量核心逻辑1. 计算 pageblock 范围pfn page_to_pfn(page); start pageblock_start_pfn(pfn); end pageblock_end_pfn(pfn) - 1;以page所属的 pageblock 为基准计算出对齐的起止 PFN。2. 处理 zone 边界这是该函数最重要的职责。如果 pageblock 跨越了 zone 边界必须截断到 zone 范围内/* Do not cross zone boundaries */ if (!zone_spans_pfn(zone, start)) start zone-zone_start_pfn; if (!zone_spans_pfn(zone, end)) return false;这里有一个重要的历史修复早期代码在start超出 zone 时只回退到pfn而不是zone-zone_start_pfn。这导致 DMA zone 的第一个 pageblockstart_pfn 1被“偷”时pivot 页之前的大量页被遗留在了旧链表上加剧了碎片化。修复后改为截断到 zone 起始位置保证整个 zone 内的范围都被正确处理。3. 统计空闲页和可移动页遍历调整后的[start, end]范围for (pfn start; pfn end; ) { if (!pfn_valid_within(pfn)) { pfn; continue; } page pfn_to_page(pfn); if (!PageBuddy(page)) { pfn; continue; } order buddy_order(page); (*num_free) 1 order; if (is_migrate_movable(get_pcppage_migratetype(page))) (*num_movable) 1 order; pfn 1 order; }只统计空闲的 Buddy 页PageBuddy。num_free累加空闲页数。num_movable累加可移动的空闲页数MIGRATE_MOVABLE或MIGRATE_CMA。4. 返回结果return true; // 或 falsezone 边界不满足时返回false表示该 pageblock 无法在给定 zone 内完整操作调用方应放弃“偷整个 block”的尝试。调用场景它被steal_suitable_fallback()调用用于判断“偷整个 pageblock”是否值得steal_suitable_fallback() └── prep_move_freepages_block(zone, page, start_pfn, end_pfn, free_pages, movable_pages) ├── 统计该 block 的空闲页/可移动页 └── 根据结果决定是否值得 claim 整个 block如果num_free和num_movable的统计结果显示该 block 大部分是空闲/可移动的内核就会偷取整个 pageblock通过__move_freepages_block()移动所有空闲页并更新 pageblock 的迁移类型标记从而减少碎片。总结prep_move_freepages_block()是“偷页”策略的侦察兵它计算 pageblock 的有效范围处理 zone 边界截断统计该范围内的空闲页和可移动页数量供上层决策是否值得将整个 block 转换为新的迁移类型。它的正确性直接影响反碎片效果——错误的边界截断会导致页块被遗留加剧长期碎片化。

相关新闻

Python实战第25期:LangChain入门

Python实战第25期:LangChain入门

文章目录 引言:什么是LangChain? 一、LangChain安装 1. 使用pip安装 2. 验证安装 3. 配置API Key 二、LLM Chain 1. 什么是Chain 2. 最简单的Chain 3. Chain的组成 4. 多步骤Chain 三、Prompt Template 1. 什么是Prompt Template 2. 基本使用 3. 多变量模板 4. 系统消息模板 …

2026/10/10 6:15:50 阅读更多 →
火车票抢购秘籍:技术实战全解析

火车票抢购秘籍:技术实战全解析

火车票查询与抢票全攻略大家好, 我是研一六师兄, 今天想跟大家分享一下有关查询火车票以及抢夺火车票的具体方法。一、项目目的通过应用具体的技术方案, 来具体地实现针对火车或者高铁车票的查询相关功能操作。通过使用相关技术手段来提供抢注火车票以及高铁车票的功能。对这两…

2026/10/10 6:15:50 阅读更多 →
智诺方AI|论文摘要与关键词,降重降AIGC避坑技巧

智诺方AI|论文摘要与关键词,降重降AIGC避坑技巧

为什么「摘要与关键词」容易同时踩查重与 AIGC 在论文修改避坑场景里,论文「摘要与关键词」常常被低估。摘要字数少却信息密度极高,既是查重标红重灾区,也是 AIGC 检测最容易打高分的板块。很多同学直接用 AI 一键生成摘要,或从正…

2026/10/10 6:14:50 阅读更多 →

最新新闻

AI正在悄悄“架空”高阶人士:决策降维与判断力退化深度剖析

AI正在悄悄“架空”高阶人士:决策降维与判断力退化深度剖析

1. 从三个瞬间说起:AI带来的不只是便利,还有隐性的侵蚀上个月在咖啡馆,隔壁桌坐着一个做跨境电商的老板,手机里开着某AI对话应用,眉头紧锁地在问:“帮我分析一下这个季度的广告数据,为什么转化率…

2026/10/11 8:53:41 阅读更多 →
Protobuf 3.7.1 Debug版本源码编译实战指南

Protobuf 3.7.1 Debug版本源码编译实战指南

手上没有一个开源项目能避开序列化这个话题。实战里不管是写RPC框架、做消息中间件,还是给分布式系统定义数据协议,Protobuf几乎成了默认选项。但绝大多数人用Protobuf的方式就是直接拉某个官方编译好的二进制,或者用包管理器装一下完事——这…

2026/10/11 8:53:41 阅读更多 →
BTP ABAP环境单元测试实战:从依赖注入到CI/CD质量门禁

BTP ABAP环境单元测试实战:从依赖注入到CI/CD质量门禁

最近好几个从 ECC、S/4HANA 传统开发环境转过来的朋友,都在问我同一个问题:在 SAP BTP ABAP 环境里到底怎么做单元测试?刚开始在 ADT 里打开一个空白的测试类时,我自己也懵了一会儿——没有 SE38、没有 SE80,连怎么单独…

2026/10/11 8:53:41 阅读更多 →
YOLOv8电梯电瓶车检测实战:轻量化部署与场景适配

YOLOv8电梯电瓶车检测实战:轻量化部署与场景适配

1. 为什么电梯里要专门“盯”电瓶车?——从安全逻辑到技术落点的底层思考你有没有在老式居民楼里见过这样的场景:傍晚六点,三四个住户陆续推着电瓶车进电梯,车轮卡在轿厢门槛上吱呀作响,电池包紧贴轿壁,充电…

2026/10/11 8:53:41 阅读更多 →
零售SaaS结算的最后一块拼图

零售SaaS结算的最后一块拼图

——业务系统管得了“干了什么活”,管不了“钱怎么发、票怎么开”  薪连薪是企业公转私全链路合规结算互联网平台,通俗说,是帮企业合规给个人付钱的平台。一、几乎所有零售SaaS,都卡在同一个地方  零售连锁这门生意&#xff0…

2026/10/11 8:53:41 阅读更多 →
从环境到上线:Vue项目实战与踩坑全指南

从环境到上线:Vue项目实战与踩坑全指南

干 Vue 这些年,见得最多的就是新手把环境配到一半就卡住,然后跑来问“为什么我 npm run dev 直接报错”“为什么 devtools 不显示”。其实 Vue 本身不难,难的是把生态里的一堆配套工具摸清楚,再踩过几个经典的坑。这篇文章我就按实…

2026/10/11 8:52:41 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →