连续分配存储管理方式
连续分配:为一个用户程序分配一段连续的内存空间。包括:单一连续分配、固定分区分配、动态分区分配以及动态重定位分配。
离散分配:分页存储、分段存储。
单一连续分配
内存分为系统区、用户区和空闲区三部分,系统区仅提供给OS使用;用户区内存中,仅装有一道用户程序。
系统区 |
用户区 |
空闲区 |
固定分区分配
划分分区的方法:
(1) 分区大小相等(指所有的内存分区大小相等)。
(2) 分区大小不等。
动态分区分配
1. 动态分区分配中的数据结构
常用的数据结构有以下两种形式:① 空闲分区表,在系统中设置一张空闲分区表,用于记录每个空闲分区的情况。
② 空闲分区链。在每个分区的起始部分设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针,在分区尾部则设置一后向指针。通过前、后向链接指针,可将所有的空闲分区链接成一个双向链。
分区分配操作
1) 固定分区法的内存分配与回收
用户程序要装入执行时,根据请求查询分区说明表,从中找出一个满足要求的空闲分区,分配。
进程执行完毕,管理程序将对应的分区状态设置为未使用即可。
2 ) 动态分区时的分配
系统预先设定阈值size,并利用某种分配算法,从空闲分区链(表)中找到所需大小的分区。设请求分区大小为 u.size,空闲分区的大小为 m.size。若 m.size-u.size≤size,将整个分区分配给请求者;否则,从按请求大小划分出一块内存空间分配,余下的部分仍留在空闲分区链(表)中。并将分配区的首址返回。
3 ) 动态分区时的内存回收
当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一:
基于顺序搜索的动态分区分配算法
1. 首次适应算法
分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,分配给请求者,余下的空闲分区仍留在空闲链中。
2. 循环首次适应算法
基于首次适应算法,但不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区。
3. 最佳适应算法
将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链,每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业。
4. 最坏适应算法
空闲区按其大小递减的顺序组成空闲分区表或空闲分区链,扫描整个空闲分区表或链表时,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用。
基于索引搜索的动态分区分配算法
1. 快速适应算法
将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区设立一个空闲分区链表,用一张管理索引表记录该类型空闲分区链表表头的指针等信息。
2. 伙伴系统
伙伴系统规定,不论是已分配的分区还是未分配的空闲分区,其在内存中的大小均置为2的k次方,其中k为正整数,
l≤k≤m。也就是说最小的分区为2,最大的分区可设置为2的m次方,2的m次方为整个可分配内存的大小。
动态可重定位分区分配
1. 紧凑
将内存中的所有作业进行移动,从而将原来分散的多个空闲分区移到同一端拼接成一个大的空闲分区,以装入用户的作业。这种技术被称为“拼接”或“紧凑”。
2. 动态重定位
采用运行时装入的方式,在系统中增设一个重定位寄存器,用来存放程序(数据)在内存中的起始地址。程序在执行时,真正的地址是相对地址与寄存器中的地址相加而成
3. 动态重定位分区分配算法
动态重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法中,增加了紧凑的功能。