分段分页

2025年5月5日 | 阅读9分钟

高效的内存管理是现代操作系统的基石之一。随着应用程序变得越来越复杂,对内存的需求也越来越高,操作系统在分配内存和访问权限时,需要在速度、灵活性和安全性之间取得平衡。分页和分段是两种被广泛用于管理内存的基本策略。

分页简化了内存分配,减少了碎片,并能通过将内存划分为固定大小的块来有效地利用空间。而分段则将内存管理与程序的逻辑结构对齐,使得代码、数据和堆栈段的分离更加容易,同时提高了安全性和模块化。

然而,每种技术都有其权衡。分页缺乏对程序逻辑结构的感知,而分段可能会出现碎片和失效问题。为了发挥两者的优势,现代系统通常采用一种称为“分段分页”的混合技术。这种方法通过结合分段的逻辑清晰性和分页的高效内存利用率,提供了一种强大的内存管理方式。

在本文中,我们将深入探讨分段分页,了解其架构、翻译过程、优点、局限性以及实际应用。

内存管理导论

内存管理是任何操作系统的一项基本功能,它负责计算机主内存的分配、组织和访问。这确保了系统中运行的各种程序和过程能够获得所需的内存资源来正常运行,同时保持整个系统的效率和稳定性。

在内存管理领域,两种传统技术占据主导地位:分页和分段。分页将内存划分为固定大小的块,包括逻辑内存和物理内存。这些块在逻辑内存中称为页,在物理内存中称为帧。这使得操作系统更容易管理内存分配并避免外部碎片。然而,由于分页将内存视为一个平坦的块序列,它不能反映程序的逻辑结构。

相比之下,分段将内存划分为可变大小的段,每个段对应程序的不同部分,如代码、数据或堆栈。这使得应用访问控制和理解程序结构更加容易,但段的可变大小可能导致碎片和内存失效。

虽然分页和分段都有其优势,但它们也存在局限性。分页效率高,但缺乏逻辑分离;分段提供清晰度和保护,但可能导致内存碎片。这就催生了分段分页——一种旨在结合这两种技术最优特性的混合方法。通过这样做,它能够实现现代计算系统中更高效、更灵活、更安全的内存使用。

什么是分段分页?

分段分页是一种混合式内存管理方案,它结合了分段和分页的优点,为现代计算机的内存管理创建了一个更高效、更灵活的系统。

要理解分段分页,首先要考虑它的每个组成部分是如何贡献的。分段将程序的内存逻辑上划分为独立的区域,如代码、数据和堆栈段。这些段的大小各不相同,并在程序内提供特定的功能,从而实现更好的逻辑组织和安全性。

另一方面,分页涉及将内存划分为固定大小的块。这使得系统能够更有效地分配内存,并有助于逻辑内存和物理内存避免外部碎片,因为它们被划分为大小相似的单元。

分段分页将这两种思想融合在一起。在该系统中,逻辑内存首先被划分为段,每个段代表程序的一个逻辑单元。然后,每个段进一步划分为特定大小的页,与标准分页类似。这些页最终被映射到主内存中的物理帧。

纯粹的分段并不流行,在许多操作系统中并未被使用。然而,分段可以与分页结合,以获得两种技术最佳的特性。

在分段分页中,主内存被划分为可变大小的段,而这些段又被划分为固定大小的页。

  1. 页比段小。
  2. 每个段都有一个页表,这意味着每个程序都有多个页表。
  3. 逻辑地址表示为段号(基地址)、页号和页偏移量。

段号 → 它指向相应的段号。

页号 → 它指向段内的具体页面

页偏移量 → 用作页帧内的偏移量

每个页表包含有关段中每个页面的各种信息。段表包含有关每个段的信息。每个段表条目指向一个页表条目,并且每个页表条目映射到段内的一个页面。

从程序的角度来看,内存仍然是逻辑结构化的——代码与数据不同,两者都与堆栈不同。但从系统的角度来看,每个段的内部内容被分解成易于管理、大小相似的页面,这些页面可以放置在物理内存中的任何位置。

这种双层方法使分段分页能够提供分段的逻辑清晰性和保护,同时保持分页的空间效率和简洁性。它在对模块化和内存优化都有要求的复杂系统(如多任务操作系统或虚拟内存实现)中尤其有用。

os Segmented Paging

分段分页的架构

分段分页的架构通过启动两级内存翻译过程,旨在整合分段和分页的优点。该系统为程序组织提供了一个逻辑框架,确保了物理内存的高效利用。

在分段分页中,逻辑地址空间——程序可以使用的地址范围——被划分为段,每个段代表程序的一个特定逻辑部分,如代码、数据或堆栈。然而,每个段并没有像传统分页系统那样被存储为物理内存中的一个固定块,而是可以被进一步细分,划分为固定大小的页。

逻辑地址结构

在分段分页系统中,CPU生成的逻辑地址通常由三部分组成:

  • 段号 (s) - 标识正在访问程序的哪个段。
  • 页号 (p) - 指定在该段内引用的是哪个页面。
  • 偏移量 (D) - 指示页面内的确切位置。

这三个组件共同作用,使系统能够指定程序逻辑内存空间中的任何字节。

段表

系统为每个进程维护一个段表,由操作系统管理。该表为每个段都有一个条目。每个条目包含两个重要信息:

基地址: 这是与该段关联的页表的起始地址。由于每个段都有自己的页表,所以这个基地址就是一个指向该页表的指针。

界限: 这表示段中的页面数量,有助于验证访问是否在段的边界内。

每个段的页表

与简单的分页不同,简单的分页为整个地址空间使用一个页表,分段分页为每个段维护一个单独的页表。这些页表包含从页号到帧号的映射。

当访问段内的某个页面时,系统会使用段表来查找相应的页表,然后使用页号在该页表中查找对应的帧号,最终映射到物理内存中的帧。

物理内存

物理内存被划分为与页大小相同的帧。不同段的页面(甚至不同进程的页面)可以加载到任何可用的帧中,因为物理内存不需要是连续的。

这种灵活性允许更好地利用内存,并减少了分段的主要问题——碎片。

逻辑地址到物理地址的转换

在分段分页中,将逻辑地址转换为物理地址的过程是一个两步操作,包括基于段的访问和基于页的映射。这种分层机制确保了内存的高效利用,同时保留了程序的逻辑结构。

让我们一步步地了解整个过程。

CPU生成一个逻辑地址,该地址被分成两部分:段号和段偏移量。段偏移量必须小于段界限。偏移量进一步分为页号和页偏移量。为了在页表中找到正确的页号,将页号加到页表基址上。

页表中的实际帧号加上页偏移量,即可映射到主内存,以获得特定段中某个页面所需的字。

逻辑地址结构

在分段分页中,逻辑地址由三部分组成:段号、页号和偏移量。段号识别正在访问程序的哪个逻辑部分。页号指定该段内的特定页面,偏移量表示该页面内的确切字节。这种结构使系统能够逻辑且高效地管理内存。

段表查找

转换过程首先使用段号索引当前进程的段表。段表包含有关每个段的信息,包括其页表的基地址和段中的页面数量。如果段号无效或超出允许范围,系统会触发错误以防止非法内存访问。

页表查找

从段表中检索到页表基址后,系统使用页号在该页表中查找相应的条目。每个页表将页号映射到物理帧号。如果页号大于段中的页面数量,则会发生保护错误,这表示尝试访问超出段边界的内存。

偏移量计算和物理地址

找到正确的帧号后,将偏移量加到该帧的基地址上。基地址是通过将帧号乘以页面大小计算得出的。结果是用于访问系统内存的物理地址。这个最终地址指示了 RAM 中所需数据的确切位置。

错误检查和安全

在整个翻译过程中,系统会检查以确保逻辑地址的所有组成部分都有效。这包括验证段号和页号是否在可接受的范围内,以及页面内的偏移量是否不超过页面大小。这些检查有助于通过防止非法内存访问来维护进程隔离和系统稳定性。

os Segmented Paging

分段分页的优点

  1. 它减少了内存使用量。
  2. 页表大小受段大小限制。
  3. 段表只有一个对应于一个实际段的条目。
  4. 没有外部碎片。
  5. 它简化了内存分配。

分段分页的缺点

  1. 会存在内部碎片。
  2. 与分页相比,复杂性要高得多。
  3. 页表需要连续存储在内存中。

常见问题解答

Q1. 什么是操作系统中的分段分页?

分段分页是一种混合式内存管理技术,它结合了分段和分页。它首先将程序的内存逻辑上划分为段(如代码、数据和堆栈),然后每个段进一步划分为固定大小的页。这种方法通过保留逻辑组织来提高内存效率。

Q2. 为什么我们使用分段分页?

使用分段分页是为了同时利用分段和分页的优点。它允许将相应内存区域进行逻辑分组,以实现更好的安全性和模块化(分段),同时使用固定大小的页面来消除外部碎片并简化内存分配(分页)。

Q3. 分段分页内存如何提高利用率?

通过将每个段分解为固定大小的页面,分段分页减少了外部碎片。不同段的页面可以非连续地存储在物理内存中,从而更好地利用可用内存,并便于分配内存块。

Q4. 分段分页中逻辑地址的结构是什么?

逻辑地址通常由三部分组成:段号、该段内的页号和页内的偏移量。这种三级地址结构有助于系统在物理内存中精确定位字节。

Q5. 在分段分页中如何计算物理地址?

系统首先使用段号来查找该段的页表。然后,它使用页号在物理内存中查找帧号。最后,将偏移量加到帧的基地址上,计算出物理地址。


下一个主题文件属性