8.数据结构 --- 动态存储管理

1.概述
	动态存储管理的基本问题是系统如何应用户提出的'请求'分配内存?又如何回收用户不再使用而'释放'的内存,以备新的'请求'产生时重新进行分配。
  提出请求的用户可能是进入系统的一个作业,也可能是程序执行过程中的一个动态变量。

  	分配内存通常有两种做法:
  	1.系统继续从高地址的空闲块中进行分配,而不会理会已分配给用户的内存是否已空闲,直到分配无法进行时,系统才会回收所有用户不再使用的空闲块,
  并重新组织内存,将所有空闲块的内存区连接在一起成为一个大的空闲块。
  	2.用户一旦结束运行,便将它所占有的内存释放成空闲块,同时,每当新的用户请求分配内存的时候,系统需要巡视整个内存区中所有空闲块,并从中找到
  一个'合适'的空闲块分配之。由此,系统需建立一张记录所有空闲块的'可利用空间表',此表的结构可以是目录表,也可以是链表。

2.可利用空表及分配方法
	可利用空间表中包含所有可分配的空闲块,每一块是链表中的一个结点。当用户请求分配时,系统从可利用空间表中删除一个结点分配之;当用户释放其所占
  内存时,系统即回收并将它插入到可利用空间表中。根据系统运行情况不同,可利用空间表可以有以下3种不同的结构形式:
  	1.系统运行期间所有用户请求分配的存储量大小相同。对此类系统,通常的做法是,在系统开始运行时将归它使用的内存区按所需大小分割成若干大小相同的
  块,然后用指针链接成一个可利用空间表。由于表中结点大小相同,则分配时无需查找,只需将第一个结点分配给用户即可;同意,当用户释放内存时,系统只要
  将用户释放的空闲块插入到表头即可。	
  	2.系统运行期间用户请求分配的存储量有若干种大小的规格。对此系统一般情况下是建立若干个可利用空间表,同一链表中的结点大小相同。
  	3.系统在运行期间分配给用户的内存块的大小不固定,可以随请求而变。因此,可利用空间表中的结点即空闲块的大小也是随意的。通常,操作系统中的可利用
  空间表属于这种类型。如何分配:1.首次拟合法;2.最佳拟合法;3.最差拟合法。

3.边界标识法
	边界标识法是操作系统中用以进行动态分区分配的一种存储管理方法,它属于上面讨论的第三种情况。系统将所有的空闲块链接在一个双重循环链表结构的可利用
  空间表中;分配可按首次拟合法,也可以按最佳拟合法进行。系统的特点在于:在每个内存区的头部和底部两个边界上分别设有标识,以标识该区域为占用块或空闲块,
  使得在回收用户释放的空闲块时易于判断在物理位置上与其相邻的内存区域是否为空闲块,以便将所有的地址连续的空闲块存储区组合成一个尽可能大的空闲块。

  	1.分配算法 : 采用首次拟合法
  	2.回收算法 : 用户释放立即回收

4.伙伴系统
	伙伴系统是操作系统中用到的另一种动态存储管理方法。它和边界标识法类似,用户提出申请时,分配一块大小'恰当'的内存区给用户;反之,在用户释放内存区时
  及时回收。所不同的是:在伙伴系统中,无论是占用块还是空闲块,其大小均为2的k次幂。例如,当用户申请n个字的内存区时,分配的占用块大小为2^k个字。由此,
  在可利用空间表中的空闲块大小也可能只是2的k次幂。
  	回收算法:仅将互为'伙伴'的两个空闲块合并。何为伙伴?在分配时经常需要将一个大的空闲块分裂成两个大小相等的存储区,这两个由同一大块分裂出来的小块
  就'互为伙伴'。

5.无用单元收集
	'无用单元'是指那些用户不再使用而系统没有回收的结构和变量。
	p=malloc(size);
	...
	p=null;
	执行的结果是,是使执行p=malloc(size)为用户分配的结点称为无用单元,无法得到利用。

	p=malloc(size);
	...
	q=p
	free(p);
	执行的结果使得指针变量q悬空,如果所释放的结点被再分配而继续访问指针q所指的结点,则称这种访问为'悬挂访问'。
	
6.存储紧缩

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值