第三章 内存管理
内存的基础知识
什么是内存,有何作用
几个常用的数量单位
指令工作原理
装入的三种方式–绝对装入
- 灵活性最差,换台电脑可能就不行了
装入的三种方式–可重定位装入
- 运行期间不能再移动程序,也不能再申请空间
装入的三种方式–动态运行时装入
从写程序到程序运行
- 链接的定义
链接的三种方式
知识点小结
- 这里讨论的关于逻辑地址和物理地址,指的是,指令中包含操作码和操作参数,操作参数里的地址问题,不是指令本身的地址
- 三种装入方式和三种链接方式,别搞混了;
- 装入方式是关于逻辑地址转成物理地址的
- 链接方式是将编译后的若干个目标模块和所需库函数链接在一起
内存管理的概念
操作系统如何对内存进行管理
内存空间的分配与回收
- 知识点比较多,后面再详细探讨
内存空间的扩展
- 虚拟技术,把物理上很小的空间扩展为逻辑上很大的空间
地址转换
- 逻辑地址转为物理地址,即三种装入方式
内存保护
- 让各个进程只能访问自己的内存空间
- 两个方案
知识点小结
覆盖与交换
覆盖技术
覆盖技术举例
- 这里举例的前提是,程序是依次调入执行的
- 缺点:对用户不透明,增加编程负担
交换技术
- 第二章讲的处理机的中级调度就是实现交换技术
- 注意:换出到外存的是进程运行的相关程序和数据,但是进程的PCB仍然保留在内存,便于把进程换入内存
思考问题
- 磁盘存储空间:对换区,文件区
- 对换区追求换入换出速度,I/O速度比文件区更快
- 文件区追求存储空间利用率,采用离散分配方式管理空间
- 换出的数据主要放在对换区
知识点小结
- 主要出选择题
连续分配管理方式
单一连续分配
- 内存中只能有一道用户程序,独占,不可以多道用户程序
- 不一定采取内存保护,因为只有一道用户程序
- 无外部碎片,有内部碎片
固定分区分配
- 将用户空间划分为若干个固定大小的分区,每个分区装入一道作业
- 分区大小相等,分区大小不等
分区说明表
- 操作系统用来记录各个分区的情况,是一个数据结构(链表或数组)
- 无外部碎片,有内部碎片
动态分区分配
- 进程装入内存时,才会根据进程大小动态的建立分区,因此分区大小和数目是可变的
- 思考问题
动态分区分配–用什么数据结构记录分配情况
- 空闲分区表,空闲分区链
动态分区分配–如何选择分区
- 采用动态分区分配算法,下一节再展开
动态分区分配–如何进行分区的分配与回收
- 分配:分完了,还有剩余空间,则修改分区表;没有剩余了,则去掉这个空间分区记录
动态分区分配–如何进行分区的分配与回收
- 回收:回收区有相邻的空闲分区,则进行合并,修改表记录;没有相邻空闲分区,增加一个表记录
- 各个表项的排序规则需要看具体的动态分区分配算法来确定
外部碎片,内部碎片
- 某一进程需要一块大的连续内存空间,但这些外部碎片不满足需求,但这些外部碎片的总和满足
- 采用紧凑技术解决外部碎片
- 紧凑技术正好适合搭配装入技术中的动态重定位技术,因为程序可能会更换在内存中的位置
- 紧凑之后需要修改各个进程的起始地址,进程起始地址保存在PCB中,
知识点小结
- 外部碎片,内部碎片经常出选择题
- 紧凑技术也出过选择题,回收内存分区的四种情况也出过真题
动态分区分配算法
首次适应算法
- 空闲分区地址按照递增的顺序排列,保存在空闲分区表或空闲分区链
- 分配或者回收空闲分区后,在修改对应的表或链
最佳适应算法
- 空闲分区按照容量递增的顺序链接,每次分配内存时按照顺序查找空闲分区链或表
- 如果分配会或回收空闲分区之后,还要修改表项或者链中记录,如果不在满足容量大小递增的顺序了,还要调整空间分区表或链的排列顺序,重新回到容量递增顺序
- 缺点:会产生很多的外部碎片
最坏适应算法
- 优先使用最大的连续空闲区
- 空闲分区按照容量递减的顺序链接
- 解决了最佳算法的隋品太多
- 缺点:消耗了很多大的空闲分区,再有大进程来,就没有内存分区可用了,
临近适应算法
- 每次从上一次查找结束的位置,开始检索
- 可以将空闲分区地址排成一个循环链表,按照地址递增的顺序
- 无需对链表进行重新排列,因为是按地址递增排列的,算法开销比较小;比最佳和最坏的算法开销小
- 首次适应算法也有问题,每次都要从头查找,而临近算法不用从头查
- 临近适应算法也导致了高地址部分的大分区更可能被使用,并划分为小分区,导致最后无大分区可用,
- 四种算法,首次适应算法效果最好
知识点小结
- 很容易出题
- 理解算法思想,各个算法的优缺点;开销大是因为可能要排序
- 邻近适应算法略难理解,再细品一下
基本分页存储管理的概念
本节是高频考点,也是难点
针对的是非连续分配管理方式
分页存储
- 内存空间分成一个个大小相等的页框/页帧/内存块/物理块/物理页面
- 一个进程的逻辑地址也分成页/页面,页的大小与内存块是一样的
- 操作系统将进程的一个个页存放在内存的一个个内存块中,因此进程的页面与内存的内存块有一一对应关系
- 进程的页可以不用连续存放到内存中
- 注意区分概念:
- 进程的逻辑地址划分:页,页面
- 内存的物理地址划分:页框,页帧,内存块,物理块,物理页面
重要的数据结构–页表
- 用于将逻辑地址的页与物理地址的内存块进行一一对应
- 页表通常存放在PCB中
每个页表项占多少字节(先看块号)
- 例题中,块号至少有20位,我们的计算机一般以字节为单位,因此就是至少3字节,24位
- 重要考点,经常让我们通过内存块数量求出块号至少占多少字节
页号占多少字节
- 类比数组,页表项是连续存放的,块号是固定的位数
- 因此页号是隐含的,只需知道页表项的起始地址即可推算任意页号的存放地址
因此每个页表项的字节数就是块号的字节数
如何实现地址转换(复习连续存放时)
- 逻辑地址+偏移量
如何实现地址转换(分页存放)
- 进程的各个页面时离散存放的,但页面内部是连续存放的
举例
页面大小最好是2的整数次幂
- 逻辑地址刚好可以划分为两部分,页号+页内偏移量
- 页面大小=内存块大小
- 物理地址也可以划分两部分,块号+块内偏移量(页内偏移量)
- 如果页面大小是2的整数次幂,可以这样快速算出,也能提高计算机效率;如果不满足2的整数次幂,只能用土办法
为什么页面大小取2的整数次幂
逻辑地址结构
知识点小结
基地址变换机构
基本地址变换机构
- 程序未执行时,页表起始地址和页表长度放在PCB中
- 进程被调度时,操作系统内核将他们存放到页表寄存器中PTR
基地址变换过程
- 进程切换时,内核程序PCB中取出必要信息,恢复进程数据,
- 比如把页表起始地址和页表长度放到PTR中,把下一条指令的逻辑地址放到程序计数器PC中
- 因此我们要把下一条指令的逻辑地址转为实际的物理地址
- 考试经常出题,给出逻辑地址,页表,计算求物理地址
例题
- 理解也是管理中地址是一维的
- 初学者经常忘记对页号的越界检查
对页表项大小的进一步探讨
- 页表项也存放在内存中,也要面对内存块大小的影响
- 本例中,开始用三个字节编址内存块号,因此一个页表项占三字节,因此页表项在一个内存块中存放最后会有剩余碎片的
- 这不利于页表项的查询,因此用四个字节编址内存块号,即一个页表项占四字节,刚好在内存块中可以存满(考试一般不考,了解即可)
- 做题时,我们依然按三字节这个思路求解,四字节的思路是实际应用的思路
- 进程的页表也是装在连续的内存块中的
知识点小结
- 本节十分重要,经常作为大题,小题考察
- 地址变换过程最重要,掌握过程,熟练手算过程
- 本节中介绍的基本地址变换方式一共访问了两次内存