操作系统3.2:连续型分配之动态分区、内存回收

静态分区我们前面已经说过,它是提前给内存划分成几个部分,称为分区。在特定的分区内部,载入进程。
因为静态分区分的数量是固定的,所以往往不能允许太多或太大的进程并发执行。

动态分区是根据进程的需要,动态地为其分配内存空间。

比如现在我有一个20MB的进程,现在内存的情况如图:
在这里插入图片描述
那么在这种情况下,我们的操作系统就可以把22MB中的20MB划给进程。
这就是根据进程的大小,来划分分区。而不是一开始就定好了各分区的大小。

内存空闲区在内存中会用一个双向链表来存储,这样找空闲区域的时候就很方便。

常见的分区分配算法:

1、首次适应算法(First Fit)

【算法过程】:
从头开始,遍历内存空闲区链表。
找到第一个大小可满足的空闲分区,将其分配给进程。

【大白话解释】:
你手上有很多的箱子,当你要往箱子中放东西的时候,你将所有的箱子拿出来。从头开始找哪一个箱子能装下你的物品。找到一个大小合适的了,那就装进去呗!OK!

2、循环首次适应算法(Next Fit)

【大白话解释】:
首次适应算法有个缺点,就是会造成前面的箱子大多数都装满了,而后面的箱子却都空着。
于是提出改进,每次都从上次装完的那个箱子的后一个箱子开始。这样的话,箱子装的更加平均。即,内存的分配更加平均,不会集中于某一处。

3、最佳适应算法(Best Fit)

以上两种算法比较简单,但效果不是太好。因为很容易造成箱子大材小用的情况!
因此提出最佳适应算法。

【大白话解释】:
当你用首次适应算法的时候,你的大箱子很可能只装了一个小杯子。
于是,聪明的你想到,将箱子按照容量大小排个序,然后再依次对比,装箱。
这样一定会保证大材小用的情况不发生。比如:现有排好序的箱子5, 10, 15, 20。当有一个大小为12的物品需要装填的时候,我们会用15这个箱子,而不会使用20.

4、最差适应算法(Worst Fit)

最差适应算法要将空闲区容量从大到小排序。
可能有些人会奇怪,为什么要从大到小排序呢?这样不是大材小用了吗?
对,是的。但是最佳适应算法是有缺点的,它会带来很多的内存碎片

比如刚刚的情况,空闲区为:
5 10 15 20
我们将12放到15中去,那么15这个空闲区就只剩3个单位大小了,这么小的空间几乎不能再放任何进程,因此,该碎片很可能就无法利用了。所以,产生过多的内存碎片对资源是很浪费的。

而如果,我们按照最差适应算法,那么就会把12放到20中去,这样剩余空间应该是20 - 12 = 8。还有8个单位的大小,属于比较大的,有可能可以放其他的进程。
因此,最差适应算法存在的意义就是能减少内存碎片。但它又造成了大材小用的情况

算法总结

由上面的介绍,我们可以看出,其实这四种算法都是各有各的优点,同时也是各有各的缺点。

再来看看内存回收的过程

有内存的分配,那么肯定也有内存的回收。内存是如何回收的呢?
总体一句话:就是要把空闲区和回收区合并起来

经过分析,内存回收只可能存在以下4种情况:

在这里插入图片描述
情况1、

空闲区节点中,地址不变,大小修改即可。要把回收区的大小加进来。

情况2、

该节点地址要变,变成回收区的地址,然后大小也要修改

情况3、

地址变成前面的空闲区地址,大小把前后一加

情况4、

新创建一个空闲区节点,设定大小,插入到空闲区双向链表中即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值