SHMALL:一个简单易懂的堆内存分配器

SHMALL:一个简单易懂的堆内存分配器

heap_allocator A simple heap memory allocator in ~200 lines. 项目地址: https://gitcode.com/gh_mirrors/he/heap_allocator

项目介绍

SHMALL(Simple Heap Memory ALLocator)是一个为业余操作系统开发的简单堆内存分配器。作者在几乎没有进行深入研究的情况下,编写了这个分配器,旨在使其尽可能易于理解。对于那些刚接触操作系统开发(如作者本人)或对malloc和free等函数简化版本感兴趣的人来说,这个项目非常有用。

项目技术分析

初始化

为了初始化堆,需要提供一段内存。在这个项目中,内存通过malloc分配(即通过堆分配堆)。在操作系统环境中,可能需要映射一些页面并将其提供给堆。注意,heap_t结构中的bins也需要分配内存。

元数据和设计

每个内存块都有一个node_t结构的头和一个footer_t结构的尾。node_t结构包含大小、是否空闲以及用于双向链表的两个指针(next和prev)。footer_t结构仅包含指向头的指针(用于释放相邻块时使用)。堆末尾的块称为“wilderness”块,它是最大的块,其最小和最大大小在heap.h中定义。扩展和收缩堆就像调整这个wilderness块的大小一样简单。空闲内存块存储在“bins”中,每个bin实际上只是一个具有相似大小的node_t结构的双向链表。heap_t结构包含定义数量的bins(BIN_COUNTheap.h中定义)。为了确定将块放入哪个bin,块的大小通过get_bin_index函数映射到一个bin索引。这种一致的binning函数确保块可以以定义的方式访问和存储。块在插入bins时进行排序,因此插入不是O(1),但这使得更容易找到最佳匹配的块。

分配

heap_alloc函数接受要从中分配的heap_t结构地址和大小。函数简单地使用get_bin_index来确定这个大小的块应该在哪个bin中,当然可能没有这个大小的块。如果在相应的bin中没有找到块,则检查下一个bin。这将一直持续到找到块或到达最后一个bin,在这种情况下,将从wilderness块中获取一块内存。如果找到的块足够大,则将其分割。为了确定是否应该分割块,从当前分配不使用的元数据(开销)中减去。如果剩余的部分大于或等于MIN_ALLOC_SZ,则意味着我们应该分割这个块并将剩余部分放入正确的bin中。一旦我们准备好返回找到的块,我们就获取next字段的地址并返回。这样做是因为在块分配时,nextprev字段未使用,因此块的用户可以在这些字段中写入数据而不影响堆的内部工作。

释放

heap_free函数接受由heap_alloc返回的指针。它减去正确的偏移量以获取node_t结构的地址。不是简单地将块放入正确的bin中,而是检查提供块周围的块。如果这些块中的任何一个空闲,则可以合并块以创建更大的块。为了合并块,使用footer来获取前一个块的node_t结构和下一个块的node_t结构。例如,假设我们有一个名为to_free的块。为了获取这个块之前的块,我们减去sizeof(footer_t)以获取前一个块的footer。footer包含指向前一个块头的指针。为了获取下一个块,我们简单地获取to_free的footer,然后加上sizeof(footer_t)以获取下一个块。一旦完成所有这些操作并重新计算大小,块将被放回bin中。

项目及技术应用场景

SHMALL适用于以下场景:

  1. 操作系统开发初学者:对于刚开始学习操作系统开发的人来说,SHMALL提供了一个简单易懂的堆内存分配器实现,帮助理解内存管理的基本原理。
  2. 简化版内存分配器研究:对于那些对内存分配器内部工作原理感兴趣的人来说,SHMALL提供了一个简化版的malloc和free实现,便于学习和研究。
  3. 嵌入式系统:在资源受限的嵌入式系统中,SHMALL的小巧实现(约230行代码)可以作为一个轻量级的内存管理解决方案。

项目特点

  1. 易于理解:SHMALL的设计和实现非常简单,代码量少,便于初学者理解和学习。
  2. 双向链表管理:使用双向链表进行binning,便于管理和查找空闲块。
  3. 合并空闲块:支持合并相邻的空闲块,减少内存碎片。
  4. 快速最佳匹配:通过排序空闲列表,实现快速的最佳匹配查找。
  5. 易于扩展和收缩:堆的扩展和收缩操作简单,只需调整wilderness块的大小。
  6. 小巧高效:代码量小,占用资源少,适合资源受限的环境。

通过SHMALL,您可以轻松理解堆内存分配的基本原理,并在实际项目中应用这些知识。无论您是操作系统开发的新手,还是希望深入研究内存管理的专家,SHMALL都是一个值得尝试的开源项目。

heap_allocator A simple heap memory allocator in ~200 lines. 项目地址: https://gitcode.com/gh_mirrors/he/heap_allocator

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马冶娆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值