1. 进程图像与内存管理基础
在操作系统的内存管理机制中,进程图像(Process Image)是指一个进程在内存中的完整表示,包括代码段、数据段、堆区和栈区等组成部分。理解进程图像的管理方式对于掌握操作系统内存管理原理至关重要。
现代操作系统通常采用分页式内存管理,允许虚拟地址连续的页面映射到物理内存中不连续的页框。然而,早期的Unix V6++系统采用了连续内存管理策略,这种设计带来了独特的管理逻辑和约束条件。
连续内存管理意味着一个进程的所有内存区域(代码、数据、堆、栈)在物理内存中必须占据一块连续的空间。这与现代操作系统的分页机制形成鲜明对比。
1.1 连续内存管理的核心约束
连续内存管理模式下,系统必须遵守以下基本原则:
-
物理空间连续性:进程虚拟地址空间中的连续区域必须对应物理内存中的连续块。这包括:
- 代码段(Text Segment)
- 数据段(Data Segment)
- 堆区(Heap)
- 用户栈(User Stack)
-
扩展限制:当进程需要更多内存时:
- 无法在原内存块后直接"追加"新空间(因为后面可能已被其他进程占用)
- 必须找到足够大的新连续区域,复制整个进程图像,然后释放旧空间
-
搬迁开销:每次内存扩展/收缩都涉及:
- 寻找合适的新内存区域
- 复制整个进程图像
- 更新所有内存映射关系
这种设计虽然简化了地址转换(不需要复杂的页表结构),但带来了显著的内存管理开销,特别是在频繁进行内存调整的场景下。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 堆空间管理机制
堆是进程用于动态内存分配的区域,其管理策略直接影响程序性能和系统稳定性。在连续内存管理模式下,堆空间的扩展与收缩遵循特定的规则。
2.1 堆扩展机制
当程序通过malloc等函数申请内存而堆空间不足时,会触发堆扩展流程:
-
触发条件:
- 用户程序调用malloc但空闲链表耗尽
- 库函数通过sbrk系统调用请求内核扩展堆空间
-
扩展策略:
- 3页预分配:每次至少扩展3个页面(通常12KB)
- 避免频繁搬迁:较大幅度的扩展减少后续调整次数
- OOM检查:确保扩展后堆顶不会
