内存管理
- 1.代码段(Code Segment / Text Segment)常量区
- 2. 数据段(Data Segment)静态区
- 3. BSS 段(未初始化数据段)
- 4. 堆(Heap)
- 5. 栈(Stack)
- 6. 内存映射段(Memory Mapping Segment)
-
1.代码段(Code Segment / Text Segment)常量区
- 功能
存储程序的可执行机器指令,包括函数体、控制流逻辑和操作码。 - 特性
只读且固定:防止程序意外修改自身代码,确保执行安全。
共享性:多个进程可共享同一份代码(如操作系统内核、共享库)。
编译时确定:大小和内容在编译阶段固化,运行时不可变。 - 存储内容
函数定义和实现。
字面量字符串(如 “Hello, World!”)。
指令操作码(如加法、跳转指令)。
2. 数据段(Data Segment)静态区
- 功能
存储已初始化的全局变量和静态变量。 - 特性
读写区域:程序运行时可修改变量值。
初始化值:变量值来自编译时的显式赋值。
持续性:生命周期贯穿程序运行始终。 - 存储内容
已初始化的全局变量(如 int global = 42;)。
已初始化的静态变量(如 static int count = 0;)。
全局 / 静态数组(如 char msg[] = “Hi”;)。
3. BSS 段(未初始化数据段)
- 功能
存储未初始化的全局变量和静态变量。 - 特性
零初始化:运行时自动初始化为 0(或空指针)。
不占磁盘空间:仅在内存中分配,减少可执行文件大小。
读写区域:与数据段相同,但初始值不同。 - 存储内容
未初始化的全局变量(如 int global;)。
未初始化的静态变量(如 static int temp;)。
全局 / 静态数组(如 char buffer[1024];)。
4. 堆(Heap)
- 功能
动态分配内存,用于运行时创建对象(如 malloc/new),堆是向上增长的。 - 特性
手动管理:程序员负责申请(malloc/new)和释放(free/delete)。
动态扩展:通过系统调用(如 brk/mmap)调整大小。
碎片化风险:频繁分配 / 释放可能导致内存碎片,降低利用率。
较大空间:理论上限为虚拟地址空间(如 64 位系统的 16EB)。 - 存储内容
动态分配的对象(如 int* ptr = new int[100];)。
运行时创建的数据结构(如链表、树)。
共享内存区域(通过 shm_open 等 API 创建)。
5. 栈(Stack)
- 功能
存储函数调用上下文和局部变量,实现函数调用栈。栈是向下增长的。 - 特性
后进先出(LIFO):由操作系统自动管理,通过栈指针(SP)操作。
快速访问:通过寄存器直接操作栈顶,速度快于堆。
自动回收:函数返回时自动释放内存,无需手动管理。
固定大小:默认栈深度有限(如 Linux 默认 8MB),可能导致栈溢出。 - 存储内容
局部变量(如 int x = 10;)。
函数参数(如 void func(int a, int b) 的 a 和 b)。
调用帧信息(返回地址、寄存器值、栈基址)。
临时变量(如函数内的计算结果)。
6. 内存映射段(Memory Mapping Segment)
- 功能
将文件或设备映射到进程地址空间,实现高效 I/O 和共享内存。 - 特性
文件映射:通过 mmap() 将文件内容直接映射到内存,避免拷贝。
共享内存:多个进程可映射同一文件,实现进程间通信(IPC)。
动态加载:用于加载共享库(如 .so 文件)。
虚拟内存:仅在访问时实际分配物理内存,节省资源。 - 存储内容
动态链接库(如 libc.so)。
通过 mmap() 映射的文件(如配置文件、数据库)。
匿名内存映射(如 MAP_ANONYMOUS 创建的临时缓冲区)。
共享内存对象(如 POSIX 共享内存)。
对比总结
区域 | 存储内容 | 生命周期 | 分配方式 | 访问速度 | 风险/注意事项 |
---|
代码段 | 可执行指令、字面量字符串 | 程序运行期间 | 编译时静态分配 | 最快 | 不可修改(修改会触发段错误) |
数据段 | 已初始化全局/静态变量 | 程序运行期间 | 编译时静态分配 | 快 | 持续占用内存 |
BSS段 | 未初始化全局/静态变量 | 程序运行期间 | 运行时零初始化 | 快 | 自动清零,节省磁盘空间 |
堆 | 动态分配的对象(malloc /new ) | 手动管理(free /delete ) | 运行时系统调用(sbrk /mmap ) | 较慢 | 内存泄漏、碎片化、需手动释放 |
栈 | 局部变量、函数调用帧 | 函数执行期间 | 自动分配/回收(SP指针) | 最快 | 栈溢出(Stack Overflow) |
内存映射段 | 文件映射、共享库、匿名映射 | 手动管理(munmap ) | 运行时系统调用(mmap ) | 中等 | 需处理映射错误、同步问题 |
内存布局示意图
高地址 ──────────────────────────────────────────────────────────────────│ ││ 命令行参数和环境变量 │├─────────────────────────────────────────────────────────────────┤│ ││ 栈 (向下增长) ││ ├─ 函数调用帧 ││ ├─ 局部变量 ││ └─ ... ││ │├─────────────────────────────────────────────────────────────────┤│ ││ 内存映射段 ││ ├─ 文件映射 ││ ├─ 共享库 ││ └─ 匿名映射 ││ │├─────────────────────────────────────────────────────────────────┤│ ││ 堆 (向上增长) ││ ├─ 动态分配的对象 ││ └─ ... ││ │├─────────────────────────────────────────────────────────────────┤│ ││ BSS段 (未初始化数据) ││ ├─ 未初始化全局变量 ││ └─ 未初始化静态变量 ││ │├─────────────────────────────────────────────────────────────────┤│ ││ 数据段 (已初始化数据) ││ ├─ 已初始化全局变量 ││ └─ 已初始化静态变量 ││ │├─────────────────────────────────────────────────────────────────┤│ ││ 代码段 (可执行指令) ││ ├─ 函数体 ││ └─ 字面量字符串 ││ │└─────────────────────────────────────────────────────────────────┘ 低地址