# Linux 进程的内存模型
Linux 进程的内存模型是指 Linux 操作系统如何为每个进程分配、管理和组织内存。了解这一模型对调优性能、调试内存问题或开发系统级程序非常重要。
# 🧠 一、Linux 进程的内存空间结构(虚拟内存布局)
每个 Linux 进程在用户空间有一个独立的 虚拟地址空间,通常为 4GB(在 32 位系统中)或更大(如 128TB,在 64 位系统中)。这个空间被划分为几个不同的区域,每一块有其特定用途:
高地址(向上增长)
┌──────────────────────────────┐
│ Stack 堆栈区 │ ← 自动变量、函数调用栈帧
│ │
│ │
├──────────────────────────────┤
│ 空洞(可能未映射) │
├──────────────────────────────┤
│ Heap 堆区 │ ← malloc / new 分配的内存
│ │
│ │
├──────────────────────────────┤
│ BSS 段 │ ← 未初始化的全局变量、静态变量
├──────────────────────────────┤
│ Data 段 │ ← 已初始化的全局/静态变量
├──────────────────────────────┤
│ Text(代码)段 │ ← 程序的机器指令,只读
├──────────────────────────────┤
│ mmap 区域 │ ← 动态链接库、内存映射文件等
└──────────────────────────────┘
低地址(向下增长)
# 🧩 二、各部分详细说明
# 1. Text 段(代码段)
- 存放程序的机器指令
- 通常是只读的,防止程序代码被意外修改
- 共享:多个进程运行同一个程序时可共享该段内容
# 2. Data 段
- 存放已初始化的全局变量和静态变量
# 3. BSS 段
- 存放未初始化的全局变量和静态变量(系统启动时自动清零)
# 4. 堆(Heap)
- 用于动态分配的内存,比如
malloc
、new
等 - 向上增长
- 内存管理由程序员或运行时库负责(比如
glibc
的 malloc)
# 5. 栈(Stack)
- 函数调用、局部变量、返回地址等
- 向下增长
- 由操作系统自动分配和释放
- 每个线程都有自己的栈空间(默认几百 KB 到几 MB)
# 6. mmap 区域
- 动态链接库、共享内存、内存映射文件等
- 通过
mmap()
系统调用分配
# 🔍 三、查看进程内存使用的工具
pmap <pid>
:显示每个内存段的信息cat /proc/<pid>/maps
:详细的虚拟内存映射smem
:统计内存使用情况(包括共享/私有)top
,htop
: 查看 RES、VIRT、SHR 等信息valgrind
,massif
: 检查内存泄漏或堆使用
# 📊 四、几个重要的内存指标
指标 | 含义 |
---|---|
VIRT | 虚拟内存总量(不一定实际使用) |
RES | 实际使用的物理内存(resident set size) |
SHR | 共享内存大小(如共享库) |
PSS | Proportional Set Size(更准确的共享内存计量) |
# 🧠 五、注意事项
- 每个进程拥有独立虚拟地址空间,通过页表映射到物理内存
- 内核空间和用户空间隔离,用户进程不能直接访问内核空间
- Linux 使用**写时复制(COW)**技术优化内存共享,例如 fork 时
- 动态内存如果不释放,可能导致内存泄漏