news 2026/10/19 7:19:36

page_alloc calculate_totalreserve_pages

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
page_alloc calculate_totalreserve_pages

calculate_totalreserve_pages()是内存管理初始化阶段用于计算系统总保留页数(totalreserve_pages)的函数。它遍历所有 zone,把每个 zone 的保留内存汇总到全局变量totalreserve_pages中,供内存热插拔、水位判断和内存可用性评估使用。

核心作用与背景

totalreserve_pages是一个全局变量,记录系统中不能被常规分配使用的保留页总数。它由三部分构成:

  1. lowmem_reserve[]:前面讲过的低端内存保留——低端 zone 为保护自己而保留的页数;

  2. WMARK_MIN水位线:每个 zone 的最低保留水位;

  3. nr_reserved_highatomic:为高阶原子分配保留的页数。

这个汇总值用于:

  • 内存热插拔:判断下线内存后是否仍有足够的保留内存;

  • si_meminfo()//proc/meminfo:计算MemAvailable等字段;

  • OOM 决策:评估系统实际可用的内存量。

典型实现

static void calculate_totalreserve_pages(void) { struct pglist_data *pgdat; unsigned long reserve_pages = 0; enum zone_type i, j; for_each_online_pgdat(pgdat) { pgdat->totalreserve_pages = 0; for (i = 0; i < MAX_NR_ZONES; i++) { struct zone *zone = pgdat->node_zones + i; long max = 0; if (!populated_zone(zone)) continue; /* 累加 lowmem_reserve */ for (j = i; j < MAX_NR_ZONES; j++) { if (populated_zone(pgdat->node_zones + j)) max += zone->lowmem_reserve[j]; } /* 加上 WMARK_MIN 水位 */ max += wmark_pages(zone, WMARK_MIN); /* 加上高阶原子保留 */ max += zone->nr_reserved_highatomic; pgdat->totalreserve_pages += max; reserve_pages += max; } } totalreserve_pages = reserve_pages; }

逐步解析

1. 遍历所有在线节点和 zone

for_each_online_pgdat(pgdat) { pgdat->totalreserve_pages = 0; for (i = 0; i < MAX_NR_ZONES; i++) {

外层遍历 NUMA 节点,内层遍历每个节点上的 zone 类型。

2. 累加lowmem_reserve

for (j = i; j < MAX_NR_ZONES; j++) { if (populated_zone(pgdat->node_zones + j)) max += zone->lowmem_reserve[j]; }
  • zone->lowmem_reserve[j]:当来自jzone 的分配回退到izone 时,izone 要保留的页数。

  • 从j = i开始遍历到最高 zone,把所有相关的高端 zone 对应的保留量累加。

  • 这确保totalreserve_pages反映最坏情况下低端 zone 需要保留的总量。

3. 加上WMARK_MIN

max += wmark_pages(zone, WMARK_MIN);

WMARK_MIN是 zone 的最低水位线——低于这个值,直接回收/OOM 就会触发。这部分内存不能被常规分配使用,必须计入保留。

4. 加上nr_reserved_highatomic

max += zone->nr_reserved_highatomic;

为高阶原子分配保留的 pageblock 页数。这些页普通分配不能用,也必须计入保留。

5. 汇总到全局变量

pgdat->totalreserve_pages += max; reserve_pages += max;
  • 同时更新节点级的pgdat->totalreserve_pages和全局的reserve_pages。

  • 循环结束后,把全局汇总值写入totalreserve_pages。

调用场景

它主要在以下时机被调用:

  • setup_per_zone_wmarks():水位初始化/调整后,重新计算总保留;

  • setup_per_zone_lowmem_reserve():lowmem reserve 更新后;

  • 内存热插拔:节点上线/下线后;

  • CPU 热插拔:影响水位计算时;

  • sysctl 修改:调整min_free_kbytes、lowmem_reserve_ratio、watermark_scale_factor等参数后;

  • calculate_min_free_kbytes():计算最小空闲内存时。

总结

calculate_totalreserve_pages()是系统保留内存的汇总器:它遍历所有在线节点和 populated zone,把每个 zone 的lowmem_reserve、WMARK_MIN水位和nr_reserved_highatomic累加,得到节点级和全局的totalreserve_pages。这个值反映了系统中不能被常规分配使用的保留内存总量,是内存热插拔判断、/proc/meminfo统计和 OOM 决策的重要基准。

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

Plotly Dash 集成 Flask-Login:会话管理与回调鉴权实战

简介&#xff1a;这是一份面向Python Web开发者的Dash与Flask-Login集成示例&#xff0c;解决在Plotly Dash应用中实现用户身份验证的问题。资源通过sqlite3数据库完成登录校验&#xff0c;并支持在config.txt中修改数据库URI以接入自有数据库&#xff0c;默认提供test/test1测…

作者头像 李华
网站建设 2026/10/19 7:16:49

Excel商业图表与仪表板全套课程:动态Dashboard+图表模板+表格可视化+经济学人图表+动态交互图表

资源概况 这套资源是一套完整的图表与数据可视化系列课程&#xff0c;以视频课时与配套范例文件的形式呈现。课程分为多个独立专题&#xff0c;系统覆盖从基础图表制作到高级交互式仪表板的完整学习路径 相关资料 查看文中资料 核心专题内容 动态仪表板制作是课程的重点模块之…

作者头像 李华
网站建设 2026/10/19 7:16:19

决策树弱分类器与集成学习:Bagging和Boosting实战调优

1. 从"弱"字说起&#xff1a;为什么单个决策树总是不够用很多人第一次接触决策树的时候&#xff0c;都会有一种"这玩意儿也太简单了"的错觉。几行判断逻辑&#xff0c;几个if-else分支&#xff0c;就能把一堆样本分得明明白白。我在早期做项目实训的时候也…

作者头像 李华
网站建设 2026/10/19 7:16:00

Ubuntu初始化脚本解析:从手动配环境到自动化重装

每次给电脑重装 Ubuntu&#xff0c;坐在终端前敲那二三十条命令的时候&#xff0c;我都觉得自己像个手动流水线上的工人&#xff1a;git 要装、curl 要装、软件源要换、显卡驱动要找半天、Python 环境配来配去……等这些都折腾完&#xff0c;两三个小时就没了&#xff0c;这一天…

作者头像 李华
网站建设 2026/10/19 7:14:15

【Linux】系统I/O

目录 两个细节 关于fopen的操作 总结 系统I\O open write close read 标志位的传递 文本写入和二进制写入的理解 文件描述符 初步理解 文件描述符在内核怎么样发挥作用 重定向 一个现象 dup2 文件重定向的补充 两个细节 关于fopen的操作 如果以w方式打开文件…

作者头像 李华
网站建设 2026/10/19 7:13:12

《AI Agent原理与实战》2026版 第18课 MCP 协议深度实战

本文收录于专栏 《AI Agent原理与实战》2026版 —— 专栏系统覆盖 AI Agent 的记忆、工具、插件与实战&#xff0c;点击订阅可跟踪后续更新。 本课定位&#xff1a;框架各自为政的时代正在被一个协议终结&#xff1a;MCP。本课从 NM 集成困境讲到 server/client/transport 架构…

作者头像 李华