自己动手写malloc

本文详述了如何自己动手实现malloc函数,基于Linux内存管理及sbrk原理,探讨了元数据设计、空间链表维护、内存分配与释放以及空闲块合并等关键步骤。malloc函数通过sbrk获取连续空间,并用元数据记录空间状态和大小,采用8字节对齐策略。同时介绍了避免频繁调用sbrk的方法以及my_malloc、my_free函数和coalesce_free_list的实现细节。
摘要由CSDN通过智能技术生成

接着上一篇博文:Linux下进程内存管理之malloc和sbrk 的知识来讲一下自己动手写malloc函数的实现细节。

如果你看了前文应该知道了进程的内存管理和malloc函数的实现原理。实际上malloc函数所分配得到的空间都是利用sbrk函数来得到的,只不过这个函数不应该每次用户调用malloc的时候都调用一次,这样开销太大,也没有必要。所以这里就需要在malloc中加入内存的分配、释放、合并等等操作。

首先需要说明的是,每次通过sbrk函数申请到的空间都是连续的,所以malloc函数需要管理的内存空间也是连续的。只不过随着用户多次的释放和申请,这些空间有的是用户使用状态,有些是用户释放状态:


元数据设计

就如图中所示,在每一段空间中,除了用户申请的空间之外,还需要一部分meta-data来管理该空间。在我的程序中,我把这部分的大小设置为了8个字节。而这8个字节不仅需要存储该段空间的大小,还需要标示下一段空间的起始位置。而我的设计就是前四个字节用来标示该段空间的长度,其中这个长度不仅包括数据段的长度还包括的meta-data的8个字节;而后4个字节用来标示改段空间是正在被用户使用还是空闲状态。

另外还有一个需要注意的地方就是对齐,因为分配对齐的空间开销更小,而且也便于之后的管理。在本程序设计中,我采用的是8字节对齐。比如用户如果申请一个99字节的空间,那么实际分配给他的空间应该是大于99的最小的8的倍数,即104,另外还需要加上8个字节的meta-data,所以总共申请的空间是112个字节。

再说一句题外话,在计算实际分配给用户的空间大小的时候不要使用除法,更有效率的方法是使用移位操作。比如用户需要申请size个字节长度的空间,那么计算实际分配的空间大小可以使用:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值