# 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)

  • 用于动态分配的内存,比如 mallocnew
  • 向上增长
  • 内存管理由程序员或运行时库负责(比如 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 时
  • 动态内存如果不释放,可能导致内存泄漏

Last Updated: 8/16/2025, 9:37:55 PM