news 2026/2/25 7:37:27

Linux 内核内存管理基石:页面分配器(Page Allocator)深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 内核内存管理基石:页面分配器(Page Allocator)深度解析

Linux 内核内存管理基石:页面分配器(Page Allocator)深度解析

Linux 内核的内存管理是操作系统高效运行的核心,而**页面分配器(Page Allocator)则是其基石。它负责管理物理内存页面(通常为 4KB 大小)的分配和释放,使用Buddy 系统(Buddy Allocator)**作为核心算法,确保高效、快速地响应内核和用户空间的内存需求。 页面分配器处理从单个页面到连续大块内存的分配,支持 NUMA 架构、内存碎片化防控,并与 SLAB/SLUB 等对象分配器协作,形成完整的内存管理生态。

本文将从基础概念入手,逐步深入其工作原理、分配流程、优化机制和常见问题。基于 Linux 内核 6.x 版本(知识更新至 2026 年),结合官方文档和实践经验进行解析。

1. 基础概念:内存层次结构

Linux 将物理内存抽象为多层结构,以适应不同硬件(如 x86、ARM)和使用场景:

  • 页面(Page):最小分配单元,通常 4KB(可配置为 2MB 或更大)。每个页面由struct page表示,包含引用计数、标志位等元数据。
  • 节点(Node):NUMA 系统中的物理内存组(pg_data_t)。每个节点有多个 Zone。
  • 区(Zone):内存区域,根据硬件限制划分。主要类型包括:
    • ZONE_DMA:用于 DMA 设备(<16MB)。
    • ZONE_DMA32:32 位地址空间(<4GB)。
    • ZONE_NORMAL:常规内存。
    • ZONE_HIGHMEM:高内存(x86 32 位系统特有)。
    • ZONE_MOVABLE:可迁移内存(用于热插拔)。
  • 迁移类型(Migrate Types):页面分类,防止碎片化。主要有 MIGRATE_UNMOVABLE(不可迁移,如内核结构)、MIGRATE_MOVABLE(可迁移,如用户页)和 MIGRATE_RECLAIMABLE(可回收)。

快速对比表:常见 Zone 类型

Zone 类型地址范围(典型 x86)主要用途适用场景
ZONE_DMA0~16MB旧 DMA 设备嵌入式/旧硬件
ZONE_DMA320~4GB32 位 DMA 设备64 位系统兼容
ZONE_NORMAL4GB+内核/用户常规分配通用
ZONE_HIGHMEM896MB+ (32 位)用户空间高内存32 位系统
ZONE_MOVABLE可配置可热迁移内存虚拟化/碎片防控

页面分配器在每个 Zone 内维护 Buddy 系统,跟踪空闲页面。

2. Buddy 系统:核心分配算法

Buddy 系统是一种二进制伙伴算法,将内存分成 2^n 页面大小的块(Order 0: 1 页;Order 1: 2 页;…;MAX_ORDER: 通常 11,即 4MB)。 它通过空闲列表(free_area[MAX_ORDER])管理连续空闲块:

  • 分配过程:请求 Order k 的块时,从对应列表取块。若无,从更高 Order 分割(分裂为两个“伙伴”),一个分配,一个加入低 Order 列表。
  • 释放过程:释放块时,检查其伙伴是否空闲。若是,合并成更高 Order 块,减少碎片。
  • 优点:快速(O(log N))、低碎片(伙伴合并高效)。
  • 数据结构:每个 Zone 有struct free_area free_area[MAX_ORDER],内含迁移类型列表(free_list[MIGRATE_TYPES])。

示例:假设请求 4 页(Order 2)。若 Order 2 无空闲,从 Order 3 分割 8 页块成两个 4 页块,一个分配,一个加入 Order 2 列表。

3. 分配流程:从 API 到底层

页面分配的主要入口是alloc_pages(gfp_mask, order),它调用__alloc_pages()(页面分配器的“心脏”)。

  • GFP 标志(gfp_mask):控制分配行为,如 GFP_KERNEL(可睡眠)、GFP_ATOMIC(原子上下文,不可睡眠)、GFP_HIGHUSER(用户空间高优先级)。
  • 步骤
    1. 检查 Per-CPU 缓存(快速路径):每个 CPU 有本地页面缓存(per_cpu_pageset),避免全局锁。
    2. 若缓存空,从 Zone 的 Buddy 系统分配(慢路径):使用__rmqueue()从 free_list 取块。
    3. 若失败,触发内存回收(reclaim):唤醒 kswapd 守护进程,回收页面(LRU 算法)。
    4. 水印检查:低水印(low watermark)触发后台回收,高水印(high watermark)确保缓冲。
    5. 若仍失败,触发 OOM Killer(Out-Of-Memory),杀死进程释放内存。

水印机制对比表

水印类型阈值计算作用
Minpages_min (/proc/sys/vm/min_free_kbytes)最低阈值,低于触发 OOM
Lowmin * 5/4触发 kswapd 后台回收
Highmin * 3/2目标阈值,回收停止
4. 优化机制:Per-CPU 缓存与反碎片化
  • Per-CPU Pages(PCP):每个 CPU 维护本地空闲页面列表(struct per_cpu_pages),减少争用。批量从 Buddy 系统填充(pcp->batch,通常 31 页)。
  • 反碎片化
    • 页面迁移:将可移动页面移出碎片区域,支持 CMA(Contiguous Memory Allocator),用于大块连续分配(如 DMA)。CMA 在引导时预留内存,但允许 movable 页面使用,需时迁移。
    • 页面分组(Pageblocks):按迁移类型分组(默认 512 页),便于 compaction(内存整理守护进程 kcompactd)。
    • THP(Transparent Huge Pages):自动使用 2MB 巨大页,减少 TLB 开销,但可能加剧碎片。
5. 与其他分配器的关系

页面分配器是底层,提供大块页面;上层有:

  • SLAB/SLUB/SLOB:对象分配器,用于小对象(如结构体)。SLUB 是默认,基于页面缓存对象。
  • vmalloc:非连续虚拟内存分配,用于模块或大缓冲。

SLUB 与 Page Allocator 交互表

组件作用与 Page Allocator 关系
kmem_cache对象缓存(如 task_struct)从页面分配器取页面构建 slab
cpu_slabPer-CPU 缓存快速分配,避免全局锁
node_slabPer-Node 共享回退路径,从页面取块
6. 常见问题与调试
  • 碎片化:长期运行导致高 Order 分配失败。监控/proc/buddyinfo,使用echo 1 > /proc/sys/vm/compact_memory手动 compaction。
  • OOM:内存耗尽时触发。调整/proc/sys/vm/overcommit_memory(过量分配策略)。
  • 调试工具/proc/meminfovmstatslabtop;内核参数如page_owner=on跟踪分配者。
  • 性能瓶颈:在高负载下,锁争用(zone->lock)。NUMA 系统使用 node-local 分配优化。

页面分配器体现了 Linux “一切皆页面”的哲学,确保内存高效利用。 如果你对特定版本(如 5.x vs 6.x)或代码片段感兴趣,或者想讨论实际调优案例,随时告诉我!

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

leetcode 900. RLE Iterator RLE 迭代器-耗时100

Problem: 900. RLE Iterator RLE 迭代器 耗时100%&#xff0c;每次移除已经用掉的数字部分的&#xff0c;若是没用完则修改到剩下的数量&#xff0c;若是全部用完清空并返回-1 Code class RLEIterator { public:vector<int> enc;RLEIterator(vector<int>& enc…

作者头像 李华
网站建设 2026/2/8 1:50:10

YOLO26涨点改进 | 全网独家创新、特征融合改进篇 | CVPR 2024 顶会| 引入MFM调制融合模块, LEGM局部到全局模块,二者共同合作,多种创新改进,助力YOLO26高效涨点

一、本文介绍 本文给大家介绍MFM调制融合模块和LEGM局部到全局模块改进YOLO26模型!MFM和LEGM这种相互增强的学习策略,使得所提出的方法在计算机视觉各种任务性能上超越了现有先进方法,助力YOLO26 高效涨点!具体怎么使用请看全文。 🔥欢迎订阅我的专栏、带你学习使用最新…

作者头像 李华
网站建设 2026/2/24 9:39:09

2026年毕业论文自救指南:10款降AI率工具深度实测(附价格与避坑表)

Students help students.我今年写论文时候AI率用了三周才降下去&#xff0c;为了帮助大家解决论文AIGC率居高不下的难题&#xff0c;我根据最新的实测数据&#xff0c;整理了市面上10款主流的降AI工具。这不仅是一份工具清单&#xff0c;更是一份帮你省钱、省力的实操攻略。&am…

作者头像 李华
网站建设 2026/2/22 5:04:08

LVM分区创建、数据迁移与重新挂载操作文档

LVM分区创建、数据迁移与重新挂载操作文档 文档说明 操作场景&#xff1a;将原有数据目录&#xff08;/opt/data&#xff09;迁移至新建LVM逻辑卷&#xff0c;提升磁盘存储的灵活性&#xff08;扩容、缩容等&#xff09;&#xff0c;可在虚拟机上先操作操作对象&#xff1a;L…

作者头像 李华
网站建设 2026/2/25 6:19:58

春节归途:2026年天象版图与平安锦囊

一、2026年春节全国天气趋势总览2026年春节&#xff08;公历2月17日&#xff09;&#xff0c;全国天气将在冷暖空气的复杂博弈中呈现“南北差异显著&#xff0c;局地波动剧烈”的总体格局。北方大部以干冷为主&#xff0c;但受一股中等强度冷空气影响&#xff0c;节前返乡高峰期…

作者头像 李华
网站建设 2026/2/15 4:02:48

摆脱论文困扰!一键生成论文工具 千笔·专业论文写作工具 VS Checkjie 专为继续教育设计

随着人工智能技术的迅猛迭代与普及&#xff0c;AI辅助写作工具已逐步渗透到高校学术写作场景中&#xff0c;成为专科生、本科生、研究生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生&#xff0c;开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时…

作者头像 李华