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/7/27 15:17:07 阅读更多 →
TMS570 VIM与ESM模块解析:构建高可靠嵌入式系统的中断与错误管理基石

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

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

2026/7/27 15:17:07 阅读更多 →
解决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/7/27 15:17:07 阅读更多 →

最新新闻

抖音弹幕实时采集:如何通过系统代理技术解锁直播数据价值

抖音弹幕实时采集:如何通过系统代理技术解锁直播数据价值

抖音弹幕实时采集:如何通过系统代理技术解锁直播数据价值 【免费下载链接】DouyinBarrageGrab 基于系统代理的抖音弹幕wss抓取程序,能够获取所有数据来源,包括chrome,抖音直播伴侣等,可进行进程过滤 项目地址: https…

2026/7/27 15:29:12 阅读更多 →
网工转网络安全,月正过万,能不能实现?

网工转网络安全,月正过万,能不能实现?

网工转网络安全,月正过万,能不能实现? 懂网络架构、熟知设备备置、知道网络协议,这不是网络安全的核心基础吗? 别人要花三个月打基础,身为网工的你直接上手操作,但是很多网工人不知道怎么转网…

2026/7/27 15:29:12 阅读更多 →
计算机毕业设计之基于PHP的在线旅游预订平台

计算机毕业设计之基于PHP的在线旅游预订平台

信息技术是当今社会发展的重要方向之一,它已经深入到各个行业中。随着计算机技术的发展,信息技术已经从传统的数据处理转变为网络信息的处理和交互。在管理方面,通过信息管理技术,系统可以快速的处理大量的数据,并且能…

2026/7/27 15:29:12 阅读更多 →
如何使用Orion进行安全密码哈希:保护用户数据的终极指南

如何使用Orion进行安全密码哈希:保护用户数据的终极指南

如何使用Orion进行安全密码哈希:保护用户数据的终极指南 【免费下载链接】orion Usable, easy and safe pure-Rust crypto 项目地址: https://gitcode.com/gh_mirrors/orion15/orion 在当今数字化时代,用户数据安全面临着前所未有的挑战&#xff…

2026/7/27 15:29:12 阅读更多 →
Qwerty Learner自定义词典导入完全指南:打造个性化打字练习系统

Qwerty Learner自定义词典导入完全指南:打造个性化打字练习系统

Qwerty Learner自定义词典导入完全指南:打造个性化打字练习系统 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: ht…

2026/7/27 15:29:12 阅读更多 →
计算机毕业设计之基于大数据的小说阅读推荐网站的设计与实现

计算机毕业设计之基于大数据的小说阅读推荐网站的设计与实现

伴随着互联网时代的到来,使得传统产业和互联网相结合迸发出惊人的能量。计算机硬件的快速发展和网络的普及导致小说阅读推荐网站可视化分析中的大数据呈现爆炸式增长,大数据可视化分析对小说阅读推荐网站也具有重要的意义。小说阅读推荐网站的分析和可视…

2026/7/27 15:28:12 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻