如何用C语言实现一个简单的内存分配器

本文介绍了如何使用C语言实现一个简单的内存分配器,包括malloc(), free(), calloc(), realloc()的功能实现。文章讨论了内存分配器的基础知识,程序的内存布局,并提供了代码示例。在实现中,通过增加内存块的header来存储尺寸和状态信息,通过全局锁处理并发访问,采用First-Fit策略来寻找合适大小的内存块。最后,文章提到了编译和使用自定义内存分配器的方法。" 132750279,19687572,遗传算法在网约车路径规划中的应用,"['遗传算法', '路径规划', 'MATLAB', '交通优化', '优化算法']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:https://arjunsreedharan.org/post/148675821737/memory-allocators-101-write-a-simple-memory

与本文相关的代码: github.com/arjun024/memalloc

可以访问译者的github ,阅读体验更佳...   

https://github.com/KatePang13/Note/blob/main/%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E5%99%A8.md

本文的话题是用C语言实现一个简单的内存分配器。这里我们将实现 malloc(), calloc(), realloc() and free()

这是一个入门水平的文章,不会涉及到每个细节。这个内存分配器不会追求速度和效率,也没有考虑内存分配的内存页对齐问题,我们的目标就是实现一个可以工作的内存分配器,仅此而已。

如果你想要查看完整的代码,可以访问github repo memalloc

在开始实现之前,我们需要先熟悉一个程序的内存布局。每个程序都运行在各自的虚拟地址空间中,这个虚拟地址空间包含5个部分:

Text section: 该部分包含供处理器执行的二进制指令序列 Data section: 包含已初始化的静态数据(non-zero initialized static data) BSS (Block Started by Symbol,以符号开头的块) : 包含未未初始化的数据. 未初始化的数据将会被初始化为0并被放在这个区域. Heap: 包含动态分配的数据. Stack: 包含自动分配的变量,函数参数,基指针拷贝等。

 

如图所示,stack 和 heap 的增长方向是相反的。有时候,我们将 data, BSS 和 heap 三个部分 统称为 "data segment",data segment的结尾由一个指针确定,叫做 program break, 简称 brk ,brk 指向 heap 的末尾处。

现在,我们要在 heap 上 分配更多的空间,我们需要请求系统往内存增长方向移动 brk,同理,释放内存的时候,需要请求系统往内存减小的方向方向移动brk。

如果我们的系统环境是Linux或者其他的类Unix系统, 我们可以使用系统调用 sbrk() 来操纵 program break 。

调用 sbrk(0) 获取 program break 的当前地址 . 调用 sbrk(x) ,x 为正数时,请求分配 x bytes 的内存空间 . 调用 sbrk(x) , x 为负数时,请求释放 x bytes 的内存空间 . 失败时,sbrk() 返回 (void*) -1.

老实说,sbrk() 并不是我们现在的最佳选择,更好的选择是 mmap()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值