连续分配方式,是指为一个用户程序分配一个连续的内存空间。
连续分配方式的分类:
l单一连续分配
l固定分区分配
l动态分区分配
l动态重定位分区分配
下面来看这几种分配方式
最简单的一种存储管理方式,但只能用于单用户、单任务的OS中。
l存储管理方法:将内存分为系统区(内存低端,分配给OS用)和用户区(内存高端,分配给用户用)。采用静态分配方式,即作业一旦进入内存,就要等待它运行结束后才能释放内存。
固定分区分配方式是最早使用的一种可运行多道程序的存储管理方法。
l存储管理方法
Ø内存空间的划分:将内存空间划分为若干个固定大小的分区,除OS占一区外,其余的一个分区装入一道程序。分区的大小可以相等,也可以不等,但事先必须确定,在运行时不能改变。即分区大小及边界在运行时不能改变。
Ø系统需建立一张分区说明表或使用表,以记录分区号、分区大小、分区的起始地址及状态(已分配或未分配)。
l特点
①一个作业只能装入一个分区,当分区大小不能满足作业的要求时,该作业暂时不能装入。
②通过对“分区使用表”的改写,来实现主存的分配与回收。作业在执行时,不会改变存储区域,所以采用静态地址重定位方式。此方法易于实现,系统开销小。
③有内部碎片。
分区总数固定,限制了并发执行的作业数目
动态分区分配又称为可变式分区分配,是一种动态划分存储器的分区方法。
存储管理方法
不事先将内存划分成一块块的分区,而是在作业进入内存时,根据作业的大小动态地建立分区,并使分区的大小正好适应作业的需要。因此系统中分区的大小是可变的,分区的数目也是可变的。
动态分区分配算法包含2种类型:l1、基于顺序搜索的动态分区分配算法。2、l基于索引搜索的动态分区分配算法。
基于顺序搜索的动态分区分配算法
Ø首次适应算法
算法描述:
空闲分区(链)按地址递增的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。
Ø循环首次适应算法
算法描述:
循环首次适应算法又称为下次适应算法,由首次适应算法演变而来。在为作业分配内存空间时,不再每次从空闲分区表/链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足其大小要求的空闲分区为止。然后,再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表/链中。
Ø最佳适应算法
算法描述:
空闲分区表/链按容量大小递增的次序排列。在进行内存分配时,从空闲分区表/链的首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。
Ø最坏适应算法
算法描述:
空闲分区表/链按容量大小递减的次序排列。在进行内存分配时,从空闲分区表/链的首开始顺序查找,直到找到第一个比之大的空闲分区为止。剩下的空闲仍留在空闲分区表/链中。
基于索引搜索的动态分区分配算法
基于顺序搜索动态分区分配算法,适用于不太大的系统。系统很大时:1.内存分区很多。2.空闲分区链很长。3.顺序搜索方法很慢。
l基于索引搜索的动态分区分配算法常用的:
快速适应算法(也叫分类搜索法(quick fit))
该算法又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样系统中存在多个空闲分区链表。在内存中设立一张管理索引表,其中的每一个索引表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。
伙伴系统
伙伴系统规定:无论已分配分区或空闲分区,其大小均为2的K次幂,K为整数,l≦k≦m,其中:2l表示分配的最小分区的大小,2m表示分配的最大分区的大小。
伙伴关系:初始内存是一个大小为2m的空闲分区,分区可以对半分割,分区大小均为2 的k次幂。若申请长度为n的内存空间,计算一个i值使2i-1
哈希算法
算法描述:
利用哈希快速查找的优点,以及空闲分区在可利用空间表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。当进行空闲分区分配时,根据所需空闲分区的大小,通过哈希函数计算,得到相应的空闲分区链表,实现最佳分配策略。
动态重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法中,增加了紧凑的功能。通常,当该算法不能找到一个足够大的空闲分区以满足用户需求时,如果所有的小的空闲分区的容量总和大于用户的要求,这时便须对内存进行“紧凑”,将经“紧凑”后所得到的大空闲分区分配给用户。如果所有的小的空闲分区的容量总和仍小于用户的要求,则返回分配失败信息。
动态重定位的实现
l在动态运行时装入的方式,将相对地址转换为物理地址的工作在程序指令真正要执行时才进行。地址转换需要重定位寄存器的支持。程序执行时访问的内存地址是相对地址与重定位寄存器中的地址相加而成。
l地址变换过程是在程序执行过程期间,随着对每条指令的访问自动进行的,称为动态重定位。
真正访问地址=相对地址+重定位寄存器中地址。