数据结构——(8)动态存储管理

一、概述

1、占用块

占用块:已分配给用户使用的地址连续的内存区 可利用空间块:未曾分配的地址连续的内存区

2、动态存储分配过程的内存状态

二、可利用空间表及分配方法

可利用空间表也称为存储池。

1、可利用空间表的三种不同结构形式

  • 系统运行期间所有用户请求分配的存储量大小相同。对此类系统,在系统开始运行时将它使用的内存区按所需大小分割成若干大小相同的块,然后用指针链接成一个可利用空间表。因为表中节点的大小相同,则分配时无需查找,只要将表中的第一个节点分配给用户即可;同样,当用户释放内存时,系统只要将用户释放的空闲块插入表头即可。

  • 第二种情况,系统运行期间用户请求分配的存储量有若干种大小的规格。对此类系统,一般情况下建立若干个可利用空间表,同一链表中的节点大小相同。此时的分配和回收在很大程度上和第一种情况类似,只是当节点大小和请求分配的内存大小相同的链表为空时,需要查询节点较大的链表,并从中取出一个节点,将其中一部分内存分配给用户,而将剩余部分插入到相应大小的链表中。回收和第一种情况相同。然而,这种情况的系统还有一个特殊的问题要处理:即当节点与请求相符的链表和节点更大的链表均为空时,分配不能进行,而实际上内存空间并不一定不存在所需大小的连续空间,只是由于在系统运行过程中,频繁出现小块的分配和回收,导致大街店链表中的空闲块被分隔成小块后插入在小节点的链表中,此时若要系统继续运行,就必须重新组织内存,即执行“存储紧缩”的操作。

  • 第三种情况,系统在运行期间分配给用户的内存块的大小不固定,可以随请求而变。因此,可利用空间表中的节点即空闲块的大小也是随意的。

2、可利用空间表的分配策略

    在选择时需要考虑:用户的逻辑要求、请求分配量的大小分布、分配和释放的频率以及效率对系统的重要性等

    在回收空闲块时,首先应检查地址与它相邻的内存是否是空闲块

  • 首次拟合法:从表头指针开始查找可利用空间表,将找到的第一个大小不小于的空闲块的一部分分配给用户。在回收时,只要将释放的空闲块插入在链表的表头即可

  • 最佳拟合法:将可利用空间表中一个不小于n且最近n的空闲块的一部分分配给用户。在回收时,必须将释放的空闲块插入到合适的位置上去

  • 最差拟合法:将可利用空闲表中不小于n且是链表中最大的空闲块的一部分分配给用户。在回收时将释放的空闲块插入到链表的适当位置上去

三、边界标识法

1、思想

在每个内存区的头部和底部两个边界上分别设有标识,以表示该区域为占用块或空闲块,使得在回收用户释放的空闲块时易于判别在物理位置上与其相邻的内存区域是否为空闲块,以便将所有地址连续的空闲存储区组合成一个尽可能大的空闲块

2、分配算法

用首次拟合法进行分配时,只要从表头指针pav所指结点起,在可利用空间表中进行查找,找到第一个容量不小于请求分配的存储量(n)的空闲块时,即可进行分配

3、回收算法

为了使物理地址毗邻的空闲块结合成一个尽可能大的结点,则首先需要检查刚释放的占用块的左、右紧邻是否为空闲块。若释放块的左、右邻区均为占领块,则将此新的空闲块作为一个结点插入到可利用空闲表中即可;若只有左邻区是空闲块,则应与左邻区合并成一个结点;若只有右邻区是空闲块,则应与右邻区合并成一个结点;若左、右邻区都是空闲块,则应将3块合起来成为一个结点留在可利用空间表中

四、伙伴系统

1、定义

在用户提出申请时,分配一块大小“恰当”的内存区给用户,反之,在用户释放内存区时即回收。所不同的是:在伙伴系统中无论是占用块或是空闲块,其大小均为2的k次幂(k为某个正整数),伙伴系统优点是算法简单,速度快,缺点是由于只归并伙伴而容易产生碎片

2、分配算法

当用户提出大小为n的内存请求时,首先在可利用表上寻找结点大小与n相匹配的子表,若此子表为非空,则将子表中任意一个节点分配之即可;若此子表为空,则须从结点更大的非空子表中去查找,直至找到一个空闲块,则将其中一部分分配给用户,而将剩余剩余部分插入到相应的子表中

3、回收算法

在用户释放不再使用的占用块时,系统需将这新的空闲块插入到可利用可利用空闲表中去,在回收空闲块时,应首先判别其伙伴是否是空闲块,若否,则只要将释放的空闲块简单插入在相应的子表中即可;若是,则需在相应子表中找到其伙伴并删除之,然后再判别合并后的空闲块的伙伴是否为空闲块。依次重复,直到归并所得空闲块的伙伴不是空闲块时,再插入到相应的子表中去

五、无用单元收集

1、定义

指那些用户不再使用而系统没有回收的结构和变量,特点是在用户释放存储时进行回收,即系统是应用户的需求来进行存储分配和回收的

如果所释放的结点被再分配而继续访问指针q所指结点,则这种访问为“悬挂访问”

2、解决无用单元方法

(1)、使用访问计数器

(2)、收集无用单元

  • 对所有占用结点加上标志,在无用单元收集之前所有结点的标志域均置为“0”,则加上标志就是将结点的标志域置为“1”

  • 对整个可利用存储空间顺序扫描一遍,将所有标志域为“0”的结点链接成一个新的可利用空间表

六、存储紧缩

1、实现办法

设立一个指针,称为堆指针,始终指向堆的最低(或最高)地址,当用户申请N个单位的存储块时,堆指针向高地址(或低地址)移动N个存储单位,而移动之前的堆指针的值就是分配给用户的占用块的初始地址。由于系统的可利用空间始终是一个地址连续的存储块,因此回收时必须将所释放的空闲块合并到整个堆上去才能重新使用,这就是“存储紧缩”的任务

2、存储紧缩的操作

  1. 计算占用块的新地址

  2. 修改用户的初始变量表,以便在存储紧缩后用户程序能继续正常运行

  3. 检查每个占用块中存储的数据。若有指向其他存储块的指针,则需做相应修改

  4. 将所有占用块迁移到新地址去,实质是作传送数据的工作

 

おすすめ

転載: blog.csdn.net/qq_41819893/article/details/121324327