存储管理-分区存储管理
分区管理把内存划分成若干个大小不等的区域,除操作系统占用一个区域之外,其余由多道环境下的各并发进程共享。分区管理是满足多道程序设计的一种最简单的存储管理方法。
固定分区法
固定分区法把内存区固定地划分为若干个大小不等的区域
划分原则
分区划分的原则由系统操作员或操作系统决定。例如可划分为长作业分区和短作业分区
特点
分区一旦划分结束,在整个执行过程中每个分区的长度和内存的总分区个数保持不变
管理和控制
使用数据结构:分区说明表
分区说明表包括:分区说明表说明各分区号、分区大小、起始地址和是否是空闲区(分区状态)
分区说明表功能:内存的分配释放、存储保护以及地址变换等都通过分区说明表进行。
例子:下图中,操作系统占用低地址部分的20K,其余空间被划分为4个分区,其中1,2,3号分区已分配,4号分区未分配。
分区的分配和回收
1.当用户程序要装入执行时,通过请求表提出内存分配要求和所要求的内存空间大小
2.存储管理程序根据请求表查询分区说明表,从中找出一个满足要求的空闲分区,并将其分配给申请者
3.当进程执行完毕,不再需要内存资源时,管理程序将对应的分区状态置为“未分配” 即可。
动态分区法
与固定分区法相比,动态分区法在作业执行前并不建立分区,分区的建立是在作业的处理过程中进行的,且其大小可随作业或进程对内存的要求而改变
相比固定分区法的改进
改变了固定分区法中那种即使是小作业也要占据大分区的浪费现象,从而提高了内存的利用率。
特点
采用动态分区法,在系统初启时,除了操作系统中常驻内存部分之外,只有一个空闲分区,随后,分配程序将该区依次划分给调度选中的作业或进程。
FIFO调度方式时的内存初始分配情况:
内存的分配和释放
随着进程的执行,会出现一系列的内存分配和内存释放。
分配:某一时刻,进程C执行结束并释放内存之后,管理程序为另两个进程E(需内存50K)和F(需内存16K)分配内存。
释放:如果内存被释放,那么该块内存变为空闲区
空闲区合并:如果被回收分区有邻接的空闲分区,则进行合并。
与内存管理相关的数据结构
1.分区说明表
2.自由链:动态分区法还把内存中的可用分区单独构成可用分区表或可用分区自由链,以描述系统的内存资源.
自由链利用每个内存空闲区的头几个单元存放本空闲区的大小及下个空闲区的起始地址,所有的空闲区链接起来。
系统设置自由链首指针让其指向第一个空闲区,由此管理程序可通过链首指针查到所有的空闲区。
特点:采用自由链法管理空闲区,查找比可用表困难,但自由链指针利用闲区自身的单元不占用额外的内存区
3.请求表:请求内存资源的作业或进程也构成一个内存资源请求表。请求表的每个表目描述请求内存资源的作业或进程号以及所请求的内存大小。
4.可用表:可用表的每个表目记录一个空闲区,主要参数包括区号、长度和起始地址。采用表格结构,管理过程比较简单,但表的大小难以确定,可用表要占用一部分内存。
动态分区时的分配与回收
1.根据请求表中要求的内存长度,从可用表或自由链中找出合适的空闲区分配给进程。
2.分配空闲区之后,更新可用表或自由链。
3.进程或作业释放内存资源时,新的空闲区和已有的相邻空闲区进行链接合并,更新可用表或自由链
最先适应法
1.要求可用表或自由链按起始地址递增的次序排列。
2.一旦找到大于或等于所要求内存长度的分区,结束搜索。
3.然后,从找到的分区中划出所要求的内存长度分配给用户,并把余下的部分进行合并(如果有相邻空闲区存在)后留在可用表中,同时修改相应的表项。
特点:
- 搜索速度最佳
- 回收算法最佳
最佳适用法
1.要求按从小到大的次序组成空闲区可用表或自由链。
2.当用户作业或进程申请一个空闲区时,存储管理程序从表头开始查找,当找到第一个满足要求的空闲区时,停止查找。
3.如果该空闲区大于请求表中的请求长度,则与最先适应法时相同,将减去请求长度后的剩余空闲区部分留在可用表中。
特点:
- 找到空间最佳
最坏适用法
1.要求空闲区按其大小递减的顺序组成空闲区可用表或自由链。
2.当用户作业或进程申请一个空闲区时,先检查空闲区可用表或自由链的第一个空闲可用区的大小是否大于或等于所要求的内存长度。
3.若可用表或自由链的第一个项长度小于所要求的,则分配失败,否则从空闲区可用表或自由链中分配相应的存储空间给用户,然后修改和调整空闲区可用表或自由链。
特点:
- 不留下碎片空闲区这一出发点
动态分区时的回收与拼接
回收:当用户作业或进程执行结束时,存储管理程序收回已使用完毕的空闲区,并将其插入空闲区可用表或自由链。
拼接:将回收的空闲区插入可用表或自由链时,和分配空闲区时样,也要碰到剩余空闲区拼接问题,即把不连续的零散空闲区集中起来。
回收拼接的四种情况
将一个新可用区插入可用表或队列时,该空闲区和上下相邻区的关系是下述4种关系之一:该空闲区的上下两相邻分区都是空闲区;该空闲区的上相邻区是空闲区;该空闲区的下相邻区是空闲区;两相邻区都不是空闲区。
四种回收策略
1.如果释放区与上下两空闲区相邻,则将三个空闲区合并为一个空闲区。新空闲区的起始地址为上空闲区的起始地址,大小为三个空闲区之和。空闲区合并后,取消可用表或自由链中下空闲区的表目项或链指针,修改上空闲区的对应项。
2.如果释放区只与上空闲区相邻,则将释放区与上空闲区合并为一个空闲区,其起始地址为上空闲区的起始地址,大小为上空闲区与释放区之和。合并后,修改上空闲区对应的可用表的表目项或自由链指针。
3.如果释放区与下空闲区相邻,则将释放区与下空闲区合并,并将释放区的起始地址作为合并区的起始地址。合并区的长度为释放区与下空闲区之和。同理,合并后修改可用表或自由链中相应的表目项或链指针。
4.如果释放区不与任何空闲区相邻,则释放区作为一个新可用区插入可用表或自由链。
有关分区管理其他问题的讨论
虚拟存储器实现
1.利用分区式管理,允许每个用户拥有可以自由编程的虚拟空间。
2.但分区式管理方式无法实现用户进程所需内存容量只受内存和外存容量之和限制的虚拟存储器。
3.如果不采用内存扩充技术,每个用户进程的内存容量受到分区大小限制。
4.分区式管理通常使用覆盖或交换技术扩充内存。
关于地址变换和内存保护
1.静态地址重定位方法不可用于动态分区时的地址变换
2.动态地址重定位时,每个分区需要一对硬件寄存器的支持,即基址寄存器和限长寄存器,分别用来存放作业或进程在内存分区的起始地址和长度。
3.基址寄存器和限长寄存器除了完成动态地址重定位的功能之外,还具有保护内存中数据和程序的功能
4.保护键法也可以用来提供内存分区
分区存储管理的主要优缺点
优点:
1.实现了多个作业或进程对内存的共享,有助于多道程序设计,从而提高系统的资源利用率
2.该方法要求的硬件支持少,管理算法简单,因而实现容易
缺点:
1.内存利用率仍然不高
2.存在严重的碎小空闲区(碎片)不能利用的问题,这更进一步影响了内存的利用率
3.作业或进程的大小受分区大小控制,除非配合采用覆盖和交换技术。
4.无法实现各分区间的信息共享。