嵌入式Linux:内存碎片

时间:2011-01-17 14:49:10

标签: memory-management embedded-linux fragmentation

在许多嵌入式系统中,内存碎片是一个问题。特别是对于长时间运行的软件(月,年等等)。对于许多项目,解决方案是不使用动态内存分配,例如malloc / free和new / delete。尽可能使用全局内存,频繁分配和释放的类型的内存池是避免动态内存管理使用的好策略。

在嵌入式Linux中,这是如何解决的?我看到许多库使用动态内存。是否存在操作系统用于防止内存碎片的机制?它会定期清理堆吗?或者应该避免在嵌入式环境中使用这些库?

3 个答案:

答案 0 :(得分:2)

没有非移动内存分配器可以避免至少一个log(M / m)因子的碎片,其中M =最大对象请求的大小,m =最小对象请求的大小(这是一个由Robson引起的经典结果,1971年。

我与那些进行实时系统编程的人(包括空中客车公司)一起工作,他们刻意避免使用动态内存分配,而不是像你提到的那样使用池。

然而,操作系统和内存分配之间存在很大差异。动态内存分配作为程序员的一部分,是库的一部分,与OS几乎没有关系(除了作为内存源)。 Linux本身使用基于slab的内存分配器用于其内部目的;我假设嵌入式Linux做了同样的事情,但我不确定。

答案 1 :(得分:1)

恕我直言,在任何一种情况下,您都可以搜索内存分配算法,这会导致更少的碎片。并且,在测量内存要求后配置此算法或内存分配实现。

我可以推荐TLSF作为开头。

答案 2 :(得分:1)

这取决于你如何使用内存。

Linux在大多数情况下使用虚拟内存,其中应用程序将内存视为连续的内存块。底层内核完成虚拟内存和物理内存之间的所有手动映射,因此您无需处理它。 从物理上讲,你的记忆可能会散乱,但是你的应用程序看不到它。

现在,如果你真的想要连续的物理内存怎么办?当您想要执行DMA或硬件的其他一些硬性要求时,通常会发生这种情况。在这种情况下,您可以分配指向特定物理内存的内存页面。但是你必须把它作为除了常态之外的例外。

我设计了我的系统,使大多数驱动程序(除了“实时”驱动程序)进入用户空间。这样你就可以获得用户空间的所有好处(更多的库,语言),如果你有错误就不要杀死内核,并利用可用的虚拟内存。