主要参考:
- 《操作系统概论》(机械工业出版社)
单用户连续存储管理
最简单的一种存储管理方式,除操作系统占用的一部分主存空间外,其剩余的所有空间(不管空闲区多大)都只分配给一个作业使用
处理器中设置一个界限寄存器,用来存放用户区起始地址,一般固定不变(除非操作系统功能扩充或修改导致系统区占用变化)
这种方式不必考虑作业在主存中的移动问题,因此可采用静态定位方式进行地址转换
固定分区存储管理
将主存储器中可分配的用户区预先划分成若干个连续区域(大小可不相同,但划分好后大小固定),每个连续区域称为一个分区
- 可同时在每个分区中装入一个作业,但不允许多个作业同时装入同一个分区中;
- 适用于多道程序设计系统
通过设置“分区分配表”,来记录各分区的分配和使用情况:
- 记录各分区的起始地和长度;
- 设置标志位,为 0 表示分区空闲,否则已被占用
作业执行过过程中不会发生存放区域改变, 适用静态重定位方式
下限地址 ≤ 绝对地址 < 上限地址
可变分区存储管理
在作业要求装入主存时,根据作业需要的主存空间大小和当时主存空间使用情况来决定是否为作业分配一个分区,并按作业的实际需求来划分大小
- 克服了固定分区方式中分区空间不能被充分利用的缺陷;
- 需设置一张“空闲区表”来记录空闲区的起始位置和长度;
- 如果收回的区域正好与某一个空闲区相邻,应将其合并后再登记到空闲区表上
一般均采用动态重定位方式来装入作业,变于移动技术的实现:
- 集中分散的空闲区,使主存空间充分被利用;
- 便于作业动态扩充主存;
- 移动会增加系统开销,尽量减少(可将作业从主存空间两头装入);
- 等待外围设备消息中的作业不能被移动(与外围设备的信息交换是按照主存绝对地址来进行的)
常用主存分配算法:
最先适应分配算法
每次分配时,总是顺序查找空闲区表,第一个能满足作业长度需求的空闲区即被切割后分配给作业
- 实现简单;
- 容易导致碎片(不连续的空闲区)过多,使主存空间利用率降低
最优适应分配算法
从所有空闲区中挑选一个能满足作业要求的最小空闲区
- 空闲区表中按空闲区长度递增登记,顺序查找第一个能满足的即是最优适应,回收后还需按长度顺序登记至空闲区表中;
- 被切割后的碎片往往极小而无法利用,影响主存空间利用率
最坏适应分配算法
总是挑选最大的空闲区切割后分配给作业
- 空闲区表中按空闲区长度递减登记,顺序查找第一个能满足的即是最坏适应,回收后还需按长度顺序登记至空闲区表中;
- 保证碎片不至于太小而无法使用
页式存储管理
将作业的连续逻辑地址空间分散到几个不连续的主存区域,既可充分利用主存空间又可减少移动开销
实现原理:
将主存空间分成大小相等的块,同时将程序的逻辑地址也分成(与块)相同大小的页;
由分页式存储器的逻辑地址结构来决定页数(页号位数)与页面的大小(页内地址位数);
作业装入主存时,分配与所需页数相一致的块,可不连续;
作业执行时,根据逻辑地址的页号找到所在主存块号,再确定当前指令应访问的主存绝对地址
主存分配表:
如示例,假设主存可分配区域被分为256块,可用字长为32位的8个字的位示图来表示各块的分配情况:
- 0/1 来表示当前块 空闲/已占用;
- 另用一个字节来记录当前的剩余块数
页表:
给能满足需求的作业分配好空间后,建立页表来记录逻辑地址中的页号与主存中块号的对应关系。
快表:将页表中经常需要访问的一部分放置于高速缓冲存储器中,以提升查找执行速度
分页式地址转换:
执行时采用动态地址转换方式:绝对地址 = 块号 ✖ 块长 + 页内地址
考虑二进制乘法的特性,实际就是由页表中查得的主存块号(作为高地址部分)和逻辑地址的页内地址(作为低地址部分)组成了绝对地址
多级页表
现代多道程序设计系统中,实际需要保存的页表数量及规模往往都很大,主存开销很大。考虑程序执行的局限性,一段时间内程序执行可能也只涉及一部分页,而将其他页存放至磁盘中
二级页表结构:
- 一级页表(页面组表)指出二级页表的存放地址;
- 二级页表(组内页面表)指出页的存放地址;
- 总是将一级页表装入主存,再根据需要装入对应二级页表
二级页表结构还可扩充至三级、四级或更多级。级别越多,灵活性越大,管理复杂度也越大