1. 概述

在本篇文章中,我们将深入探讨两种主流的非连续内存分配技术:Segmented Paging(分段分页)Paged Segmentation(分页分段)。我们会分别讲解它们的工作机制、优缺点,并通过示例说明其地址转换过程。

最后,我们还会对比这两种技术的核心差异,帮助你更好地理解它们在内存管理中的实际应用。


2. 背景与动机

现代程序日益复杂,对内存的需求也越来越大。为了提升内存使用效率,操作系统引入了虚拟内存分页机制。但随着逻辑地址空间的扩大,页表(Page Table) 占用的内存也会急剧增加,这成为内存管理中的一个瓶颈。

为了解决这个问题,研究人员提出了结合分段(Segmentation)分页(Paging)的混合策略。本文将重点介绍其中的两种实现方式:Segmented Paging 和 Paged Segmentation。


3. Segmented Paging(分段分页)

Segmented Paging 是将分段分页结合使用的一种技术,目的是减少页表在内存中的占用空间

3.1. 基本原理

  • 分段:将程序划分为多个逻辑段(如代码段、数据段、堆栈段等)。
  • 分页:每个段再进一步划分为固定大小的页。
  • 段表(Segment Table):记录每个段对应的页表地址。
  • 页表(Page Table):记录页对应的物理帧地址。

这样,每个逻辑地址由三部分组成: ✅ 段号(Segment Number)
✅ 页号(Page Number)
✅ 页内偏移(Offset)

AddressSegmentedPaging

3.2. 示例说明

假设我们有一个程序,包含两个段:函数段(A)和数据段(B)。段表中分别记录了这两个段的页表地址。

例如,逻辑地址为 (A: 5, 1, 20),表示:

  • 段 A(Segment 5)
  • 页号 1
  • 偏移 20

物理地址计算为:

$$ pa = 515 \times page_size + 20 $$

SegmentedPaging

3.3. 优缺点分析

优点 缺点
✅ 减少页表大小 ❌ 顺序地址转换导致访问延迟
✅ 避免外部碎片 ❌ 硬件实现较复杂
✅ 内存分配更简单 ❌ 页表必须连续存储

4. Paged Segmentation(分页分段)

Paged Segmentation 的核心思想是将段表本身也进行分页,从而进一步减少段表在内存中的占用。

4.1. 基本原理

  • 段表分页:将段表划分为多个页,每个页对应一个页表。
  • 地址结构:包含四个字段:
    • 页面号(Page Number)
    • 段号(Segment Number)
    • 页表页号(Second Page Number)
    • 偏移(Offset)

AddressPagedSegmentation

4.2. 示例说明

考虑一个程序包含三个段 A、B、C。逻辑地址为 (C: 10, 20, 5, 949),表示:

  • 第 10 页的页表中查找段 C 的页表地址
  • 从该页表的第 20 项中获取对应的页表地址
  • 在该页表的第 5 项中找到物理帧地址
  • 最后加上偏移 949 得到物理地址

最终物理地址为:

$$ pa = 12 \times page_size + offset $$

PagedSegmentation

4.3. 优缺点分析

优点 缺点
✅ 消除外部碎片 ❌ 存在内部碎片风险
✅ 减少段表大小 ❌ 地址转换延迟更高
✅ 内存利用率更高 ❌ 硬件实现更复杂

5. 核心差异对比

特性 Segmented Paging Paged Segmentation
分段方式 段被分页 段表也被分页
地址结构 段号 + 页号 + 偏移 页号 + 段号 + 页号 + 偏移
硬件复杂度 较低 较高
可能碎片类型 外部碎片(概率低) 内部碎片(概率低)
页表结构 每个段一个页表 每个段表一个页表

6. 总结

尽管分页和分段各自都有一定的优势,但它们也带来了内存碎片的问题。为了缓解这一问题,结合分段与分页的混合技术被提出,其中:

  • Segmented Paging 更适合减少页表大小,但存在外部碎片风险
  • Paged Segmentation 进一步优化段表结构,减少内存占用,但实现更复杂

理解这两种技术的差异,有助于我们在设计操作系统或虚拟内存机制时做出更合理的选择。在实际应用中,根据系统需求和硬件能力选择合适的策略,才能实现高效、稳定的内存管理。


原始标题:Segmented Paging vs. Paged Segmentation