Linux Memory 架构与常见专业术语
Linux 内存管理(Linux Memory Management)是 Linux Kernel 中最复杂、也是最核心的子系统之一。它不仅负责物理内存(Physical Memory)的管理,还负责虚拟内存(Virtual Memory)、页缓存(Page Cache)、NUMA、内存回收(Reclaim)、交换(Swap)、Huge Page、OOM 等众多功能。
理解 Linux Memory 的整体架构,对于性能优化、内核开发、数据库、Kubernetes、云计算以及面试都有非常大的帮助。

Linux Memory 总体架构
Linux 内存管理可以分为几个主要层次:
Linux Memory 并不是一个单独模块,而是多个子系统协同工作的结果。

一、Virtual Memory(虚拟内存)
现代 Linux 使用虚拟地址(Virtual Address)而不是物理地址。
每个进程都拥有独立的地址空间:
0x0000000000000000
├── Code
├── Data
├── Heap
├── mmap()
├── Shared Library
├── Stack
0xFFFFFFFFFFFFFFFF
CPU 访问的是虚拟地址(VA),MMU(Memory Management Unit)通过页表(Page Table)将其转换为物理地址(PA)。
因此,经常会看到几个术语:
●Virtual Address(VA)
●Physical Address(PA)
●MMU
●Page Table
●Address Translation

二、Page(页)
Linux Memory 的最小管理单位是 Page。
通常:
x86
Page Size = 4 KB
当然也支持:
●Huge Page(2MB)
●Giant Page(1GB)
内核中的每个物理页都会对应一个:
struct page
因此经常看到:
struct page
几乎所有 Memory 子系统都会围绕它展开。

三、Page Frame
Page Frame 指的是物理内存中的一个页。
例如:
RAM
+-------+
|Page 0 |
+-------+
|Page 1 |
+-------+
|Page 2 |
+-------+
Linux 实际管理的是 Page Frame,而不是字节。

四、Zone(内存区域)
物理内存继续划分成多个 Zone。
典型 x86_64:
Node 0
+-----------------------+
| DMA|
+-----------------------+
| DMA32|
+-----------------------+
| Normal|
+-----------------------+
| Movable|
+-----------------------+
原因:
不同设备访问内存能力不同。
例如:
DMA 设备只能访问低地址。
因此 Linux 使用:
ZONE_DMA
ZONE_DMA32
ZONE_NORMAL
ZONE_MOVABLE
五、NUMA(Non-Uniform Memory Access)
服务器通常不是只有一个 CPU。
例如:
CPU0 ------ Memory0
CPU1 ------ Memory1
访问本地 Memory:
Fast
访问远程 Memory:
Slow
因此 Linux 引入:
NUMA Node
术语包括:
●NUMA Node
●Local Memory
●Remote Memory
●NUMA Balancing

六、Buddy Allocator(伙伴算法)
Linux 使用 Buddy System 管理物理内存。
它负责:
●分配 Page
●回收 Page
●合并连续 Page
例如:
1024 Pages
↓
512 + 512
↓
256 +256
优点:
●分配快
●合并快
缺点:
●External Fragmentation(外部碎片)
七、Slab Allocator
Buddy 只能分配 Page。
如果申请:
128 Bytes
直接分配 4KB Page 太浪费。
于是 Linux 引入:
SLAB
SLUB
SLOB(已基本淘汰)
负责:
kmalloc()
↓
Cache
↓
Object
典型对象:
●task_struct
●inode
●dentry
●file
因此:
Buddy 管理 Page
Slab 管理 Kernel Object
八、Page Cache
文件读写不会直接访问磁盘。
而是:
Disk
↓
Page Cache
↓
Application
因此:
read()
↓
Page Cache
↓
Disk(Miss)
好处:
●减少磁盘 IO
●加速读取
Page Cache 是 Linux 性能优化中最重要的模块之一。

九、LRU(Least Recently Used)
内存满了怎么办?
Linux 会选择一些页回收。
经典算法:
LRU
现代 Kernel 使用:
Active List
Inactive List
负责:
●判断冷热页
●回收冷页
十、Swap
如果 RAM 不够:
RAM
↓
Swap Disk
页面可以:
Swap Out
以后再:
Swap In
优点:
避免 OOM。
缺点:
性能下降明显。
十一、OOM(Out Of Memory)
当:
Memory Exhausted
Linux 会启动:
OOM Killer
根据:
oom_score
选择最合适的进程结束。
相关术语:
●OOM Killer
●oom_score
●oom_score_adj

十二、Memory Reclaim(内存回收)
Linux 有两种主要回收方式:
kswapd
后台线程:
Memory Low
↓
kswapd
↓
Reclai
Direct Reclaim
申请内存失败:
alloc_pages()
↓
Direct Reclaim
通常性能更差。

十三、Memory Compaction(内存整理)
连续物理内存不足时:
Compaction
↓
Move Pages
↓
Create Large Free Block
主要用于:
●Huge Page
●CMA
●高阶内存分配(High-order Allocation)
十四、Huge Page
普通:
4 KB
Huge Page:
2 MB
Gigantic Page:
1 GB
优势:
●减少 Page Table
●降低 TLB Miss
●提高数据库和虚拟化场景性能
十五、Page Fault(缺页异常)
访问虚拟地址时:
CPU
↓
Page Fault
↓
Kernel
↓
Handle Fault
分为:
●Minor Page Fault
●Major Page Fault
Major Fault 需要访问磁盘,代价最高。

十六、Copy-on-Write(COW)
执行:
fork()
时:
父子进程共享同一物理页:
Parent
\
Page
/
Child
当任一进程写入时:
Copy
↓
Write
从而避免不必要的数据复制,提高效率。

十七、Memory Overcommit
Linux 默认允许:
malloc(100GB)
即使机器只有:
32GB RAM
真正访问时才分配。
对应:
vm.overcommit_memory
十八、Memory Cgroup(memcg)
在容器环境中:
Container A
2GB
Container B
4GB
Linux 使用:
Memory Cgroup
限制:
●Memory Limit
●OOM
●Page Cache
●Swap
Kubernetes 的 Pod Memory Limit 底层正是依赖 memcg 实现。
总结
Linux 内存管理可以概括为一条清晰的数据流:
Application
│
▼
Virtual Memory
│
▼
Page Table
│
▼
Physical Memory
│
▼
Buddy Allocator
│
▼
Slab / Page Cache
│
▼
LRU Reclaim
│
▼
Swap / OOM
掌握这一整体架构,再逐步深入到各个模块(如页表、Buddy、SLUB、Page Cache、内存回收、NUMA、memcg 等),能够帮助我们更高效地分析内存性能问题、理解内核源码,并在系统性能优化和技术面试中建立完整的知识体系。