面试官:
请你谈谈分页式、分段式、段页式和请求式分页内存管理的特点,以及它们和虚拟内存的关系。
应聘者回答参考:
1. 分区式内存管理(对比背景)
- 方式:将整个程序一次性加载到内存的一个连续区域中。
- 缺点:会产生 外部碎片,导致内存利用率低。
2. 分页式内存管理(Paging)
- 原理:
- 将内存划分为固定大小的页框(Page Frame,通常 4KB)。
- 程序被切分成同样大小的页(Page),逻辑上连续,物理上可以离散。
- 优点:
- 提高内存利用率,不产生外部碎片。
- 只会产生少量 内部碎片(最后一页用不完的部分)。
- 缺点:
- 不方便按照逻辑模块(如代码段、数据段)进行共享与保护。
3. 分段式内存管理(Segmentation)
- 原理:
- 根据逻辑模块(如代码段、数据段、堆、栈等)划分为多个段,每个段连续分配物理内存。
- 优点:
- 更符合程序的逻辑结构。
- 方便实现信息共享与保护(不同段可设置不同权限)。
- 缺点:
- 段长不固定,容易产生 外部碎片。
- 为大段分配连续空间较困难。
4. 段页式内存管理(Segmented Paging)
- 原理:
- 先按照逻辑模块划分为段,再对每个段进行分页。
- 逻辑地址 = 段号 + 页号 + 页内偏移量。
- 优点:
- 结合了分页与分段的优点:既支持逻辑模块化,也避免外部碎片。
- 缺点:
- 地址转换过程更复杂(段表 + 页表)。
5. 请求式分页(Demand Paging)与虚拟内存(Virtual Memory)
- 分页/分段/段页式的前提:进程必须全部加载到内存中。
- 请求式分页:
- 程序并不一次性加载,而是 按需加载页面。
- 依赖 局部性原理(程序运行时只会频繁访问少量数据)。
- 若访问的页面不在内存,会触发 缺页中断,操作系统从磁盘调入相应页面。
- 虚拟内存:
- 基于请求式分页实现。
- 使得程序的逻辑地址空间 大于实际物理内存,让应用感觉有“很大的内存”。
6. 对比总结
管理方式 | 特点 | 碎片情况 | 优缺点 |
---|---|---|---|
分区式 | 整个程序一次性装入内存 | 外部碎片严重 | 简单,但浪费空间 |
分页式 | 固定大小页,物理地址离散 | 少量内部碎片 | 内存利用率高,不利共享 |
分段式 | 按逻辑模块划分 | 外部碎片 | 方便共享与保护,难以分配大段 |
段页式 | 分段后再分页 | 减少外部碎片 | 结合两者优点,开销较大 |
请求分页 | 按需调入页面 | 几乎无碎片 | 支持虚拟内存,提高利用率 |
总结:
- 分页式:解决外部碎片,提升内存利用率。
- 分段式:方便逻辑管理和权限控制。
- 段页式:两者结合,取长补短。
- 请求式分页 & 虚拟内存:支持大程序在有限内存上运行,提升系统性能。
😀 关注 @公众号 程序员陈子青,获取更多 C++ 技术支持。