对比first-fit/best-fit/worst-fit/slab以及buddy这几种算法的特点

本文详细分析了内存管理的几种算法,包括first-fit(首次适应)、best-fit(最佳适应)、worst-fit(最差适应)以及buddy-system和slab算法。first-fit可能导致较多外部碎片,best-fit和worst-fit各有适用场景,buddy-system以二进制分裂和合并实现快速搜索,slab则专注于解决小内存的内部碎片问题。每种算法的优缺点和实现策略也进行了探讨。

以下均为自己对这些算法的理解

fitst-fit算法

First-fit算法:连续物理内存分配算法的一种,将空闲内存块按照地址从小到大的方式连起来,具体实现时使用了双向链表的方式。当分配内存时,从链表头开始向后找,这意味着从低地址向高地址查找,一旦找到可以满足要求的内存块,即将该内存块分配出去即可。在此处为了避免内部碎片问题,具体实现时我们将该可用内存块分为两部分:前一部分大小与所需内存相同,这样我们只需要将前一部分分配出去,然后将后一部分继续插入到链表中即可。通过这个方式我们实现了一定程度上的任意大小分配,但是这个算法不可避免的产生了较多的外部碎片。同时,我认为该算法有一个缺陷,那就是会在低地址部分产生很多小碎片,这些碎片不但浪费内存,同时会导致每次从低地址向高地址查找时都要遍历一遍,会使得算法的性能大大下降,查找的开销会逐渐上升。

具体实现时的一些细节以及一些优化策略:

  • 用双向链表存储可用内存块,这样的好处在于插入删除结点时较为容易
  • 找到可用块后,如果可用块大小大于所需(通常情况下均为此情况),则将可用块分配前部分使得正好满足所需,而后半部分继续插入到可用块的链表中,可以避免内部碎片的产生,当然会产生外部碎片。
  • 释放内存块时,需要查看要释放的内存块是否和相邻的块可以合并,如果可以合并,则将其合并为一个大块并放入可用内存块队列。判断较为容易,因为是按照地址排序的,所以只需要查看地址排列是否首位相接即可。
  • 实际上,可以用二叉搜索树对该算法进行优化。通过二叉搜索树排序可用内存块,根据地址排序,通过保证二叉树的任意节点的左节点的地址值小于自身地址值,右节点的地址值大于自身地址值,通过此方法优化,我们可以实现O(n)的复杂度进行内存的分配,但是可以O(logn)的复杂度进行内存的释放。
best-fit和worst-fit算法

由于best-fit和worst-fit在实现上与first-fit较为相似

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值