page_alloc get_page_from_freelist
get_page_from_freelist()是伙伴系统快速路径的核心分配函数负责遍历 zonelist找到第一个满足水位条件的 zone 并尝试分配。核心作用与定位它是__alloc_frozen_pages_noprof()旧版__alloc_pages_nodemask()在首次尝试分配时调用的函数。如果快速路径失败才会进入__alloc_pages_slowpath()慢速路径。核心逻辑static struct page * get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags, const struct alloc_context *ac) { struct zoneref *z ac-preferred_zoneref; struct zone *zone; struct pglist_data *last_pgdat_dirty_limit NULL; bool no_fallback; retry: no_fallback alloc_flags ALLOC_NOFRAGMENT; z ac-preferred_zoneref; for_next_zone_zonelist_nodemask(zone, z, ac-zonelist, ac-high_zoneidx, ac-nodemask) { struct page *page; unsigned long mark; /* cpuset 限制检查 */ if (cpusets_enabled() (alloc_flags ALLOC_CPUSET) !__cpuset_zone_allowed(zone, gfp_mask)) continue; /* 脏页限制检查文件页缓存写分配 */ if (ac-spread_dirty_pages) { ... } /* ALLOC_NOFRAGMENT NUMA 远程节点丢弃 NOFRAGMENT 重试 */ if (no_fallback nr_online_nodes 1 zone ! ac-preferred_zoneref-zone) { int local_nid zone_to_nid(ac-preferred_zoneref-zone); if (zone_to_nid(zone) ! local_nid) { alloc_flags ~ALLOC_NOFRAGMENT; goto retry; } } /* 水位检查 */ mark wmark_pages(zone, alloc_flags ALLOC_WMARK_MASK); if (!zone_watermark_fast(zone, order, mark, ac_classzone_idx(ac), alloc_flags)) { /* deferred pages 补充 */ if (static_branch_unlikely(deferred_pages)) { if (_deferred_grow_zone(zone, order)) goto try_this_zone; } /* ALLOC_NO_WATERMARKS跳过水位限制 */ if (alloc_flags ALLOC_NO_WATERMARKS) goto try_this_zone; /* node reclaim 判断 */ if (node_reclaim_mode 0 || !zone_allows_reclaim(ac-preferred_zoneref-zone, zone)) continue; ret node_reclaim(zone-zone_pgdat, gfp_mask, order); switch (ret) { case NODE_RECLAIM_NOSCAN: continue; case NODE_RECLAIM_FULL: continue; default: if (zone_watermark_ok(zone, order, mark, ac_classzone_idx(ac), alloc_flags)) goto try_this_zone; continue; } } try_this_zone: /* 实际分配 */ page rmqueue(ac-preferred_zoneref-zone, zone, order, gfp_mask, alloc_flags, ac-migratetype); if (page) { prep_new_page(page, order, gfp_mask, alloc_flags); /* 高阶原子分配保留 highatomic pageblock */ if (unlikely(order (alloc_flags ALLOC_HARDER))) reserve_highatomic_pageblock(page, zone, order); return page; } } return NULL; }逐步说明1. 遍历 zonelistfor_next_zone_zonelist_nodemask(zone, z, ac-zonelist, ac-high_zoneidx, ac-nodemask)从preferred_zoneref开始遍历所有符合条件的 zonezone 类型 ≤ 首选类型且节点在 nodemask 中。2. cpuset 检查if (cpusets_enabled() (alloc_flags ALLOC_CPUSET) !__cpuset_zone_allowed(zone, gfp_mask)) continue;如果启用了 cpuset 且调用方要求检查跳过不允许的 zone。3. 脏页限制检查if (ac-spread_dirty_pages) { if (last_pgdat_dirty_limit zone-zone_pgdat) continue; if (!node_dirty_ok(zone-zone_pgdat)) { last_pgdat_dirty_limit zone-zone_pgdat; continue; } }当调用方设置__GFP_WRITE文件页缓存写分配时检查节点的脏页数是否超限避免单节点脏页过多。4. ALLOC_NOFRAGMENT 与 NUMA 远程节点if (no_fallback nr_online_nodes 1 zone ! ac-preferred_zoneref-zone) { int local_nid zone_to_nid(ac-preferred_zoneref-zone); if (zone_to_nid(zone) ! local_nid) { alloc_flags ~ALLOC_NOFRAGMENT; goto retry; } }如果启用了ALLOC_NOFRAGMENT避免碎片但当前 zone 是远程节点则丢弃 NOFRAGMENT 标志并重新扫描。因为跨节点分配时防碎片的意义不大。5. 水位检查mark wmark_pages(zone, alloc_flags ALLOC_WMARK_MASK); if (!zone_watermark_fast(zone, order, mark, ac_classzone_idx(ac), alloc_flags))zone_watermark_fast()检查水位。6. 水位不足时的处理deferred pages 补充启动早期内存未完全初始化时尝试补充后重试。ALLOC_NO_WATERMARKS高优先级分配如 PF_MEMALLOC跳过水位检查直接分配。node reclaim如果开启了节点回收且回收距离合法尝试回收该节点的内存成功后重新检查水位。7. 实际分配try_this_zone: page rmqueue(ac-preferred_zoneref-zone, zone, order, gfp_mask, alloc_flags, ac-migratetype); if (page) { prep_new_page(page, order, gfp_mask, alloc_flags); if (unlikely(order (alloc_flags ALLOC_HARDER))) reserve_highatomic_pageblock(page, zone, order); return page; }水位满足后调用rmqueue()从 PCP 或伙伴系统取页再通过prep_new_page()校验和初始化。高阶原子分配还会保留 highatomic pageblock。在分配路径中的位置__alloc_frozen_pages_noprof() ├── get_page_from_freelist(...) // 快速路径 │ ├── 遍历 zonelist │ ├── zone_watermark_fast() // 水位检查 │ ├── node_reclaim() // 条件性回收 │ └── rmqueue() prep_new_page() // 取页并准备 └── if (!page) __alloc_pages_slowpath(...) // 慢速路径总结get_page_from_freelist()是伙伴系统快速路径的核心调度器它遍历 zonelist对每个 zone 执行 cpuset/脏页限制检查、ALLOC_NOFRAGMENT远程节点处理、zone_watermark_fast()水位判断水位不足时尝试 deferred pages 补充或 node reclaim满足条件后调用rmqueue()取页并通过prep_new_page()完成初始化。它是__alloc_frozen_pages_noprof()首次分配尝试的执行者失败后才进入慢速路径。

相关新闻

基因组学Agent工具:染色体级任务调度与流程编排实践

基因组学Agent工具:染色体级任务调度与流程编排实践

1. 从"染色体"到"Agent":这个组合到底在解决什么问题 第一次看到"基因组学、染色体对应的agent工具"这个标题,很多人会愣一下——基因组学和Agent(智能体)这两个词放在一起,跨度确实不小…

2026/10/13 16:40:20 阅读更多 →
2026 年西安自然人直接持股与有限合伙持股税负差距在哪

2026 年西安自然人直接持股与有限合伙持股税负差距在哪

2026年西安地区,自然人直接持股与有限合伙持股的税负差距,主要集中在股权转让所得与持有期间分红的税务处理环节。依据现行《中华人民共和国个人所得税法》及西安执行的税务口径,自然人直接持股转让股权时,个人所得税适用20%的财产…

2026/10/13 16:40:20 阅读更多 →
Xilinx Vitis | 开发环境搭建、流程设计及故障排除

Xilinx Vitis | 开发环境搭建、流程设计及故障排除

注:本文为“Xilinx Vitis”相关合辑。 略作重排,如有内容异常,请看原文。 本文档保留操作说明供历史项目参考。 Xilinx Vitis | 开发环境搭建、流程设计及故障排除 1. Vitis 概述 1.1 简介 Vitis 是 Xilinx 出品的一套统一软件开发平台&am…

2026/10/13 16:40:20 阅读更多 →

最新新闻

基于微信小程序的付费自习室预约小程序设计与实现

基于微信小程序的付费自习室预约小程序设计与实现

选题背景与意义 随着社会节奏的加快和学习压力的增加,越来越多的人开始重视自我提升与终身学习的理念。尤其是在职场竞争激烈、知识更新迅速的背景下,自主学习已成为个人成长的重要途径。然而,传统的学习环境往往存在干扰因素多、缺乏专注氛围…

2026/10/13 17:15:18 阅读更多 →
1949-1990年草地NPP时间序列重建:从降水利用效率到R1数据集的实践

1949-1990年草地NPP时间序列重建:从降水利用效率到R1数据集的实践

我们在做某个长时间尺度草地生态系统分析时,接到的第一个任务就让人头疼:需要一份南非图文巴地区1949—1990年的草地净初级生产力(NPP)时间序列。当时所有人都以为这只是从数据库里下载一行数据的事,结果查了一圈&…

2026/10/13 17:15:18 阅读更多 →
暴雪MPQ文件查看器源码解析:从格式拆解到批量提取实战

暴雪MPQ文件查看器源码解析:从格式拆解到批量提取实战

简介:暴风雪公司MPQ文件查看器是一款面向游戏开发与逆向分析人员的专用工具,用于打开和解析暴雪旗下魔兽争霸、星际争霸、暗黑破坏神等游戏采用的MPQ压缩格式文件。普通文件浏览器无法直接读取MPQ内部结构,该工具恰好填补这一空白&#xff0c…

2026/10/13 17:15:18 阅读更多 →
PPspliT 动画拆页实战:按放映时序拆分 PPT 动画为静态页

PPspliT 动画拆页实战:按放映时序拆分 PPT 动画为静态页

简介:PPspliT 是一款面向 PowerPoint 用户的加载项工具,专为解决幻灯片动画无法逐帧导出这一痛点而设计。它基于 VBA 与 NSIS 安装脚本实现,可将演示文稿中每张幻灯片的动画过程拆解为一系列独立幻灯片,使每个中间动画步骤都能以静…

2026/10/13 17:15:18 阅读更多 →
数据库课设经典题:图书管理系统表结构与事务实现

数据库课设经典题:图书管理系统表结构与事务实现

简介:《数据库课程设计——图书管理系统》是一份软件工程与数据库课程设计的任务书及完整设计指导文档,面向高校计算机类专业学生,用于完成图书管理系统的数据库建模与系统开发任务。文档围绕学生借阅、续借、归还、查询和管理员对图书、学生…

2026/10/13 17:15:18 阅读更多 →
Fama-French三因素模型实战:从因子构建到Python回归的A股应用

Fama-French三因素模型实战:从因子构建到Python回归的A股应用

1. 从"一只股票涨了"到"为什么涨":三因素模型的出场逻辑很多人做投资分析时,习惯盯着单只股票的涨跌找原因——公司发了财报、行业出了政策、大盘情绪好。但如果你同时持有几十只甚至上百只股票,这种"一只一只找原因…

2026/10/13 17:14:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →