第五课 存储器管理
(Memory Management)
教学目的:
存储器是计算机系统的重要组成部分,虽然
内存容量在不断扩大,但内存仍是宝贵资源,
如何提高主存储器利用率,并扩充大主存,对
主存信息实现有效保护是存储器管理主要任务,
也是各种不同存储管理方法的目标。
教学要求:
?熟悉 存储管理目的和 功能,掌握地址重定位的概念。
?熟悉 单一连续分配,固定分区分配,动态分区分配 实
现 原理; 掌握 可变式分区分配的 数据结构和 分配 回收
算法,掌握 动态重定位分区分配 实现 原理和分配 算法。
?熟悉 覆盖与交换 的概念。
?熟练掌握 分页存储管理 原理,熟练掌握 基本的地址变
换机构和具有快表的地址变换机构,了解两级页表机
制。
?掌握 分段存储管理 原理和 分段地址变换机构,掌握分
页和分段比较,熟 悉 分页和分段的共享,掌握 段页 式
存储管理 原理和 地址变换机构。
(一) 存储管理概述
( 1) 存储管理目的和 功能:
1。 主存储器的分配和回收
内存分配的主要任务是为每一道程序分配内存空间, 使它们
,各得其所,, 分配时完成 地址变换 。 每一道程序完成后回收
内存空间 。
2。存储保护
内存保护的任务是确保每道程序都在自己的内存空间运行,
互不干扰。
3。 提高主存储器的利用率, 减少不可用的存储空间 ( 称为, 零
头 ), 允许 多道程序 动态共享主存 。
4。 内存 扩充
内存 扩充的任务是从逻辑上来扩充内存容量, 使用户认为系统
所拥有的内存空间远比其实际的内存空间 ( 硬件 RAM) 大的多 。
( 2) 地址重定位
1。 名字空间、地址空间和存储空间
在源程序中,是通过符号名来访问子程序和数据的,
我们把程序中符号名的集合称为“名字空间”。汇编语
言源程序经过汇编,或者高级语言源程序经过编译,得
到的目标程序是以,0”作为参考地址的模块。然后多个
目标模块由连接程序连接成一个具有统一地址的装配模
块,以便最后装入内存中执行。我们把目标模块中的地
址称为相对地址(或称为“逻辑地址”),而把相对地
址的集合称为“相对地址空间”或简称为“地址空间”。
装配模块虽然具有统一的地址空间,但是仍是以,0”
作为参考地址,即是浮动的。要把它装入内存执行,就
要确定装入内存的实际物理地址,并修改程序中与地址
有关的代码,这一过程称为地址重定位。
地址重定位 -1
地址空间的程序和数据经过地址重定位处理后, 就变成了可由 CPU
直接执行的绝对地址程序 。 我们把这一地址集合称为, 绝对地址
空间, 或, 存储空间, 。 程序的名字空间, 地址空间和存储空间
之间的关系如图所示:
符 号
源 程 序 相对目标程序 ( 装配模
块 )
绝对目标程

名字空间 地址空间
相对地址 /逻辑地址
空间
存储空间
绝对地址 /物理地址
空间
汇编 /编译
连 接
地址重定位
装 入
2。 地址重定位
地址重定位完成把相对地址转换成内存中的绝对地址,这
个过程称为地址映射( map)。 按照重定位的时机,可分
为静态重定位和动态重定位。
?静态重定位
静态重定位是在程序执行之前进行重定位。它根据装配模
块将要装入的内存起始地址,直接修改装配模块中的有
关使用地址的指令。
在 图中以,0”作为参考地址的装配模块,要装入以
1000为起始地址的存储空间。显然在装入程序之前,程
序必须做一些修改才能正确运行。
地址重定位 -2
10000:
10100:
12500:
12600:
程序的地址空间 内存的地址空间
例如,LOAD 1,2500 这条指令是把相对地址为 2500的存储单元
的内容 365装入 1号累加器 。 而这时内容为 365的存储单元的实
际物理地址为 12500( 起始地址 10000+相对地址 2500), 所以
LOAD 1,2500 这条指令中的直接地址码要作相应的修改, 即
改为 LOAD 1,12500。
LOAD 1,2500 LOAD 1,12500
365 365
0:
100:
2500:
2600:
地址重定位 -3
在程序中需要修改的位置称为重定位项。程序装入内存中的起
始地址称为重定位因子。为了支持静态重定位,连接程序在生成统
一地址空间和装配模块时,还应产生一个重定位项表。所以操作系
统的装入程序要把装入模块和重定位项表一起装入内存。由装配模
块的实际装入起始地址得到重定位因子,然后取重定位项,加上重
定位因子得到欲修改位置的实际地址,最后对实际地址中的内容再
加上重定位因子,从而完成指令代码的修改。当完成重定位后,就
可以启动程序执行。
静态重定位虽然有无须硬件支持的优点,但是也存在明显的缺
点:一是程序重定位以后就不能在内存中移动;二是要求程序的存
储空间是连续的,不能把程序存储到若干个不连续的区域中。
地址重定位 -4
?动态重定位
动态重定位是指在程序执行过程中进行地址重定位,
即在每次访问内存单元前才进行地址变换 。 动态重定位
可使装配模块不加任何修改就装入内存, 但是它需要硬
件 — 重定位寄存器的支持 。 下图给出了 动态重定位的示
意图 。
程序的目标模块在装入内存时, 与地址有关的指令都无
须进行修改, 如在图 中 LOAD 1,2500这条指令中仍保
持相对地址 2500。 当该模块被操作系统调度到处理机上
执行时, 操作系统首先把该模块装入的实际起始地址减
去目标模块的相对基地址 ( 图 中该模块的基地址为 0),
然后将其差值装入重定位寄存器 。
1000
动态重定位的示意图
重定位寄存器
10000
0,10000:
100,LOAD 1,2500 10100,LOAD 1,2500
+
2500,365 12500,365
2600,12600:
程序的地址空间 内存的地址空间
0
100
200
300
.
.
.
.
.
.
.
.
.
LOAD A 200
3456
逻辑地址空间
1100
1200
1300
物理地址空间
200
VR
+
1000
BR
地址映射
地址重定位 -5
当 CPU取一条访问内存的指令时,地址变换硬件逻辑
自动将指令中的相对地址与重定位寄存器中的值相加,
再根据和值作为内存的绝对地址去访问该单元的数据。
由此可见,动态重定位是在指令执行过程中动态进行,
这样可以带来两个好处:⑴目标程序装入内存时无需任
何修改,所以装入之后再移动也不会影响其正确运行,
这便于存储器用紧缩来解决存储器的碎片问题。⑵一个
程序由若干个相对独立的目标模块组成时,每个目标模
块各装入一个存储区域,这些存储区域可以不相领接,
只要各个模块有自己对应的重定位寄存器就可以了。
3.链接
静态链接 (static-linking)
返回
静态链接是在生成可执行文件时进行的。在目标模块中记录符
号地址 (symbolic address),而在可执行文件中改写为指令直接使用的
数字地址。
Module A
call "function1"
0
L-1
Module B
0
M-1
function1(){
...
}
"function1"
F
Module A
call L+F
0
L-1
Module B
L
L+M-1
function1(){
...
}
"function1"
L+F
动态链接 (dynamic-linking)
?优点
?共享,多个进程可以共用一个 DLL,节省内存,减少文件交换。
?部分装入,一个进程可以将多种操作分散在不同的 DLL中实现,
而只将当前操作相应的 DLL装入内存。
?便于局部代码修改,即便于代码升级和代码重用;只要函数的
接口参数(输入和输出)不变,则修改函数及其 DLL,无需对
可执行文件重新编译或链接。
?便于运行环境适应,调用不同的 DLL,就可以适应多种使用环
境和提供不同功能。如:不同的显示卡只需厂商为其提供特定
的 DLL,而 OS和应用程序不必修改。
?缺点:
?链接开销,增加了程序执行时的链接开销;
?管理开销,程序由多个文件组成,增加管理复杂度。
在 装入或运行 时进行链接。通常被链接的共享代码称为动态链接库
(DLL,Dynamic-Link Library)或共享库 (shared library)。
(二)连续分配存储方式
( 1) 单一连续分配
这是一种最简单的存储管理方式,但只能用于单用户、单任务
的操作系统,如在 8位和 16位微机上 CP/M和 MS-DOS操作系统。
它将内存分为两个区:
?系统区:仅供操作系统使用,通常设置在内存的低段;
?用户区:指除系统区以外的全部内存空间,提供给用户使用。
这种存储分配方式由于用在单用户、单任务的操作系统中。 地址
映射和 存储保护措施 如下图 。
用户程序
位于 RAM 中的
操作系统
0 xFFF,..
0
位于 RAM 中的
操作系统
用户程序
0
R OM 中的
设备驱动程序
用户程序
位于 RAM 中的
操作系统
0
单一连续区存储管理
连续分配存储方式 -1
界限寄存器 重定位寄存器 (基址 )
+CPU <


地址错
逻辑地址 Y
N 物理地址
(2) 固定分区 (Fixed Partitioning)分配
固定式分区是在作业装入之前,内存就被划分成若干
个分区。划分工作可以由系统管理员完成,也可以由操
作系统实现。然而一旦划分完成,在系统运行期间不再
重新划分,即分区的个数不可变,分区的大小不可变,
所以,固定式分区又称为静态分区。
这种分区方式一般将内存的用户区域划分成大小不等的
分区,以适应不同大小的作业的需要。系统有一张分区
说明表,每个表目说明一个分区的大小、起始地址和是
否已分配的使用标志。分区说明表和 内存分配图 如下所
示。
固定分区分配 -1
区号 大小 起址 标志
1 16KB 20K 已分配
2 32KB 36K 已分配
3 64KB 68K 已分配
4 124KB 132K 未分配
(a) 分区说明表
固定式分区实现技术简单
,但是内存的利用率不高,
适用于作业的大小和多少事
先都比较清楚的系统中。它
用于 60年代的 IBM-360的 MFT
操作系统中。
0k:
20k:
36k:
68k:
132k:
256k:
内存分配图
操作系统
作业 A( 16k)
作业 B( 26k)
作业 C( 56k)
第 1分区( 16kb)
第 2分区( 32kb)
(已分配)
第 3分区( 64kb)
( 已分配)
4分区( 124kb )
( 未分配)
Multiprogramming with Fixed Partitions
?Fixed memory partitions
?separate input queues for each partition
?single input queue
( 3)动态 /可变式
(Dynamic Partitioning)分区分配
可变式分区是指在作业装入内存时, 从可用的内存中划出
一块连续的区域分配给它, 且分区大小正好等于该作业的大
小 。 可变式分区中分区的大小和分区的个数都是可变的, 而
且是根据作业的大小和多少动态地划分, 因此又称为动态式
分区 。 这种存储管理技术是固定式分区的改进, 既可以获得
较大的灵活性, 又能提高内存的利用率 。
可变式分区的分配和释放的基本思想是:在分配时, 首
先找到一个足够大的空闲分区, 即这个空闲区的大小比作业
要求的要大, 系统则将这个空闲分区分成两部分:一部分成
为已分配的分区, 剩余的部分仍作为空闲区 。 在回收撤除作
业所占领的分区时, 要检查回收的分区是否与前后空闲的分
区相领接, 若是, 则加以合并, 使之成为一个连续的大空间 。
Example Dynamic
Partitioning
Operating
System
Process 1 320 K
Process 2
Process 3
224 K
288 K
64 K
Operating
System
Process 1 320 K
Process 3
224 K
288 K
64 K
Operating
System
Process 1 320 K
Process 3 288 K
64 K
Process 4 128 K
96 K
Example Dynamic
Partitioning
Operating
System
320 K
Process 3 288 K
64 K
Process 4 128 K
96 K
Operating
System
Process 3 288 K
64 K
Process 4 128 K
96 K
Process 2 224 k
96 K
动态 /可变式分区分配 -1
1。可变式分区数据结构
?空闲区表形式
空闲分区表为每个尚未分配的分区设置一个表项,包括分区
的序号、大小、始址和状态。
?空闲区链形式
为了实现对空闲分区的分配和链接,在每个分区的起始部分,
设置一些用于控制分区分配的信息(如分区的大小和状态位),
以及用于链接其它分区的前向指针;在分区尾部,则设置了一
个后向指针,为了检索方便也设置了控制分区分配的信息。然
后,通过前、后向指针将所有的分区链接成一个双向链表。
可变式分区数据结构图表
序号 P大小 起址 状态
1 48k 116k 空闲
2 252k 260k 空闲
3 — — 空表目
4 — — 空表目
5 — — 空表目
( a) 空闲分区表
0k:
20k:
52k:
116k:
164k:
260k:
512k:
( c) 内存分配图
操作系统
作业 1( 32k)
作业 2( 64k)
空闲区 ( 48k)
作业 4( 96k)
空闲区 ( 252k)前向

针N+
2
0
0 后


针N+
2
0
0
N个字可用
( b )空闲链结构
2。分区分配 算法 (Partitioning Placement Algorithm)
最佳适应算法 ( Best Fit), 它从全部空闲区中找出能满足
作业要求的, 且大小最小的空闲分区, 这种方法能使碎片
尽量小 。 为适应这种算法, 空闲分区表 ( 空闲区链 ) 中的
空闲分区要 按大小 从小到大进行排序, 自表头开始查找到
第一个满足要求的自由分区分配 。 该算法 保留大的空闲区,
但造成许多小的空闲区 。
首次适应算法 ( First Fit), 从 空闲分区表 的第一个表目起
查找该表, 把最先能够满足要求的空闲区分配给作业, 这
种方法目的在于减少查找时间 。 为适应这种算法, 空闲分
区表 ( 空闲区链 ) 中的空闲分区要按地址由低到高进行排
序 。 该算法 优先使用低址部分空闲区, 在低址空间造成许
多小的空闲区, 在高地址空间保留大的空闲区 。
分区分配 算法 -1
循环首次适应算法 (Next Fit),该算法是首次适应算法的变种 。
在分配内存空间时, 不再每次从表头 ( 链首 ) 开始查找,
而是从上次找到的空闲区的下一个空闲 开始查找, 直到找
到第一个能满足要求的的空闲区为止, 并从中划出一块与
请求大小相等的内存空间分配给作业 。 该算法能使内存中
的空闲区分布得比较均匀 。
最坏适应法,从所有未分配的分区中挑选最大的且大于和等
于作业大小的分区分给要求的作业; 空闲 分区按大小由大
到小排序 。 该算法使 小的空闲区减少, 但造成大的空闲区
不够大 。
Last
al l oc ate d
blo c k (1 4K )
Be for e
Afte r
8 K 8 K
12 K 12 K
22 K
18 K
6 K 6 K
8 K
8 K
14 K 14 K
6 K
2 K
36 K
20 K
Ne xt F i t
F r e e bl oc k
All oc ate d blo c k
Be st F i t
F i r st F i t
例,分配一个
16KB分区
3。 UNIX Ⅵ 分配 回收算法(采用 空闲分区表 结构和 首次适应算法)
? UNIX空闲分区表 数据结构
空闲分区表中的空闲分区要 按 地址从低
到高连续排序,最后一个空闲分区中
m_size为 0表示以上表目空白。空闲分
区表起始地址为 coremap
分配和释放的基本思想是:在分配时,
首先找到一个足够大的空闲分区,即这
个空闲区的大小比作业要求的要大,系
统则将这个空闲分区分成两部分:一部
分成为已分配的分区,剩余的部分仍作
为空闲区。在回收撤除作业所占领的分
区时,要检查回收的分区是否与前后空
闲的分区相领接,若是,则加以合并,
使之成为一个连续的大空间。
m_addr
m_size
…,.
m_addr
m_size=0
…,..
m_addr
m_size
m_addr
m_size
m_addr
m_size
m_addr
m_size
Coremap
?UNIX 分配 算法框图
申请分配一个 u.size大小的分区
从头开始查表
是否检索完毕? 本次无法分配
m.size>u.size
m.size-u.size≤size?
从 该 分 区 中 划 出
u.size大小的分区
继续检索下一个表项
将该表目以上的所
有表目下移一格
将该分区分配给申请者
修改有关的数据结构
返 回
Y
N
N
?UNIX 回收算法
当一个作业运行完毕释放内存时,系统根据释放区的首地址,从空
闲区说明表中找到相应的插入点,此时可能出现下列四种情况(如
下图 所示,其中 F1,F2表示回收区的前、后空闲区),
?当回收区既不与 F1领接,又不与 F2领接时(如 A), 应为回收区单
独建立一项新表目,填写回收区的起址和大小,并根据其起址,插
入到空闲区说明表的适当位置。
?当回收区只与插入点的前一个分区 F1相领接时(如 B),应将回收
区与插入点的前一个分区合并,不再为回收区分配新的表目,而只
需修改 F1分区表目的大小 m_size即可。
?当回收区只与插入点的后一个分区 F2相领接时(如 C),将把两个
空闲区合并,修改 F2分区的表目,把回收区的起址作为新空闲区的
起址,大小为两个分区之和。
UNIX 回收算法
? 当回收区与插入点的前, 后两个分区 ( F1和 F2) 都相领接时 ( 如
D), 合并三个分区, 用 F1表目的起址作为新空闲区的起址, 修改
其大小为三块分区之和, 最后取消 F2的表目 。
A B C D F1
回收区
F2
回收区
F2
回收区
F1
回收区
UNIX 回收算法
后空闲区 邻
C

B

D

A
前空闲区 不 邻 邻 不
表目 / / 减一 加一
后空闲区
首址
-size 撤消
后空闲区
大小
+size 撤消
前空闲区
首址 / /
前空闲区
大小
+size +size+后空闲
区大小
UNIX 回收算法框图
是否


是 否
将该表目以上的所有
表目上移一格, 并插
入新释放的可用区表

顺序地检索可用资源表
直至找到某表目的
m.addr>aa或 m.size=0
不是第一个表
目与前一可用
区相
邻?与后一可用分
区相邻且不为
空表
目?
把所释放的可用区
与前一分区合并
所释放的可用区
与一可用区合并
所释放可用
区的 size=0
与后一可

区 相邻

与后一可用区合并
将该表目以上的所
有表目下移一格返 回
mfree
是否
( 4)动态重定位分区分配
1。 拼接 /紧凑
可变式分区也有零头问题。在系统不断地分配和回收中,
必定会出现一些不连续的小的空闲区,称为外零头。虽然可
能所有零头的总和超过某一个作业的要求,但是由于不连续
而无法分配。解决零头的方法是拼接(或称紧凑),即向一
个方向(例如向低地址端)移动已分配的作业,使那些零散
的小空闲区在另一方向连成一片。分区的拼接技术,一方面
是要求能够对作业进行重定位,另一方面系统在拼接时要耗
费较多的时间。
2.动态重定位
实现紧凑所需的允许作业在运行过程中在内存中移动的技
术必须获得硬件支持。只有具有动态重定位硬件机构的计算
机系统,才有可能采取动态重定位可变分区多道管理技术,
系统的硬件包括重定位寄存器和加法器。
动态重定位分区分配
3,动态重定位分区分配算法
动态重定位分区管理中何时进行存储器紧缩有二种不
同的解决办法:
在某个分区被释放后立即进行紧缩,系统总是只有一个
连续的分区而无碎片,此法很花费机时。
当“请求分配模块”找不到足够大的自由分区分给用
户时再进行紧缩,这样紧缩的次数比上种方法少得多,
但表格管理复杂。采用此法的动态重定位分区分配算法
框图如下:
动态重定位分区分配 算法框图
N N
Y Y
请求分配
u.size分区
检索空闲分区链 ( 表 )
无法分配
返回
空闲分区
总和
≥ u.size
找到大于
u.size的可用
区否?
进行紧凑形成
连续空闲区
修改有关的
数据结构
按动态分区方式
进行分配
修改有关的
数据结构
返回分区号
及首址
(三 )覆盖与交换
(1)覆盖技术
1,覆盖的概念
为了能在小的内存空间中运行大的作业,许多机器
(如 PDP- 11,IBM- PC) 都采用了“覆盖”技术。 覆
盖 是指一个作业的若干程序段(或数据段)间,或者几
个作业的某些程序段间共享某主存空间。
覆盖技术通常与单用户连续分配、固定分区和可变分
区等存储管理技术配合使用。它不但用于用户作业的运
行中,而且还常用于操作系统本身的运行中。
覆盖技术
覆盖技术的基本概念可用下图来加以说明,一个作业由一个主程
序段 MAIN主若干程序/数据段组成,其调用关系如 a所示,我们把
树形关系中常驻内存的段 ―― 主程序段 MAIN叫根段,其余覆盖部
分分成层次,A0与 B0为一层,组成一个覆盖段 0,同理 A1,A2与 B1组
成覆盖段 1,在 A3和 A4组成覆盖段 2,同一时间内同一覆盖段的各程
序段(称为覆盖),只有一个覆盖在执行可被引用,它不能调用
同层中的其它覆盖。
如不采用覆盖技术,该作业要求 270K主存,采用覆盖技术后只
要求 160K主存。
覆盖技术
( a) (b)
MAIN
20K
A0
30K
B0
40K
A1
60K
A2
30K
B1
30K
A3
20K
A4
40K
覆盖段 0
40K
覆盖段 1
60K
覆盖段 2
40K
MAIN
A0
A1 A2
A3 A4
B1
B0
2.覆盖处理
?覆盖结构的输入
PDP- 11的 RSX- 22H提供覆盖描述语言 ODL来描述结构,
并构成覆盖描述文件,如上图用 ODL语言表示如下:
ROOT MAIN-( A0-( A1,A2-( A3,A4)),B0
-( B1,B2));
END
?覆盖数据结构
用户将覆盖描述文件随目标程序一起提交系统,系统
根据覆盖描述文件形成一个覆盖数据结构。该数据结构
对每个覆盖段有一个描述信息,它包括覆盖段号、覆盖
数、当前覆盖号、覆盖区始址、覆盖区长度、起始盘区
号等。系统根据覆盖调度程序和覆盖调度结构自动地将
各程序段装入运行。
( 2)交换(对换)技术
交换技术最早用在麻省理工学院的兼容分时系统 CTSS中,该系
统是单用户系统,所有用户都驻留在外存的后备队列中,每次只
调入一个作业进入内存运行,此作业的时间的时间片用完时,又
将该作业调至外存,再将后备队列中的一个作业调入内存运行一
个时间片。这是早期的简单分时系统,它采用早期的 交换 (调进
/凋出)来满足多个程序共享主存的需要。
1。多道程序环境下的对换
在多道程序环境下为了提高内存和 CPU的利用率,增加系统吞
吐量,系统中增设了对换,把内存中暂不能运行的进程调出到外
存上,以腾出足够的内存空间,把已具备运行条件的进程换入内
存。
UNIX早期已引入对换功能并一直保留至今,UNIX系统设置一个
对换进程完成以上功能。为了实现进程对换,系统必须能实现对
对换空间的管理,进程换入和进程换出等三项功能。
交换(对换)技术
2。对换空间的管理
外存分为文件区和对换区。文件区用户存放文件,对文件区管理
目标是提高文件存储空间的利用率,为此系统采用离散分散方式;
对换区用于存放从内存频繁换出的进程,它的管理目标是提高进程
换入换出速度,为此系统采用连续分配方式。
UNIX对换区采用空闲分区表和首次适应算法的动态分区管理,
类同早期内存管理。
3。进程的换出与换入
当内核发现内存不足时调用对换进程,对换进程检查驻留在内存的进
程,选择处于阻塞和睡眠状态的进程换出,如无则选择优先级低的
驻留内存时间长的处于就绪状态的进程换出。而当内存又空时对换
进程在对换区中选择换出时间长的处于就绪态的进程调入。
(四) 分页存储管理
( 1) 纯分页存储管理原理
1,分页
分页 存储管理是将一个进程的地址空间划分成若干个大小相等
的区域, 称为页, 相应地, 将内存空间划分成与页相同大小的
若干个物理块, 称为块或页框 。 在为进程分配内存时, 将进程
中的若干页分别装入多个不相邻接的块中 。
2。 地址结构
分页系统的地址结构如下图 所示, 它由两部分组成:前一部分为
页号 P; 后一部分为位移量 W,即页内地址 。 图中的地址长度为
32位, 其中 0~ 11位为页内地址 ( 每页的大小为 4K), 12~ 31
位为页号, 所以允许地址空间的大小最多为 1M个页 。
页号 P 位移量 W
31 12 11 0
纯分页存储管理原理 -1
3。页表
在将进程的每一页离散地分配到内存的多个物理块
中后,系统应能保证能在内存中找到每个页面所对应
的物理块。为此,系统为每个进程建立了一张页面映
射表,简称 页表 (如下图 所示 )。每个页在页表中占
一个表项,记录该页在内存中对应的物理块号。进程
在执行时,通过查找页表,就可以找到每页所对应的
物理块号。可见,页表的作用是实现从页号到物理块
号的地址映射。
纯分页存储管理原理 -2
0
1
2
3
0
1
2
3
4
5
6
7
用户程序 页 表 内 存
页号 块号
0 2
1 4
2 5
3 7
(2)地址变换机构
1。基本的地址变换机构
地址变换机构的基本任务是利用页表把用户程序中的逻辑地址变
换成内存中的物理地址,实际上就要将用户程序中的页号变换成
内存中的物理块号。为了实现地址变换功能,在系统中设置页表
寄存器,用来存放页表的始址和页表的长度。在进程未执行时,
每个进程对应的页表的始址和长度存放在进程的 PCB中,当该进
程被调度时,就将它们装入页表寄存器。在进行地址变换时,系
统将页号与页表长度进行比较,如果页号大于页表寄存器中的页
表长度,则访问越界,产生越界中断。如未出现越界,则根据页
表寄存器中的页表始址和页号计算出该页在页表项中的位置,得
到该页的物理块号,将此物理块号装入物理地址寄存器中。与此
同时,将有效地址(逻辑地址)寄存器中页内地址直接装入物理
地址寄存器的块内地址字段中,这样便完成了从逻辑地址到物理
地址的变换。
地址变换机构 -1
块号 5 块内地址 452
页 号 2 页内地址 452页表始址页表长度 ﹥
2
4
5
越界中断
页表寄存器 逻辑地址 2500
页号 块 号
01
2
物理地址 5572
5*1024+452
每页 1KB(1024)
地址变换机构 -2
(1)
逻辑地址 2500
页 号 =逻辑地址 /页大小 = 2500/1024=2
页内地址 =逻辑地址 mod 页大小 =2500 mod 1024=452
查页表 页 号 2 ? 块 号 5
物理地址 =块 号 * 页大小 +页内地址 = 5*1024+452 =5572
(2)
1KB 1024 400H 页内地址 =逻辑地址 - 该 页头地址
2KB 2048 800H 物理地址 =该 块 头地址 +页内地址
3KB 3072 C00H
4KB 4096 1000H
5KB 5120 1400H
6KB 6144 1800H
地址变换机构 -3
0 0 0 0 1 0
0 0 0 1 0 0
0 0 0 1 0 1
16-bit Logical Address 2500
6-bit page# 10-bit Offset
0 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0
0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0
16-bit Physical Address 5572
The position and function of the MMU
2。具有快表的地址变换机构
?如果页表存放在内存中, 则每次访问内存时, 都要先访
问内存中的页表, 然后根据所形成的物理地址再访问内
存 。 这样 CPU存一个数据必须访问两次内存, 从而使计
算机的处理速度降低了 1/2。
?为了提高地址变换的速度, 在地址变换机构中增设了一
个具有并行查询功能的特殊的高速缓冲存储器, 称为
,联想存储器, 或, 快表,, 用以存放当前访问的那些
页表项 。 此时地址变换过程为:在 CPU给出有效地址后,
地址变换机构自动地将页号送入高速缓存, 确定所需要
的页是否在快表中 。 若是, 则直接读出该页所对应的物
理块号, 送入物理地址寄存器;若在快表中未找到对应
的页表项, 则需再访问内存中的页表, 找到后, 把从页
表中读出的页表项存入快表中的一个寄存器单元中, 以
取代一个旧的页表项 。
具有快表的地址变换机构 -1
?由于成本的原因,快表不可能做得很大,通常只能存放
16~512个页表项。例如,在 Intel80486中有 32个。这对
中、小型作业来说,已可能把全部页表项放入快表中;
但对于大型作业来说,则只能将一部分页表放入快表中。
?由于对程序和数据的访问往往带有局限性,所以快表的
命中率可以达到 80%~ 90%。例如,假设检索联想存储
器的时间为 20ns,访问内存的时间为 100ns,访问联想
存储器的的命中率为 85%,则 CPU存取一个数据的平均
时间为 T=0.85*120+0.15*220=135ns,所以访问时间只
增加 35%。如果不引入联想存储器,其访问将延长一倍
(达 200ns)。
具有快表的地址变换机构 -2
0
1
2
2
4
5
越界中断
逻辑地址页表寄存器
页号 块号
块 号页 号
快 表 物理地址
页 表
页 号 页内地址页表始址 页表长度 ﹥
块号 块内地址





0 2
1 4
2 5
(3)两级页表机制
80386的逻辑地址有 232B,如 页面大小为 4KB( 212B),则
页表项达 1M个,每个页表项占用 4B,故每个进程的页表
占用 4MB内存空间,还要求是连续的,显然这是不现实的。
在 80386中,为了减少页表所占用的连续的内存空间,采
用了两级页表机制:基本方法是将页表进行分页,每个
页面的大小与内存物理块的大小相同,并为它们进行编
号,可以离散地将各个页面分别存放在不同的物理块中,
为此再建立一张页表,称为外层页表(页表目录),即
第一级页表,其中的每个表目是存放某个页表的物理地
址。第二级才是页表,其中的每个表目所存放的才是页
的物理块号。
两级页表机制
?两级页表系统将 32位逻辑地址空间的地址分成三段:其中, 页表目
录号 ( 外层页号 p1) 和页号 ( 外层页内地址 p2) 两项各占 10位, 偏
移量 ( 页内地址 d) 占 12位 。 每页的大小为 4KB。 由于物理块号和页
表的物理地址都占 4个字节, 使每页中包含 1024个页表项, 所以页
表目录和页表的大小也都是 4KB,即一页 。 在 80386中设置了一个外
层页表寄存器 ( CR3), 用于存放页表目录的基址 。 两级页表的逻
辑地址结构和 两级页表的 地址变换机构图如下:
返回
外层页号 p1 外层页内地址 p2 页内地址 d
外层页表寄存器 + + b d
31 22 21 12 11 0
外层页表 页表 物理地址
两级页表机制图
外层页 表
10
25
120
12
14
32
35
151
152
0
1
……
12
13
14
……
32
33
34
35
……
151
152
……
第 0页页表(物理块号 10) 内 存
0
1
2
0
1

1023
第 1页页表(物理块号 25)
0
1

1023
第 N页页表(物理块号 120)
0
1

1023
(五)分段存储管理
( 1) 分段存储管理方式的引入
1。 便于编程
通常用户常常把自己的作业按照逻辑关系划分成若干个
段, 每个段都有自己的名字, 且都从零开始编址, 这样,
用户程序再执行中可用段名和段内地址进行访问 。 例如:
LOAD 1,[A] | <D> 这条指令的含义是将分段 A中的 D单
元内的值读入寄存器 1。
2。 分段共享
在实现程序和数据的共享时, 常常以信息的逻辑单位为
基础, 而分页系统中的每一页只是存放信息的物理单位,
其本身没有完整的意义, 因而不便于实现信息的共享,
而段却是信息的逻辑单位, 有利于信息的共享 。
分段存储管理方式的引入 -1
3。分段保护
信息保护是对相对完整意义的逻辑单位(段)进行保护。
4。动态连接
通常一个源程序经过编译后所形成的若干个目标程序,还需再经过
链接,形成可执行代码后才能运行,这种在装入时进行的链接称为
静态链接。动态链接是指在作业运行之前,并不把几个目标程序段
都链接起来,而是先将主程序对应的目标程序装入内存并启动运行,
当运行过程中又需要调用某段时,再将该段(目标程序)调入内存
并链接起来。所以,动态链接是以段为基础的。
5。动态增长
在实际系统中,往往有些数据段会不断地增长,而事先却无法知道
数据段会增长到多大,分段存储管理方式可以较好地解决这个问题。
( 2)分段系统的基本原理
1。 分段
在分段存储管理方式中, 作业的地址空间被划分为若干
个段, 每个段是一组完整的逻辑信息, 如有主程序段,
子程序段, 数据段及堆栈段等, 每个段都有自己的名字,
都是从零开始编址的一段连续的地址空间, 各段长度是
不等的 。 分段系统的地址结构如下图 所示, 逻辑地址由
段号 ( 名 ) 和段内地址两部分组成 。 在该地址结构中,
允许一个作业最多有 64 K个段, 每个段的最大长度为 64
KB。
段 号 段 内 地 址
31 16 15 0
分段系统的基本原理 -1
2.段表
在分段式存储管理系统中,为每个段分配一个连续的分
区,而进程中的各个段可以离散地分配到内存中不同的
分区中。在系统中为每个进程建立一张段映射表,简称
为, 段表, 。每个段在表中占有一表项,在其中记录了
该段在内存中的起始地址(又称为, 基址, )和段的长
度,如下图所示。进程在执行中,通过查段表来找到每
个段所对应的内存区。可见,段表实现了从逻辑段到物
理内存区的映射。
内存空间
0
40k:
80k:
120k:
150k:
分段系统的基本原理 -2段表的作用图
作业空间
MAIN) =0
0 段 表
15K 段号 段长 基址
( X) =1 0
0 1
7K
( D) =2 2
0
8K 3
( S) =3
0
10K
15K 40K
7K 80K
8K 120K
10K 150K
( MAIN)
=0 15K
( X) =1
7K
( D) =2
8K
( S) =3
10K
3.地址变换机构
?
段号 段长 SL 基址
段表始址 段表长度
TL
段号 S 位移量 d
2 100

15K 40K
7K 80K
8K 120K
10K 150K 物理地址
120k+100
逻辑地址
越界中断段表寄存器
0
1
2
3
分段 地址变换机构 -1
16-bit Logical Address
4-bit Segment# 12-bit Offset
0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0
Process Segment Table
16-bit Physical Address
0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0
001011101110 0000010000000000
011110011110 0010000000100000 +
Length Base
地址变换机构 -1
?为了实现从逻辑地址到物理地址的变换功能,系统中设
置了段表寄存器,用于存放段表始址和段表长度。在进
行地址变换时,系统将逻辑地址中的段号 S与段表长度 TL
进行比较。若 S≥TL, 表示段号太大,访问越界,于是
产生越界中断信号;若未越界,则根据段表的始址和该
段的段号,计算出该段对应段表项的位置,从中读出该
段在内存中的起始地址,然后再检查段内地址 d是否超过
该段的段长 SL。 若超过,即 d≥SL, 同样发出越界中断
信号;若未越界,则将该段的基址与段内地址 d相加,得
要访问的内存物理地址。
ClCb
+
段号 S 段内地址 d
比较
比较
b + d
比较
段 表 快表
物理地址
段表始址寄存器 段表长度寄存器 逻辑地址
地址越界
d>=1
地址越界
地址越界
l b
S l b
.,.
d>=1
分段地址映射及存储保护机制
S>= Cl
Segmentation Hardware
4,分页和分段比较:
分 页 分 段
目的 为了 提高 内存 的 利
用率;
为了能更好地满足用户的需要。
页 / 段单
位 划分
页是 信息 的物 理 单
位,页的 大小 是 固
定的,而 且由 系 统
确定。
段是信息的逻 辑单位,它含有一组意义 相对完
整的信息。段的长度是不固定的,由用户确定。
作 业 地
址空间
单一 的线 性地 址 空

二维 的,标识 一个地址 需给 出段 名和段内 地
址。
内存 分

以页 架为 单位 离 散
分配,无 外碎 片,
所以也无紧缩问题
以段为单位离散分配,类同可变分区,会产生
许多分散的小自由分区――外碎片,造成主存
利用率低,需采用紧缩解决碎片问题,但紧缩
需化机时;
分页和分段比较 -1
分 页 分 段
共 享 和
存 取 访
问控制
在同一页面中包含 共
享的程序和私用的 数
据,使共享和存取 访
问控制困难;
便 于 共 享 段 逻 辑 上 完 整 信 息 共 享 有 价 值,
提 高 主 存 利 用 率 ; 便 于 控 制 存 取 访 问,
段 是 逻 辑 上 完 整 信 息 可 根 据 各 段 信 息 决
定存取访问权
动 态 连

不能动态连接; 提 供 动 态 连 接 的 便 利, 运 行 中 不 用 的 模
块可以不连接调入,节省内存空间
动 态 增

不能动态增长 便 于 处 理 变 化 的 数 据 结 构 段, 可 动 态 增

(3)共享
?段是信息的逻辑单位,因此分段系统的一个突出的优点是
易于实现段的共享。即允许若干个进程共享一个或多个
段,而且对段的保护也十分简单。在分页系统中,虽然
也能实现程序和数据的共享,但远不如分段系统来得方
便。分段系统中,每个进程的段表中设置一个段表项。
图是分段系统中共享 editor编辑程序的示意图。
?在实现段共享时,需要用到可重入代码 (Reentrant Code)
又称为, 纯代码, (Pure Code)。 它是一种允许多个进程
同时访问的代码,是一种不允许任何进程对其进行修改
的代码。但在每个进程中,配以局部数据区,将在执行
中可能改变的部分,拷贝到该数据区,这样,程序在执
行时,只对该数据区 (属于该进程私有 )中的内容进行修
改,而不去改变共享的代码,这时的可共享代码即成为
可重入代码。
共享 -1
段 表
段长 基址
160 80
40 240
editor
DATA1
editor
DATA2
段长 基址
160 80
40 380
editor
DATA1
DATA2
进程 1
进程 2
80
240
280
380
420
( 4) 段页式存储管理方式
分页和分段存储管理方式都各有其优缺点 。 如果对两种存储管理
方式, 各取所长, 后, 则可以形成一种新的存储管理方式的系统 —
— 段页式系统 。 这种新系统既具有分页系统能有效地提高内存利用
率的优点, 又具有分段系统能很好地满足用户需要的长处, 显然
是一种比较有效的存储管理方式 。
1,基本原理
段页式系统的基本原理是先将 整个主存划分成大小相等的存储块
( 页架 ), 把 用户程序 按程序的逻辑关系 分为若干个段, 并为每
个段赋予一个段名, 再把每个段划分成若干页, 以页架为单位离
散分配 。 在段页式系统中, 其地址结构由段号, 段内页号和页内
地址三部分组成, 作业地址空间的结构如图 下 所示 。
段号 ( S) 段内页号 ( P) 页内地址 ( W)
段页式存储管理方式 -1
在段页式系统中,为了实现从逻辑地址到物理地址的变
换,系统中必需同时配置段表和页表。由于将段中的页
进行离散地分配,段表中的内容不再是段的内存始址和
段长,而是页表始址和页表长度。下图说明了利用段表
和页表进行地址映射的过程。
段表、页表的作用
段表大小段表始址
段表寄存器
段号 状态 页表大小 页表始址
0 1
1 1
2 1
3 0
4 1
段 表
页号 状态 存储块号
0 1
1 1
2 1
3 0
4 1
页 表
页号 状态 存储块号
0 1
1 1
2 1
3 0
4 1
页 表
操作系统
主存
2.地址变换过程
?在段页式系统中, 有一个段表寄存器, 存放段表始址和段长 TL。
在进行地址变换时, 首先利用段号 S,将它与段长 TL进行比较 。
若 S< TL,表示未越界, 于是利用段表始址和段号求出该段对应
的段表项在段表中的位置, 从中得到该段的页表始址, 并利用
逻辑地址中的段内页号 P来获得对应页的页表项位置, 从中读出
该页所在的物理块号 b,再用块号 b和页内地址构成物理地址 。
下图 说明 了段页式系统中的地址变换机构 。
?在段页式系统中, 为了获得一条指令或数据, 需三次访问内存:
第一次访问内存中的段表, 从中取得页表始址;第二次访问内
存中的页表, 从中取出该页所在的物理块号, 并将该块号与页
内地址一起形成指令或数据的物理地址;第三次访问才是真正
根据所得的物理地址取出指令或数据 。 显然, 这使访问内存的
次数增加了近两倍 。 为了提高执行的速度, 在地址变换机构中
增设一高速缓冲寄存器 。 每次访问它时, 都同时利用段号和页
号去检索高速缓存 。
段页式系统的地址变换机构
段 表
01
2
3
+
页 表
0
1
2
3
段表始址 段表长度
+
段号 ( S) 段内页号 ( P) 页内地址 ( W)﹥
块 号 b 块内地址
越界中断段表寄存器
习题
1,静态重定位是在作业的﹎﹎ A﹎﹎ 中进行的, 动态重定位是在作业
的﹎﹎ B﹎﹎ 中进行的 。
A,B,( 1) 编译过程; ( 2) 装入过程; ( 3) 修改过程; ( 4) 执
行过程 。
2,在首次适应算法中, 要求空闲分区按﹎﹎ A﹎﹎ 顺序链接成空闲分
区链;在最佳适应算法中是按﹎﹎ B﹎﹎ 顺序形成空闲分区链;最
坏适应算法是按﹎﹎ C﹎﹎ 顺序形成空闲分区链 。
A,B,C,( l) 空闲区首址递增; ( 2) 空闲区首址递减; ( 3) 空
闲区大小递增; ( 4) 空闲区大小递减 。
习题 -1
3,在可变式分区分配方案中,某一作业完成后,系统收回其主存空
间,并与相邻空闲区合并,为此需修改空闲区表,造成空闲区表项
数减 1的情况是﹎﹎ A﹎﹎,造成空闲区表项数增 1的情况是﹎﹎ B﹎
﹎,造成空闲区表项数不变、某项的始址改变、长度增加的情况是
﹎﹎ C﹎﹎,造成空闲区表项数不变、某项的始址改变、长度不变
的情况是﹎﹎ D﹎﹎,造成空闲区表项数不变、某项的始址不变、
长度增加的情况是﹎﹎ E﹎﹎。
A,B,C,D,E:( 1) 无上邻(低址)空闲区,也无下邻(高址)
空闲区;( 2)有上邻(低址)空闲区,但无下邻(高址)空闲区;
( 3)有下邻(高址)空闲区,但无上邻(低址)空闲区;( 4)有
上邻(低址)空闲区,也有下邻(高址)空闲区;( 5)不可能的。
4,试述 UNIX Ⅵ 主存 管理的 数据结构和分配,回收原理。
5,详述在设有快表的分页存储管理系统中,一个虚地址转换成物理内
存地址的过程。
习题 -2
6.某系统采用页式存储器管理,页长为 1K(1024)字,某作业的地址空间
如图所示,主存大小为 10K,其中 0块和 1块为操作系统占用,该作业分
页后分别装入到主存的 2,4,8块中去,当前正在运行该作业 。
(1)请填写页表项,页 号 块 号
0 ﹎﹎ A﹎﹎
1 ﹎﹎ B﹎﹎
2 ﹎﹎ C﹎﹎
(2)作业装入主存时, 逻辑地址 400,1129,2468所给指令, 数据所在
的存储单元地址分别为 (400-D)+E,(1129-F)+G和 (2468-H)+I; 其
中﹎﹎ D﹎﹎, ﹎﹎ F﹎﹎ 和﹎﹎ H﹎﹎ 分别为三指令, 数据所在页
的页首地址;﹎﹎ E﹎﹎, ﹎﹎ G﹎﹎ 和﹎﹎ I﹎﹎ 分别为三指令,
数据所在存储块的块首地址 。
(3)试分析执行 JMP 3080后的情况为﹎﹎ J﹎﹎ 。
习题 -3
逻辑地址 作业的地址空间 存储单元地址
0 ┌───────┐
400│ MOV R0,2468 │(400 -D)+E
,│ │
1129│JMP 3080 │(1129 -F)+G
,│ │
2468│ 12468 │(2468 -H)+I
,│ │
3060└───────┘
A,B,C,(1)1 (2)2 (3)3 (4)4 (5)5 (6)6 (7)7 (8)8
(9)9 (10)0
D— I,(1)0 (2)1024 (3)2048 (4)3072 (5)4096 (6)5120
(7)6144 (8)7168 (9)8192 (10)9216
J,(1)跳到地址 3080的指令执行; (2)产生越界中断; (3)以上二者
都不是;
习题 -4
7,考虑一个分页系统,其页表存放在内存,
① 如果内存读写周期为 1.0us,则 CPU从内存取一条指令或一个操作数
需时间为﹎﹎ A﹎﹎ 。
② 如果设立一个可存放 8个页表表项的快表,80%的地址变换可通过快
表完成,内存平均存取周期为﹎﹎ B﹎﹎ (假设快表的访问时间可以
忽略不计 )。
A,B,(1)1.0μ s (2)1.1μ s (3)1.2μ s (4)1.3μ s (5)1.6μ s
(6)2.0μ s (7)3.0μ s
8,由固定分区方式发展为分页存储管理方式的主要推动力是﹎﹎ A﹎
﹎; 由分页系统发展为分段系统, 进而又发展为段页式系统的主要
动力分别是﹎﹎ B﹎﹎ 和﹎﹎ C﹎﹎ 。
A,B,C,( l) 提高内存利用率; ( 2) 提高系统吞吐量; ( 3) 满
足用户需要; ( 4) 更好地满足多道程序运行的需要 。 ( 5) 既满足
用户需要, 又提高内存利用率 。
9.段式存贮管理与页式存贮管理有什么异同?
习题 -5
4,试述段页式存贮管理系统地址变换机构和地址变换过程 。
5,试述 动态分区, 分页和分段三种存储管理方案中如何实现信息的
存储保护?