Title: Nuttx内存管理的总结,碎片问题研究。
Describe: nuttx内存的管理方式,碎片问题,测试及总结。
Time: 2012.07.10—2012.07.16
Author: xichen
1. memory manage of nuttx:
Real-time os.小巧,实时,完全可扩展。嵌入式实时的属性,决定其为非虚拟内存管理机制,防止不确定性的I/O阻塞时间,减少程序运行时间的不确定性。支持配有MMU的嵌入式微处理器模式。
对比分析,vxworks, uc/os II的内存管理对比。
2. memory manage design:
Nuttx从算法开始比较重视碎片的产生问题,通过算法在规避碎片的产生。选择了类似buddy的算法,同时使用了最先匹配算法的思想。一方面能够学习最先匹配算法快速检索到合适的内存块地进行内存的申请释放,另一方面降低了buddy算法内存使用率较低低的问题。
以一般情况进行描述(支持small address),在.data段存有19个大小为16bytes的节点结构。0~18对应块大小为2的次幂,具体为16byte~4Mb.
在启动时会从堆中分配内存给内存管理部分作为初始内存块,在内存块上执行内存分配工作,当然之后也可增加大小。接下来的过程,根据需要执行分配过程,申请,分配,再分配,及内存释放。因为将相邻内存块相邻起来的措施能够显著地减少内存碎片,所以在执行过程中,nuttx内存管理算法比较重视相邻内存块的状态,无论是已经alloc_node还是free_node都在数据结构中存在preciding size选项,一方面为了减少内存碎片,另一方面可以增加检索的速度。
代码流程:
算法优势:
3.碎片产生原因分析
内存碎片:空闲无法被使用的内存,原因大多是小而不连续,内存碎片的程序取决于内存分配程序,采用的策略方法。一个不断产生内存碎片的系统,不管产生的内存碎片多么小,只要时间足够长,就会将内存用完。
为了防止产生小而不可使用的空闲块,存在阀值C。
内存分配程序浪费内存的基本方式有三种:即额外开销、内部碎片以及外部碎片。
Nuttx针对以上问题作出的方案:
运行时存放分配块信息的数据结构就是其管理的内存。可以减少额外开销。
内存分配始于被16整除的地址(与处理器体系结构有关),会产生一定内部碎片。即分配多出申请大小部分的空闲内存为内部碎片。但是在系统运行期间,分配程序的策略是稳定不改变的,实际上额外开销和内部碎片在整个系统中保持不变,实际上可以忽略其威胁。
外部碎片的产生是当已分配内存块之间出现未被使用的差额时,就会产生外部碎片。外部碎片是嵌入式系统开发人员关注的重点,也即是常说的内存碎片。
关于数值的理解,两种极端的情况可以解释:当内存碎片为0时,意味着可分配内存在一块block上,为完整的一块。
当内存碎片为1时(达到之前已崩溃),可分配的最大内存块为0,意味着无法分配内存。一个系统有 5M 字节的空闲内存,当它可用来分配的最大内存块为 50k 字节时,其内存碎片为99%
在nuttx中,对应为 1-mxordblk/fordblks。
可以具体查看Nuttx的代码
4.测试与结果分析
测试代码(nuttx附带的mm_test.c):
测试代码修改(by xichen):
测试结果:
外部碎片公式:
5.结论:
内存碎片在xx情况下比较多……
6.解决办法
从代码分析,nuttx与vxworks在内存管理方面有比较多的相似之处较多,可以考虑结合vxworks内存管理方式,从vxworks内存管理算法改进入手(已经有较多改进版算法),分析具体需要做出对策。
7.问题
1.有资料表明,在短暂运行时,碎片率一般较低,算法的缺陷在小规模数据上难以体现,而运行2周以上,部分系统会出现碎片率99%的情况。
2.如果使用vxworks中比较好的算法的研究结果,或许能够更好地规避内存碎片的产生。但是代码的改动势必很大,原生态系统。
参考: