常用内存分配器算法

一:动态内存分配:


    动态内存分配是指在程序运行过程中,根据需要动态地分配和释放内存空间。常用的就是malloc、free:
    malloc():用于分配指定字节数的内存空间,并返回指向该内存的指针。
    free():释放之前通过malloc()分配的内存空间。
    使用动态内存分配可以灵活地管理内存,特别适用于以下情况:
    需要在程序运行时根据具体需求动态分配内存的情况,例如处理可变长度的数据结构。
    需要在堆上分配较大的内存块,超出栈空间的限制。
    需要在程序中动态创建和释放对象。
    但需要注意,动态内存分配需要开发者负责手动释放分配的内存,以避免内存泄漏。此外,使用动态内存也增加了内存管理的复杂性,如果使用不当可能会导致内存泄漏、内存溢出等问题。

二:伙伴算法


    伙伴算法(Buddy System Algorithm)是一种用于管理内存的动态分配算法。它的主要目标是解决内存碎片化的问题,提高内存利用率。
    在伙伴算法中,内存空间被划分为一系列固定大小的块,通常是2的幂次方大小。每个块都被认为是内存管理的最小单位,称为伙伴块。这些伙伴块按照大小进行组织,例如有大小为1KB、2KB、4KB和8KB的块集合。
    当应用程序请求内存时,伙伴算法会找到与请求大小最接近的合适伙伴块。如果找到的伙伴块比请求的内存稍大,并且可以被分割成两个大小相等的子块,那么一个子块将被分配给应用程序,另一个子块将被标记为未分配状态。如果找到的伙伴块与请求的内存大小完全匹配,它将直接分配给应用程序。
    当应用程序释放内存时,伙伴算法会将被释放的内存块合并回原来的伙伴块。合并操作将检查被释放块的伙伴块是否也是未分配状态,如果是,则两个伙伴块将被合并成更大的伙伴块。这个合并过程会递归地继续,直到找到所有的伙伴块都是已分配状态或无法合并为止。
    伙伴算法的优点是可以减少外部碎片,使得内存的利用率更高。然而,它会增加内部碎片的存在,因为每个伙伴块的大小都是固定的,而并非完全匹配应用程序的内存需求。此外,伙伴算法的实现相对较复杂,需要维护空闲块列表和处理合并过程。

三:Slab 算法


    Slab算法是一种在计算机操作系统中用于内存管理的技术。它最早在Linux内核中实现,并被广泛应用于许多操作系统中。
    Slab算法通过将内存划分为多个大小相等的固定块(slab),用于管理内核对象的分配和释放。每个slab可以容纳一定数量的对象,并使用链表来组织这些对象。
    当需要分配一个对象时,Slab算法首先检查有无空闲的slab。如果存在空闲的slab,则在该slab中分配一个对象,并更新相应的链表。如果没有空闲的slab,算法会从操作系统申请新的内存页面,并将其划分为新的slab。
    当对象不再使用时,Slab算法将其返回给相应的slab,并将其标记为空闲状态。这样,当下次需要分配对象时,可以直接从空闲的slab中获取,而无需频繁地向操作系统申请新的内存。
    通过使用Slab算法,操作系统可以提高内存分配和释放的效率,减少内存碎片化的问题,并减少对操作系统的频繁内存申请的需求,从而提高整体系统性能。
    总之,Slab算法是一种用于操作系统内存管理的技术,通过划分内存为固定大小的slab来管理内核对象的分配和释放,以提高系统的性能和效率。


参考:


https://www.cnblogs.com/alantu2018/p/8527821.html
https://blog.csdn.net/qq_22238021/article/details/80214759

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值