存储器管理
1、存储系统的结构
基本概念
- 逻辑地址
- 用户程序经过汇编或编译后形成目标代码。
- 目标代码采用相对地址(首地址为
0
)。 - 不能用逻辑地址在内存中读取信息。
- 物理地址
- 内存中存储单元的地址。
- 可直接寻址。
- 名空间
- 高级语言的源程序,存在于符号名字空间。
- 地址空间
- 是逻辑地址的集合。
- 由编译程序生成。
- 存储空间
- 主存中物理单元的集合。
- 单元的编号就是物理地址。
- 大小由主存实际容量决定。
- 一个编译好的目标程序存在于它自己的地址空间中,运行时才装入存储空间。
2、程序的装入和链接
- 编辑->编译->链接->装入->运行。
程序的装入
绝对装入方式
- 编译程序产生绝对地址的目标代码。
- 逻辑地址与实际内存地址完全相同。
可重定位装入方式
- 引入原因
- 目标模块得到的是相对地址,与实际的物理地址不同。
- 装入内存时,相对地址需要做出修改以得到实际的物理地址。
静态重定位
- 装入内存时一次完成的,之后不能改变。
- 物理地址=逻辑地址+内存中的起始地址。
动态重定位
- 利用重定位寄存器(
RR
)。- 取决于作业分配到的存储空间起始地址。
程序的连接
静态链接
- 将目标模块和所需库函数,链接成一个完整的装入模块。
- 需要解决问题
- 修改相对地址
- 变换外部调用符号
- 存在问题
- 不方便对目标模块修改和更新。
- 无法对目标模块的共享。
动态链接
装入时动态链接
- 装入内存时再链接。
- 优点
- 便于版本修改和更新。
- 实现共享。
运行时动态链接
- 运行时,发现调用的模块尚未装入,由操作系统去找并且装入。
- 优点
- 装入快
- 节省内存
3、连续分配方式
- 为用户程序分配一个连续的内存空间。
单一连续分配
- 系统区
- 用户区
分区目的:保护内核。
固定分区
- 有
n
个分区,可同时装入n
个作业/任务。 - 分区大小
- 不相等时,利用率更高。
- 内存分配
- 分区按大小排序。
- 特点
- 简单
- 有碎片(内零头)
可变式分区
数据结构
- 空闲分区表
- 空闲分区链
顺序分配法
首次适应算法FF
- 方法
- 每次链首开始,找到满足大小的空闲分区。
- 特点
- 有外零头,低地址用得频繁,高地址保留大分区。
循环首次适应
- 方法
- 从上次分配分区的下一个分区开始查找。
- 特点
- 提高了查找速度。
- 缺乏大的空闲分区。
最佳适应算法BF
- 要求
- 分区按大小递增排序,释放时也满足该条件。
- 方法
- 从小分区开始找空余最小的分区。
- 特点
- 单次最优,总体未必。
最坏适应算法
- 方法
- 总是选择最大的分区来分割分配。
- 特点
- 缺乏大的空闲分区。
- 查找效率高。
分区分配
书p4-8
基于索引搜索的动态分区分配算法
快速适应算法(不考)
略
伙伴系统
- 方法
- 内存块的大小为
2^k
。 - 空闲分区按照大小链接为一个双向空闲链表。
- 内存块的大小为
- 优点
- 分配回收内存快,不会产生很多小碎片。
- 缺点
- 产生内部碎片。
可重定位分区分配
动态重定位的引入
- 内零头
- 分配给作业,但作业不需要的部分。
- 外零头
- 太小无法分配给任何作业。
- 紧凑
- 分散的小分区合并成一个大分区。
动态重定位的实现
- 重定位寄存器
4、对换
- 把内存中暂时不能运行的进程或程序/数据,调出到外存。
对换实现
- 实现三方面的功能
- 对换空间的管理
- 进程的换入换出
5、基本分页存储管理方式
- 连续分配会产生内/外零头。
- 离散分配让程序在内存中不一定连续存放。
分页存储管理
- 页
- 将进程的逻辑地址空间分成若干个大小相等的片。
- 块(页框)
- 把内存空间分成与页面大小相同的若干个存储块。
进程调度时,必须一次性装入所有页。
基本方法
- 页表
- 通过页号和块号的对应,建立程序空间到内存空间的映射。
页面大小
- 通过页号和块号的对应,建立程序空间到内存空间的映射。
- 太小
- 内存碎片减小。
- 页表过长。
- 太大
- 和太小相反。
- 标准应该是
2
的幂。
s i z e ∈ [ 512 B , 8 K B ] size\in [512B,8KB] size∈[512B,8KB]
空间组织
数据结构
- 页表
- 每个进程拥有一个页表,放在
PCB
中。 - 存放在主存的系统专用区中,只有系统有权访问。
- 每个进程拥有一个页表,放在
- 作业表
- 整个系统只有一张。
- 记录作业的页表情况。
- 空闲块表
- 整个系统只有一张。
- 记录主存当前空闲块。
组织结构
地址变换(重要)
- 页表寄存器
PTR
- 存放进程的页表在内存中的起始地址。
- 该进程的页表长度。
示意图
地址变换过程
- 将有效地址(相对地址)分为页号和页内地址两部分。
快表
- 保存当前进程最近访问过的页表项。
两级和多级页表
二级页表
- 为之建立二级页表,记录被分割的各个页面存储在哪些块中。
多级页表
- 就是 多级。
6、分段存储管理方式
原因
- 方便编程
- 信息共享
- 信息保护
- 动态增长
- 动态链接
原理
分段
- 作业地址空间按逻辑信息的完整性被划分为多个段。
- 每段有段名(段号),从
0
开始编址。 - 段内地址空间是连续的。
- 一个作业最大
64K
个段,每个段最大为64KB
。 - 分段管理
- 管理若干分段组成的作业,按分段来进行存储分配。
段表
- 每个分段分配一个连续的分区。
- 每个进程建立一张段表(放在内存中),每个段占有一个表项,表项纪录该段在内存中的起始地址和段长度。
- 可实现从逻辑段到物理内存区的映射。
地址变换机构
信息共享
- 分页系统程序段共享困难。
- 分段易于实现段的共享和保护。
分页共享
- 程序和数据没有分开。
分段共享
段页式存储管理方式
- 分页内存管理效率高,没有外零头,内零头小。
- 分段符合模块化。
段页式存储
- 先将用户程序分段,每段划分为若干页,每段有段名。
- 段表、段内页表
地址变换方式
- 从段表寄存器获得进程的段表起始地址,从而找到段表。
- 找到段表中的页表起始地址,找到页表。
- 根据指定页号,在页表中找到块号。
- 用块号加上页内偏移量,形成物理地址。
分页和分段区别
- 页是信息的物理单位。
- 段是逻辑单位。
- 页的大小固定
- 段长度不固定,取决于用户程序
- 分页的作业地址空间是一维的
- 分段的作业地址空间是二维的
- 分段比分页更利于信息的共享和保护。
习题
题目一
题目二
题目三