3、地址重定位
地址重定位是操作系统中内存管理的关键环节,核心是将程序编译、链接后形成的逻辑地址(相对地址,从0开始)转换为程序在主存中实际存放的物理地址(绝对地址)。
根据重定位发生的时机,分为两类:
- 静态地址重定位:在程序装入主存时一次性完成重定位,之后程序运行过程中地址不再改变。实现简单,但程序装入后不能移动,灵活性差。
- 动态地址重定位:在程序执行过程中,每次访问内存时由硬件(如重定位寄存器)实时完成重定位。程序可以在主存中移动,灵活性高,是现代操作系统常用的方式。
4.3.2 分区存储管理
分区存储管理是早期多道程序设计环境下的内存管理方式,核心是将主存用户区划分为若干连续区域,每个区域分配给一个作业。
分区类型
- 固定分区:主存分区大小和数量在系统初始化时确定,之后不再改变。优点是实现简单,缺点是容易产生“内碎片”(分区内未被利用的空间),内存利用率低。
- 可变分区:根据作业实际需求动态划分分区,分区大小和数量不固定。优点是减少内碎片,缺点是会产生“外碎片”(多个小空闲分区无法满足大作业需求)。
- 可重定位分区:通过“紧凑”操作(将所有已分配分区移动到主存一端,合并外碎片为一个大空闲分区)解决外碎片问题,但紧凑过程会消耗系统时间。
分区保护
为防止作业越界访问其他分区,需采取保护机制:
- 上界/下界寄存器保护:
上界寄存器存作业的起始物理地址,下界寄存器存作业的结束物理地址。访问地址需满足:上界寄存器 ≤ 物理地址 ≤ 下界寄存器
,否则视为越界。 - 基址/限长寄存器保护:
基址寄存器存作业的起始物理地址,限长寄存器存作业的总长度。访问地址需满足:基址寄存器 ≤ 物理地址 < 基址寄存器 + 限长寄存器
,更直观地体现了作业的地址范围。
4.3.3 分页存储管理
分区管理的最大局限是要求作业装入连续的内存空间,当内存存在多个不连续的小空闲分区时,无法满足大作业需求(即使总空闲空间足够)。分页存储管理通过“离散分配”解决了这一问题。
纯分页存储管理
-
分页原理:
- 将进程的逻辑地址空间划分为大小相等的块,称为页(Page),每页大小固定(如4KB、8KB)。
- 将主存的物理空间划分为与页大小相同的块,称为物理块(Block/Page Frame)。
- 作业的各页可装入主存中不连续的物理块,通过“页表”记录页与物理块的对应关系。
-
地址结构:
逻辑地址由两部分组成:页号(P)
+页内偏移量(W)
。- 页内偏移量的位数决定了每页的大小:若偏移量为12位(如你提供的32位地址中0~11位),则每页大小为 (2^{12} = 4KB)。
- 页号的位数决定了进程最多可拥有的页数:32位地址中12~31位为页号(共20位),则最大页数为 (2^{20} = 1MB),进程最大地址空间为 (1MB \times 4KB = 4GB)。
-
地址转换过程:
逻辑地址(P,W)→ 查页表找到页P对应的物理块号B → 物理地址 = B × 页大小 + W。
补充说明
分页管理的优点是解决了内存连续分配的限制,提高了内存利用率,且无外碎片(仅可能有页内碎片,大小不超过一页)。但也存在页表占用内存、地址转换需硬件支持等问题。后续还会衍生出“请求分页存储管理”(结合虚拟内存技术,允许作业部分装入内存),进一步提升内存使用效率。
下面把上面这段教材原文“翻译”成更容易理解、便于记忆的要点,并补充一些考试中常见的易错点与例题,帮助你在 10 分钟内完全掌握。
────────────────
一、地址重定位(Relocation)
- 定义:把程序里写的“逻辑地址”翻译成真正放在内存里的“物理地址”。
- 两种做法
• 静态重定位:程序装入内存时一次性算好,之后不再改。
• 动态重定位:程序运行时每次访问内存都靠硬件(MMU)即时转换,支持紧凑、换入换出。
────────────────
二、分区存储管理(Partition)
-
核心思想:把主存用户区切成若干“块”,一块给一个作业。
-
三种切法
① 固定分区:块大小事先定好,碎片大。
② 可变分区:按作业实际大小切,碎片小但需“紧凑”。
③ 可重定位分区:可变分区+动态重定位,可把作业搬家再紧凑,碎片最少。 -
分区保护(记住两对寄存器即可)
• 上界/下界寄存器:物理地址 ∈ [上界, 下界)
• 基址/限长寄存器:物理地址 ∈ [基址, 基址+限长)
易错点:
- 上界/下界用的是“结束地址”,基址/限长用的是“长度”。
- 两个都是“左闭右开”区间,注意符号 ≤ 与 < 的区别。
────────────────
三、分页存储管理(Paging)
-
为什么引入:分区要求“整块连续”太浪费,分页把作业拆成固定大小的小片(页),哪里有空框就放哪里,碎片只在最后一页内部出现(平均浪费半页)。
-
纯分页(无快表,无分段)
• 逻辑地址 = 页号 P + 页内偏移 W
• 物理地址 = 页框号 f + 页内偏移 W(f 由页表查出) -
地址结构举例(教材原图)
32 位地址:
┌────────── 20 位 ──────────┐┌── 12 位 ──┐
│ 页号 P ││ 偏移 W │
└───────────────────────────────┘└───────────┘
每页大小 = 2^12 = 4 KB
最大页数 = 2^20 = 1 M 页 → 最大地址空间 = 1 M × 4 KB = 4 GB
易错点:
- 页大小 = 2^偏移位宽,别算反。
- 页号位数决定“逻辑页数”,不是物理内存大小。
────────────────
一句话总结
分区管理:整块给作业,碎片大;
分页管理:拆成固定小页,碎片小,逻辑页→物理框靠页表动态重定位。