连续分配:指系统为用户进程分配的必须是一个连续的内存空间
在单一连续分配方式中,内存被分为系统区和用户区。
内部碎片:分配给某进程的内存区域中,如果有些部分没有用上,这些内存部分就被称为“内部碎片”
20世纪60年代出现了支持多道程序的系统,为了能在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。
固定分区分配又可以细分为分区大小相等与分区大小不等两种情况
针对分区大小不等的情况,系统为了维护分区状态以及管理各个分区,需要建立一个数据结构–分区说明表:
分区号 | 大小(MB) | 起始地址(M) | 状态 |
---|---|---|---|
1 | 2 | 8 | 未分配 |
2 | 2 | 10 | 未分配 |
3 | 4 | 12 | 已分配 |
… | … | … | … |
当某用户程序要装入内存时,由操作系统内核程序根据用户程序大小检索该表,从中找到一个能满足大小的、未分配的分区,将之分配给该程序,然后修改状态为“已分配”。
动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。(eg:假设某计算机内存大小为64MB,系统区8MB,用户区共56 MB..)
动态分区分配中首先我们要考虑“系统要用什么样的数据结构记录内存使用情况?”,另外从进程4进入过程中我们看到,有多个空闲分区满足它的要求,所以我们要考虑“当很多空闲分区都能满足需求时,应该选择哪个分区进行分配”,最后我们看到,在进程3执行结束后,几个空闲分区在物理位置上相连,是否要将它们几个结合,所以我们还需要考虑“如何进行分区的分配与回收”
最长采用两种常用的数据结构:空闲分区表和空闲分区链
把一个新作业装入内存时,须按照一定的动态分区分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。由于分配算法算法对系统性能有很大的影响,因此人们对它进行了广泛的研究。并在此基础上完成了多种动态分区分配算法
首先是在分配过程中,可能会出现将进程大小与空闲分区大小不相等的情况,此时对于空闲分区表来说就需要修改对应分区大小以及起始地址。也可能出现进程大小恰好等于空闲分区大小的情况,此时就需要删除空闲分区表中的一行,对空闲分区链也同理
而对于回收过程,需要注意的就是,如果一个进程执行结束,其所在分区由分配状态变为空闲状态,就需要检查该分区前后是否还存在空闲分区,如果前方或后方存在空闲分区,就需要将他们合并为一个分区,并修改空闲分区表。如果前后都不存在空闲分区,则需要在空闲分区表中新增一行
动态分区分配没有内部碎片,但是有外部碎片。
缺点:每次都选最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多的外部碎片。
又称最大适应算法(Largest Fit)
缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。
基于首次适应算法的一种改良
首次适应算法每次都要从头查找,每次都需要检索低地址的小分区。但是这种规则也决定了当低地址部分有更小的分区可以满足需求时,会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的天分区保留下来(最佳适应算法的优点)
邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使用,划分为小分区,最后导致无大分区可用(最大适应算法的缺点)
算法 | 算法思想 | 分区排列顺序 | 优点 | 缺点 |
---|---|---|---|---|
首次适应 | 从头到尾找适合的分区 | 空闲分区以地址递增次序排列 | 综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序 | |
最佳适应 | 优先使用更小的分区,以保留更多大分区 | 空闲分区以容量递增次序排列 | 会有更多的大分区被保留下来,更能满足大进程需求 | 会产生很多的,难以利用的碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排序 |
最坏适应 | 优先使用更大的分区,以防止产生太小的不可用的碎片 | 空闲分区以容量递减次序排列 | 可以减少难以利用的小碎片 | 大分区容易被用完,不利于大进程:算法开销大(原因同上) |
临近适应 | 由首次适应演变而来,每次从上次查找结束位置开始查找 | 空闲分区以地址递增次序排列(可排列成循环链表) | 不用灭磁都从低地址的小分区开始检索,算法开销小 | 会使高地址的大分区也被用完 |
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有