第四章 存储管理
4.1 程序的链接和装入
- 可执行程序:能够装入内存执行的程序
- 源程序->可执行程序:编译、链接和装入
4.1.1 逻辑地址和物理地址
- 逻辑地址
- 逻辑地址空间:一个目标模块(程序)或装入模块(程序)的所有逻辑地址的集合,称为逻辑地址空间或相对地址空间
- 物理地址:内存中实际存储单元的地址
- 物理地址空间:内存中全部存储单元的物理地址集合称为物理地址空间、绝对地址空间或内存地址空间
- 虚拟地址空间:
4.1.2 程序链接
- 修改模块的相对地址
- 转换外部调用符号
- 对于模块的链接,有以下三种方式
- 静态链接
- 装入时链接
- 运行时动态链接
4.1.3 程序装入
- 程序装入
- 程序装入:装入程序根据内存当前的实际使用情况,将程序(可装入模块)装入到合适的物理位置
- 地址映射、地址转换或地址重定向:将程序中出现的逻辑地址都转换为计算机能够直接寻址的内存物理地址
- 根据装入时间不同,可以分为:
- 运行前静态装入
- 运行时动态装入
- 静态重定位(一般由软件完成)
- 静态重定位(静态地址转换)是指装入程序将全部程序(所有可装入模块)装入到内存适当的位置后,在该程序装入内存时或运行之前,一次性地将程序中凡涉及访存地址的指令其访存地址按下面的公式全部由相对地址(逻辑地址)转换为绝对地址(物理地址),并在程序运行过程中不再改变。
- 绝对地址=相对地址+程序存放的内存起始地址
- 优点:简单、容易实现、不需要增加任何硬件设备
- 缺点:
- 无法实现内存重新分配。内存的利用率不高
- 如果内存提供的物理存储空间无法满足当前程序代码和数据的存储容量,则必须由用户在程序设计时,采用某种方法来解决存储空间不足的问题,增加了用户的负担
- 不利于用户共享存放在内存中的同一个程序
- 静态重定位(静态地址转换)是指装入程序将全部程序(所有可装入模块)装入到内存适当的位置后,在该程序装入内存时或运行之前,一次性地将程序中凡涉及访存地址的指令其访存地址按下面的公式全部由相对地址(逻辑地址)转换为绝对地址(物理地址),并在程序运行过程中不再改变。
- 动态重定位(需要硬件支持——地址转换机构)
- 动态重定位:无论将程序一次性装入内存,还是在程序运行中动态装入各目标模块( 或虚拟存储器中动态装入程序的分页和分段)到内存,都不立即进行逻辑地址到物理地址的转换,地址的转换工作是在程序执行中进行的,即当执行的指令涉及访存地址(此时为逻辑地址)时再进行地址转换
- 地址转换机构:基址寄存器(BR)、程序逻辑地址寄存器(VR)
- 绝对地址=(BR)+(VR)
- 优点:
- 可以给同一进程的不同程序段分配不连续的内存区域
- 构成了虚拟存储器得到基础
- 有利于程序段的共享
- 缺点:
- 需要硬件支持
- 实现存储管理的算法比较复杂
4.2 存储器及存储管理的基本功能
- 内存管理的目标
- 地址保护
- 地址无关
- 存储管理的四个基本功能
- 内存空间的分配与回收
- 实现地址转换
- 内存空间的共享与保护
- 内存空间的扩充
4.2.1 多级存储体系
- 寄存器->高速缓存(cache)->内存->外存
4.2.2 内存的分配与回收以及地址转换
- 内存空间的分配与回收
- 内存分配的功能:制定分配策略、构造分配用的数据结构、相应用户程序的内存分配请求和回收用户程序释放的内存区
- 为了有效、合理地使用内存,在设计内分配与回收算法时,需要考虑以下问题
- 数据结构
- 放置策略
- 调入策略
- 淘汰策略
- 地址转换(地址重定位)
- 编程或编译时产生绝对地址
- 静态地址转换(静态重定位)
- 动态地址转换(动态重定位)
4.2.3 内存的共享、保护以及扩充
- 内存空间的共享和保护
- 共享
- 代码共享:多个进程运行内存中的同一个程序代码段
- 数据共享
- 存储保护
- 界地址保护
- 上下界保护和地址检查机构
- 基址、限长寄存器和动态地址转换机构
- 存储键保护
- 界地址保护
- 共享
- 内存空间的扩充
- 将当前需要使用的部分程序和数据放入内存,而将暂不使用的部分程序和数据暂存于外存,当需要的时候再交换(与内存中已使用过的部分程序和数据交换其存储位置)到内存
- 控制程序和数据在内存、外存之间交换的基本方式
- 用户程序自己控制方式
- 操作系统控制方式
- 交换方式
- 请求调入方式
- 预调入方式
4.3 分区式存储管理(对内存连续分配)
4.3.1 单一连续分区存储管理
- 实现原理
- 将内存空间分为系统区和用户区两部分。系统区仅供操作系统使用,通常放在内存的低地址部分;系统区以外的就是用户区,提供给用户使用
- 分配与回收
- 地址转换与存储保护
- 地址转换
- 静态重定位
- 动态重定位
- 地址转换
- 单一连续分区的优缺点
- 优点
- 管理简单,开销小
- 安全性高
- 不需要硬件支持
- 缺点
- 不支持多用户
- 程序的地址空间受用户区空间大小限制
- 造成系统资源的浪费
- 优点
4.3.2 固定分区存储管理
- 实现原理
- 将内存系统区之外的用户空间划分为若干个固定大小的区域,每个区域称为一个分区并可装入一个用户程序运行
- 分区划分——一般由系统操作员或操作系统决定
- 分区大小相等
- 优点:管理简单
- 缺点:缺乏灵活性
- 分区大小不等
- 分区大小相等
- 内存空间的分配与回收
- 数据结构
- 内存分区分配表:分区号、起始地址、大小和状态
- 内存空间分配
- 程序进入分区有两种排队策略
- 每个程序被调度程序选中时,就将其排到一个能够装入它的最小分区号(不管该分区是否空闲)等待队列中,但这种策略在等待处理的程序大小很不均匀时,会出现有的分区空闲而有的分区忙碌
- 所有等待处理的程序排成一个队列,当调度其中一-个程序进入内存分区时,则选择可容纳它的最小空闲分区,分配给它以充分利用内存
- 程序进入分区有两种排队策略
- 内存空间回收
- 数据结构
- 地址转换和存储保护
- 静态重定位
- 存储保护
- 固定分区分配的优缺点
- 优点
- 简单易行
- CPU利用率高
- 缺点
- 容易造成内部碎片
- 限制了系统中能够并发执行的程序(进程)数量
- 优点
4.3.3 可变分区存储管理
- 实现原理
- 在程序运行时根据程序对内存空间的需要,动态的建立内存分区
- 数据结构
- 已分配分区表
- 空闲分区表
- 空闲分区链
- 分配算法
- 首次适应算法
- 最佳适应算法
- 最差适应算法
- 分配与回收
- 回收区与上下两个空闲分区相邻
- 回收区与上空闲区相邻
- 回收区与下空闲区相邻
- 回收区上下都没有相邻的空闲区
- 地址转换与存储保护
- 地址转换——动态重定位
- 存储保护
- 碎片问题
- 内部碎片
- 外部碎片
4.3.4 覆盖与交换技术
- 覆盖技术
- 覆盖段:可以相互覆盖的程序段
- 覆盖区:把可供共享的内存区
- 优点:
- 覆盖技术打破了必须将一个程序的全部信息装入内存后才能运行的限制,在一定程度上,解决了小内存运行大程序的矛盾
- 缺点
- 对用户不透明,编程时必须由用户划分程序模块以及确定程序模块之间的覆盖关系,这无疑增加了用户的负担
- 交换技术
- 主要特点
- 打破了一个程序一旦进入内存,就一直驻留在内存直到运行结束的限制
- 以交换的单位来划分
- 进程交换(矜持对换)/整体交换(整体对换)——以进程为单位交换
- 适用于分时系统
- 主要解决内存紧张问题
- 页置换(页交换或页对换)——以页或段为单位交换
- 广泛应用于现代操作系统中
- 实现虚拟存储器的基础
- 进程交换(矜持对换)/整体交换(整体对换)——以进程为单位交换
- 交换完全有操作系统实现,不要求用户做特殊的工作,整个交换过程对用户来说是透明的
- 主要特点
4.4 分页存储管理
4.4.1 分页存储管理的基本原理
- 实现原理
- 在分页存储管理中,一个程序的逻辑地址空间被划分成若千个大小相等的区域,每个区域称为页或页面,并且程序地址空间中所有的页从0开始顺序编号。相应地,内存物理地址空间也按同样方式划分成与页大小相同的区域,每个区域称为物理块或页框,与页一样内存空间中的所有物理块也从0开始顺序编号。在为程序分配内存时,允许以页为单位将程序的各个页,分别装入内存中相邻或不相邻的物理块中
- 页内碎片——由于程序的最后一页往往不能装满分配给它的物理块,于是会有一定程度的内存空间浪费
- 分页系统中页的大小取决于机器的地址结构,一般设置为2的整数幂,通常为512B~8KB
- 逻辑地址结构
- 一维逻辑地址=页号*页长+页内地址
- 数据结构
- 页表
- 操作系统为每个程序(进程)都建立一张页映射表,简称页表
- 用来存储页号及其映射的内存物理块号
- 内存分配表
- 页表
4.4.2 分页管理的地址转换与存储保护
- 地址转换
- 物理地址=物理块号*页长+页内地址
- 具有快表的地址转换
- 联想存储器
- 页的共享和保护
- 页的共享
- 数据共享
- 程序共享
- 页的保护
- 一是在逻辑地址转换成物理地址时的保护,通过页号与页表长度的比较防止地址越界
- 二是在实现信息共享时,对共享信息的保护
- 页的共享
4.4.3 两级页表和多级页表
- 两级页表
- 外层页号
- 内层页号
- 页内地址
- 多级页表和倒置页表
- 多级页表
- 倒置页表
4.4.4 内存物理块的分配与回收
- 分页存储的优缺点
- 优点
- 分页存储管理并不要求各个页之间连续存储,从而实现了离散存储
- 避免外部碎片的产生,增大了分配的灵活性,提高了内存空间的利用率
- 为以后在虚拟存储器中实现程序的“部分装入、部分对换”奠定了基础
- 缺点
- 当内存很大时,通过位示图来记录内存使用情况会占用较大的内存空间,当程序很大时,通过页表来记录程序的内存分配情况也会占用较大的内存空间
- 分页存储管理方法要求有相应的硬件支持,如需要地址转换机构和快表等,因此增加了计算机的成本和系统开销
- 分页存储管理虽然消除了外部碎片,但页内的内部碎片依然存在
- 分页破坏了程序的完整性,这给程序的共享、动态链接等技术的实现带来了困难
- 优点
4.5 分段存储管理
4.5.1 分段存储管理的基本原理
- 实现原理
- 在分段存储管理中,系统将程序的逻辑地址空间分成若干个逻辑分段,如主程序段、子程序段、数据段和工作区段等,每个分段都是一组逻辑意义完整的信息集合,且有各自的段名或段号,即在逻辑上是各自独立的。每个段都是从0开始编址的一维连续地址空间,其长度由段自身包含的逻辑信息长度决定,所以各段的长度可以不同,整个程序的所有段则构成了二维地址空间。在为程序分配内存时,允许以段为单位将程序离散地装入相邻或不相邻的内存空间中,而每个段则占用一段连续的内存区域,系统通过地址转换机构,将段的逻辑地址转换为实际的内存物理地址,从而使程序能够正确执行
- 逻辑地址机构
- 段表
4.5.2 分段存储管理的地址转换与存储保护
- 地址转换
- 分段共享
- 数据结构
- 共享段的分配与回收
- 分段保护
- 段越界检查
- 存取控制检查
4.5.3 分段存储管理的优缺点
- 分段与分页比较
- 分段的优缺点
- 优点
- 信息共享
- 动态增长
- 动态链接
- 便于实现存取访问控制
- 缺点
- 需要硬件支持
- 存在外部碎片
- 缺段中断处理以及允许段的动态增长会给系统增加难度和开销
- 优点
4.6 段页式存储管理
4.6.1 段页式存储管理的基本原理
- 各段之间按分段存储管理进行分配,每个段内部则按分页存储管理进行分配
- 首先,根据程序自身的逻辑结构,运用分段存储管理的思想,把程序的逻辑地址空间划分为若干个段,每个段有各自的段名或段号
- 然后,再依据分页存储管理的方法,在每个段内按页的大小,将该段划分为不同的页,段内的这些页从0开始顺序编号。内存空间的管理则只按页的大小划分为若千个的物理块,并且内存中所有物理块从0开始顺序编号
- 逻辑地址结构
- 数据结构
4.6.2 段页式存储管理的地址转换与特点
- 地址转换
- 段页式存储管理的优缺点
- 优点
- 因为以页为单位分配内存,所以无紧凑问题,也不存在外部碎片
- 便于处理变化的数据结构,段可以动态增长
- 便于共享,只需将程序的段表中相应表项指向该共享段在内存中的页表始址即可
- 因具有段的特点,所以便于提供动态链接
- 因具有段的特点,所以便于控制存取访问。
- 缺点
- 增加了硬件成本,需要更多的硬件支持
- 增加了系统开销和软件复杂性,如地址转换过程需多次访问内存
- 空间浪费比分页管理多,程序各段的最后一页都有可能浪费一部分空间(仍然存在页内碎片),另外段表和页表所占的内存空间都比分页和分段存储管理多
- 优点
4.7 虚拟内存管理
4.7.1 虚拟存储器的概念
- 程序局部性原理
- 时间局部性
- 空间局部性
- 实现虚拟存储器的条件
- 能够完成虚拟地址到物理地址的转换
- 实际内存空间
- 外存交换区
- 换入、换出机制
- 虚拟存储器的特征
- 离散型
- 多次性
- 对换性
- 虚拟性