Linux伙伴系统:内存管理核心算法解析
1. 伙伴系统基础概念解析伙伴系统Buddy System是Linux内核中用于管理物理内存页的核心算法之一最早由Donald Knuth提出并应用于操作系统领域。它的核心思想是将内存划分为不同大小的块每个块都是2的幂次方页通常一页为4KB通过递归合并和分割的方式高效管理内存分配与释放。在Linux内核中伙伴系统主要管理order 0到order 10的连续物理页框对应从1页4KB到1024页4MB的内存块。这种设计特别适合处理外部碎片问题——当系统长时间运行后内存中会出现大量不连续的小碎片导致无法分配大块连续内存。伙伴系统通过以下机制解决这个问题分级管理将内存按2^n大小分到11个MAX_ORDER通常为11不同阶order的链表中伙伴合并释放内存时会检查相邻的伙伴块是否空闲是则合并成更大的块分割机制当没有合适大小的块时会将更大的块对半分割直到得到所需大小关键理解所谓伙伴是指两个大小相同、物理地址连续且低位地址必须能被2^(order1)整除的内存块。例如两个4页的块如果第一个块的起始地址是0x1000那么它的伙伴必须是0x2000。2. Linux内核中的伙伴系统实现细节2.1 核心数据结构剖析Linux内核通过以下数据结构实现伙伴系统struct zone { ... struct free_area free_area[MAX_ORDER]; ... }; struct free_area { struct list_head free_list[MIGRATE_TYPES]; unsigned long nr_free; }; struct page { ... union { struct { /* 伙伴系统使用 */ unsigned long private; struct page *first_page; }; ... }; ... };每个内存区域zone维护一个free_area数组数组下标对应order值。free_area中的free_list是不同迁移类型MIGRATE_TYPES的空闲链表用于实现反碎片技术。nr_free记录该order下的空闲块总数。2.2 内存分配流程解析当内核需要分配连续物理页时主要经历以下步骤确定分配阶根据请求大小计算最小满足的order值order fls(size/PAGE_SIZE) - 1; // 找最高位1的位置查找空闲块从计算的order开始向上遍历free_area数组找到第一个非空的free_list链表如果找到的order大于请求order执行块分割块分割操作while (current_order order) { area-nr_free--; list_del(page-lru); current_order--; new_page page (1 current_order); set_page_order(new_page, current_order); list_add(new_page-lru, zone-free_area[current_order].free_list); }标记页面状态设置page结构的private字段为order值清除PG_buddy标志增加zone的vm_stat[NR_ALLOC_BATCH]计数2.3 内存释放流程解析释放内存时伙伴系统执行相反操作合并准备struct page *buddy; buddy __find_buddy_page(page, page_order, page_idx);递归合并检查伙伴块是否空闲PG_buddy标志且order相同如果可合并从链表中删除伙伴块合并后的块order加1重复上述过程直到无法合并或达到MAX_ORDER-1最终插入list_add(page-lru, zone-free_area[order].free_list); set_page_order(page, order); __mod_zone_page_state(zone, NR_FREE_PAGES, 1 order);3. 伙伴系统的高级特性与优化3.1 反碎片技术实现Linux 2.6.24引入迁移类型MIGRATE_TYPES来减少内存碎片enum migratetype { MIGRATE_UNMOVABLE, // 不可移动页内核核心数据 MIGRATE_RECLAIMABLE, // 可回收页文件缓存等 MIGRATE_MOVABLE, // 可移动页用户空间内存 MIGRATE_PCPTYPES, // per-cpu pageset使用 MIGRATE_HIGHATOMIC, // 紧急原子分配 MIGRATE_CMA, // 连续内存分配器 MIGRATE_ISOLATE, // 不能分配从此区域 MIGRATE_TYPES };每个free_area的free_list数组按迁移类型分开管理分配时优先从相同类型的链表中获取。当特定类型内存不足时内核会尝试fallback机制按照MOVABLE→RECLAIMABLE→UNMOVABLE顺序回退内存压缩通过移动页面整理出连续空间直接回收回收可回收页面的缓存3.2 每CPU页框缓存为提升单页order0分配性能内核实现了每CPU缓存struct per_cpu_pages { int count; // 列表中页数 int high; // 填充水位线 int batch; // 添加/移除块大小 struct list_head list; // 页链表 }; struct per_cpu_pageset { struct per_cpu_pages pcp; };当分配单页时优先从当前CPU的pcp-list获取如果空则从伙伴系统批量获取pcp-batch个页释放单页时先放入pcp-list当count pcp-high时返还部分给伙伴系统4. 伙伴系统性能调优与实践4.1 关键内核参数调整通过/proc/sys/vm调整伙伴系统行为水位线控制/proc/sys/vm/min_free_kbytes // 最小保留内存 /proc/sys/vm/lowmem_reserve_ratio // 各zone保留比例分配策略调整/proc/sys/vm/zone_reclaim_mode // 内存回收策略 /proc/sys/vm/extfrag_threshold // 碎片化告警阈值透明大页配置/sys/kernel/mm/transparent_hugepage/enabled /sys/kernel/mm/transparent_hugepage/defrag4.2 诊断工具与方法查看伙伴系统状态cat /proc/buddyinfo # 输出示例 # Node 0, zone Normal 11 10 8 7 5 3 2 1 1 1 1检查内存碎片cat /proc/pagetypeinfo使用vmstat观察vmstat -m | grep -E ^DMA|^Normal内核追踪点perf probe --add alloc_pages perf probe --add free_pages4.3 实际应用中的经验技巧大块内存分配优化对于需要大于4MB的连续内存考虑alloc_pages(GFP_HIGHUSER | __GFP_COMP | __GFP_NORETRY, order);或使用CMA连续内存分配器区域避免内存碎片技巧长时间运行的服务应预先分配关键内存不同生命周期的对象使用不同迁移类型定期检查/proc/buddyinfo的碎片情况调试内存泄漏echo 1 /proc/sys/vm/oom_dump_tasks dmesg | grep -i out of memory5. 伙伴系统的局限与替代方案5.1 现有架构的不足大块内存分配问题默认MAX_ORDER11限制最大连续分配4MB解决大块需求需修改内核参数或特殊配置内存碎片挑战长期运行后仍可能产生不可移动碎片特别是UNMOVABLE类型内存的积累NUMA架构扩展性跨节点内存分配效率较低需要明确的NUMA感知分配策略5.2 替代方案比较SLUB分配器更适合小对象分配减少内部碎片但无法解决外部碎片CMA连续内存分配器预留物理连续内存区域需要设备树或内核参数配置用户空间方案posix_memalign() // 对齐分配 mmap(MAP_HUGETLB) // 大页映射5.3 未来演进方向基于CXL的内存池化打破物理内存的本地性限制实现更灵活的内存共享机制机器学习预测分配根据历史模式预分配内存减少实时分配的开销异构内存管理统一管理DRAM、PMem等不同介质自动将热页迁移到更快介质

相关新闻

AI多平台协作框架:Claude、ChatGPT与Notion的协同实践

AI多平台协作框架:Claude、ChatGPT与Notion的协同实践

1. 项目背景与核心价值 这个项目本质上是一次跨越多个AI平台的协作实验,通过"君子协议"这种非正式但高度信任的合作方式,探索不同AI系统间的协同可能性。我在过去三个月里,深度使用了Claude、ChatGPT和Notion三个平台,发…

2026/8/18 1:29:59 阅读更多 →
TMS570 VIM与ESM模块解析:构建高可靠嵌入式系统的中断与错误管理基石

TMS570 VIM与ESM模块解析:构建高可靠嵌入式系统的中断与错误管理基石

1. 项目概述与核心价值 在嵌入式系统开发,尤其是汽车电子、工业控制这类对实时性和可靠性要求极高的领域,中断和错误处理机制的设计水平,直接决定了整个系统的“天花板”。很多工程师在项目初期,往往只关注功能实现,对…

2026/8/17 0:32:03 阅读更多 →
解决highlight.php常见问题:开发者必备的故障排除手册

解决highlight.php常见问题:开发者必备的故障排除手册

解决highlight.php常见问题:开发者必备的故障排除手册 【免费下载链接】highlight.php A port of highlight.js by Ivan Sagalaev to PHP 项目地址: https://gitcode.com/gh_mirrors/hi/highlight.php highlight.php是一款将highlight.js移植到PHP的代码高亮…

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

最新新闻

巴氏距离:从概率分布相似性度量到机器学习实战应用

巴氏距离:从概率分布相似性度量到机器学习实战应用

1. 从“像不像”到“差多少”:为什么我们需要巴氏距离?在数据分析和机器学习的日常工作中,我们经常需要回答一个看似简单却至关重要的问题:这两个概率分布有多像?或者更具体一点,它们到底差了多少&#xff…

2026/8/18 4:45:38 阅读更多 →
AI智能体如何通过自然语言工具提升复杂任务处理能力

AI智能体如何通过自然语言工具提升复杂任务处理能力

1. 项目概述:当AI智能体“学会”使用工具最近在复现和验证一个挺有意思的研究,核心结论简单直接:让AI智能体(AI Agents)拥有并使用自然语言工具(Natural Language Tools, NLT),能显著…

2026/8/18 4:45:38 阅读更多 →
滴滴战略聚焦:小桔车服升级为小桔租车,构建出行生态闭环

滴滴战略聚焦:小桔车服升级为小桔租车,构建出行生态闭环

1. 从“车服”到“租车”:一次战略聚焦的必然选择 最近打开滴滴App,不少用户可能都留意到了一个变化:原先的“小桔车服”入口,其核心服务已经悄然升级为“小桔租车”。这并非一次简单的图标或名称更换,而是滴滴在出行生…

2026/8/18 4:45:38 阅读更多 →
pmon常用命令详解:从硬件初始化到系统启动的底层管理指南

pmon常用命令详解:从硬件初始化到系统启动的底层管理指南

1. 项目概述:从“黑盒子”到“掌控者”刚接触一台新的服务器或工作站,尤其是那些运行着特定固件或底层监控系统的设备时,面对一个陌生的命令行环境,那种感觉就像被扔进了一个黑盒子。你不知道它能做什么,也不知道如何与…

2026/8/18 4:45:38 阅读更多 →
深入解析浏览器硬件加速:从渲染原理到GPU优化实战

深入解析浏览器硬件加速:从渲染原理到GPU优化实战

1. 从“卡顿”到“丝滑”:硬件加速的直观体验与核心价值 作为一名在客户端和前端领域摸爬滚打多年的开发者,我经历过无数次这样的场景:一个看似简单的页面动画,在低端设备上却拖泥带水,帧率低得可怜;一个包…

2026/8/18 4:44:38 阅读更多 →
计算机硬件五大件与存储单位详解:从CPU到硬盘的实用指南

计算机硬件五大件与存储单位详解:从CPU到硬盘的实用指南

1. 从“黑盒子”到“可理解”:为什么我们需要硬件基础 很多刚开始接触计算机的朋友,尤其是从Windows系统入门的朋友,常常会把电脑看作一个“黑盒子”——按下开机键,屏幕亮了,软件能运行,这就够了。至于里面…

2026/8/18 4:44:38 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →