分析测试百科网

搜索

喜欢作者

微信支付微信支付
×

AWorks编程:嵌入式C语言的内存管理(三)

2020.10.05
头像

王辉

致力于为分析测试行业奉献终身

内存泄漏令开发者头痛的地方也正是这个原因,内存泄漏的问题往往无法在第一时间被发现!而对于不熟悉内存管理的开发者更是难以定位错误。

对于动态内存的操作,需要时刻记住:当一块申请的内存不再使用的时候,必须及时释放。一个malloc操作需要对应一个free操作。

4、内存对齐

在很多的场合下,分配的内存不仅要满足申请的大小,也需要进行对齐才能够使分配的空间能够被转换成除char之外其他的结构类型。系统对内存的分配一般会以int型变量的字节数进行对齐。AWorks提供的aw_mem_align接口可以使用户获取自定义对齐的内存空间。

类型对齐相关的知识请读者自行查找相关资料,这里不再展开细讲。

 内存管理算法

接下来我们学习一下怎么去对堆空间的内存进行管理。这里我们主要介绍嵌入式中两种常用的内存管理算法。

1、链表法

链表法维护着两个链表,两个链表分别记录着已分配的使用内存段和未分配的空闲内存段。当申请一片内存的时候,从空闲内存段中找到合适的块分配给用户,同时链入使用内存段。而释放的时候则从已使用的内存段找到相应的表,然后释放到空闲内存段中以供下次分配。

现在我们以最先匹配算法为例介绍算法的细节。最先匹配算法是从空闲链表的表头出发,依次寻找空闲的内存,一旦找到足够大的连续区域则将其返回给用户。

还记得前面说的,管理内存区域需要额外的记录信息,链表法一般是在操作内存空间的时候申请额外的空间记录相应的信息。我们假定下图红色部分记录着使用的内存区,青色记录空闲的内存区,这里使用free link链表维护空闲内存段,used link维护使用的内存段:

程序运行一段时间之后,假设堆内的空间分布如下:

空闲区和使用区的信息都被两个表维护着。

现在用户需要申请一片大小为3k的内存,系统会从free link出发,先是找到2k的空闲区,由于2k的空间不够用,接下来再继续寻找,找到了4k的区域,发现4k的区域够大了,就会将4k的空间取走3k的空间并将其链入used link。

尽管后面3k的空间更加适合分配,但是最先匹配算法一旦找到足够大的空间便不会继续往下寻找。


互联网
文章推荐