分析测试百科网

搜索

喜欢作者

微信支付微信支付
×

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

2020.10.05
头像

王辉

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

当用户用完资源的时候,把申请的3k还回去,系统会从used link找到申请的内存,将链入free link以供下次分配,然后将空闲相邻的内存块合并成完整的一块:

现在考虑这样的一种情况:假设用户要申请5k的内存块,系统能够提供吗?并不能。

虽然空闲的内存块一共有9k(2k+4k+3k),但是9k的内存并不连续,因此无法分配给用户。这就是外部内存碎片——虽然整个空间的空闲内存足够大,但却因为零碎的内存块割裂了连续内存而无法分配出去。

其他的链表法还有最佳匹配算法,下次匹配算法等.有兴趣的读者可以自行查找相关资料。

2、位图法

使用位图法,系统的内存会被划分成固定的内存块。再用变量的其中一位指示其中的一块内存:

图中的一个方格代表一块固定大小的内存块,这里假定1k。用一个16位的变量指代16k的内存段。如果一个块是空闲的,则用0表示,如果是被使用的,则用1表示。

下图的第1,2个内存块和第7,8,9个内存块都被使用了,而相应的位都被置1说明被占用了。

相比链表法,位图法采用更少的额外空间记录内存堆的信息,而且由于申请与释放都是整块的,会产生更少的外部碎片。

但是假如用户只申请几个字节的内存,但是却分配了1k的内存块,则大量的空间不会被使用,这样导致的无法使用的内存我们称为内部内存碎片。

减少内部内存碎片的其中一个方法是合理地选择内存块的大小,固定尺寸较小的内存块导致的内存碎片会更小——当用户申请几字节的内存,比起固定1k的内存块,固定16字节的内存块产生更少的碎片。但是固定尺寸变小了也会导致需要更多的位记录内存的信息。

现在有很多优秀的位图算法——将内存分成不同的固定大小获取更快的分配速度和更少的内存碎片,有兴趣的读者可自行查找相关资料。


互联网
文章推荐