1. 概述

在本篇文章中,我们首先介绍操作系统中用于内存管理的分页(Paging)机制,接着讲解内存碎片(Fragmentation)问题及其两种形式,并重点分析它们之间的区别。

最后,我们会解释一个关键问题:为什么在分页机制中只会出现内部碎片,而不会出现外部碎片?

2. 分页机制简介

分页允许我们将进程以非连续的方式存储在内存中,这是通过将进程划分为固定大小的“页(Page)”,同时将物理内存划分为同样大小的“帧(Frame)”来实现的。

在执行进程时,CPU会将每个页的逻辑地址(Logical Address)转换为对应的物理地址(Physical Address)。通过分段式分页(Segmented Paging)技术,我们可以将CPU提供的地址划分为页号(Page Number)和页偏移量(Page Offset)两个部分。

当虚拟地址(Virtual Address)较大时,程序占用的内存也会相应变大,因此对操作系统来说,使用分页机制管理内存是一项具有挑战性的任务。

虽然分页机制解决了外部碎片问题,但内部碎片仍然是其主要缺陷之一。

为了理解为什么分页机制中不会出现外部碎片,我们需要深入了解内部碎片和外部碎片的区别。

2.1. 物理地址的计算

要将逻辑地址转换为实际物理地址,我们需要知道页号。这个信息通常保存在页表(Page Table)中。页表不仅记录了每个页号对应的帧号,还负责地址转换。

物理地址的计算公式如下:

物理地址 = 帧号 × 页大小 + 页偏移量

如下图所示,展示了逻辑地址到物理地址的转换过程:

pg

2.2. 示例说明

假设我们有一个进程,被划分为三个页:A、B、C。每个页都有对应的页号(例如A对应5,B对应6,C对应7)。

CPU通过页号在页表中查找对应的帧号,从而在物理内存中定位该页的位置。偏移量则用于定位帧中的具体位置:

pgex

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 的空间未被使用,形成内部碎片。

如下图所示:

in

在这个例子中,两个页各使用了 1.7KB 和 1.3KB,剩下的空间无法被其他程序使用,导致内部碎片。

6. 分页机制中会出现外部碎片吗?

答案是否定的。分页机制几乎不会出现外部碎片。

这是因为在分页机制中,内存被划分为固定大小的页和帧,程序的内存使用是非连续的。因此,即使某个页中存在未使用的空间,也不会影响其他程序的分配。

示例说明

如下图所示,程序 A 占用了两个非连续页中的部分空间,程序 B 可以继续使用剩下的空间:

ex

综合示意图

下图展示了内部碎片和外部碎片的对比:

inex

7. 总结

  • 分页机制通过将程序划分为固定大小的页,解决了外部碎片问题。
  • 然而,由于页的大小固定,程序可能不会完全填满一个页,从而导致内部碎片
  • 内部碎片无法被其他程序使用,是一种内存浪费。
  • 外部碎片通常出现在分段机制中,而在分页机制中几乎不存在。
  • 虽然可以通过最佳适配等策略减少内部碎片,但无法完全避免。

踩坑提醒: 在设计操作系统或进行底层内存优化时,一定要注意分页机制的内部碎片问题,避免资源浪费。


原始标题:Internal Fragmentation vs. External Fragmentation in Paging