1. 概述
在本篇文章中,我们首先介绍操作系统中用于内存管理的分页(Paging)机制,接着讲解内存碎片(Fragmentation)问题及其两种形式,并重点分析它们之间的区别。
最后,我们会解释一个关键问题:为什么在分页机制中只会出现内部碎片,而不会出现外部碎片?
2. 分页机制简介
分页允许我们将进程以非连续的方式存储在内存中,这是通过将进程划分为固定大小的“页(Page)”,同时将物理内存划分为同样大小的“帧(Frame)”来实现的。
在执行进程时,CPU会将每个页的逻辑地址(Logical Address)转换为对应的物理地址(Physical Address)。通过分段式分页(Segmented Paging)技术,我们可以将CPU提供的地址划分为页号(Page Number)和页偏移量(Page Offset)两个部分。
当虚拟地址(Virtual Address)较大时,程序占用的内存也会相应变大,因此对操作系统来说,使用分页机制管理内存是一项具有挑战性的任务。
✅ 虽然分页机制解决了外部碎片问题,但内部碎片仍然是其主要缺陷之一。
为了理解为什么分页机制中不会出现外部碎片,我们需要深入了解内部碎片和外部碎片的区别。
2.1. 物理地址的计算
要将逻辑地址转换为实际物理地址,我们需要知道页号。这个信息通常保存在页表(Page Table)中。页表不仅记录了每个页号对应的帧号,还负责地址转换。
物理地址的计算公式如下:
物理地址 = 帧号 × 页大小 + 页偏移量
如下图所示,展示了逻辑地址到物理地址的转换过程:
2.2. 示例说明
假设我们有一个进程,被划分为三个页:A、B、C。每个页都有对应的页号(例如A对应5,B对应6,C对应7)。
CPU通过页号在页表中查找对应的帧号,从而在物理内存中定位该页的位置。偏移量则用于定位帧中的具体位置:
3. 内存碎片及其分类
内存碎片是指内存被分割为多个小块,但这些小块无法被有效利用的现象。
碎片化内存通常是非连续的,因此无法被进程使用,导致内存利用率下降。碎片问题主要分为两种类型:
- 内部碎片(Internal Fragmentation)
- 外部碎片(External Fragmentation)
3.1. 内部碎片
当物理内存被划分为固定大小的块,并且分配给进程的块比其实际需要的更大时,就会产生内部碎片。
例如,一个进程只需要 3KB 的内存,但系统分配的是 4KB 的块,那么剩下的 1KB 就无法被其他进程使用,这就是内部碎片。
解决方法:最佳适配算法(Best Fit) 可以减少内部碎片。
3.2. 外部碎片
当总的空闲内存足够满足请求,但这些空闲内存是分散的、非连续的,因此无法分配给一个进程时,就会产生外部碎片。
例如,内存中可能有多个 1KB 的空闲块,但一个进程需要 3KB 的连续空间,这些小块就无法被利用。
解决方法:内存紧缩(Compaction) 或使用分段机制(Segmentation) 来管理内存。
4. 内部碎片与外部碎片的区别
特性 | 内部碎片 | 外部碎片 |
---|---|---|
内存块是否已分配 | 已分配但未使用 | 未分配但无法使用 |
内存划分方式 | 固定大小块 | 可变大小块 |
产生原因 | 分配的块大于所需大小 | 进程释放后留下空隙 |
解决方案 | 最佳适配算法 | 内存紧缩 |
常见于哪种机制 | 分页(Paging) | 分段(Segmentation) |
5. 为什么分页机制中会出现内部碎片?
由于分页机制将内存划分为固定大小的页,当程序所需的内存小于一个页的大小时,就会出现未被使用的空间,从而形成内部碎片。
示例说明
假设一个程序被划分为两个页,每页大小为 2KB,总共分配了 4KB 的内存。但如果程序实际只使用了 3KB,那么就会有 1KB 的空间未被使用,形成内部碎片。
如下图所示:
在这个例子中,两个页各使用了 1.7KB 和 1.3KB,剩下的空间无法被其他程序使用,导致内部碎片。
6. 分页机制中会出现外部碎片吗?
答案是否定的。分页机制几乎不会出现外部碎片。
这是因为在分页机制中,内存被划分为固定大小的页和帧,程序的内存使用是非连续的。因此,即使某个页中存在未使用的空间,也不会影响其他程序的分配。
示例说明
如下图所示,程序 A 占用了两个非连续页中的部分空间,程序 B 可以继续使用剩下的空间:
综合示意图
下图展示了内部碎片和外部碎片的对比:
7. 总结
- 分页机制通过将程序划分为固定大小的页,解决了外部碎片问题。
- 然而,由于页的大小固定,程序可能不会完全填满一个页,从而导致内部碎片。
- 内部碎片无法被其他程序使用,是一种内存浪费。
- 外部碎片通常出现在分段机制中,而在分页机制中几乎不存在。
- 虽然可以通过最佳适配等策略减少内部碎片,但无法完全避免。
✅ 踩坑提醒: 在设计操作系统或进行底层内存优化时,一定要注意分页机制的内部碎片问题,避免资源浪费。