Memory management 嵌入式Linux:内存碎片

Memory management 嵌入式Linux:内存碎片,memory-management,embedded-linux,fragmentation,Memory Management,Embedded Linux,Fragmentation,在许多嵌入式系统中,内存碎片是一个值得关注的问题。特别是对于长时间(月、年等)运行的软件。对于许多项目,解决方案就是不使用动态内存分配,例如malloc/free和new/delete。尽可能使用全局内存,频繁分配和取消分配的类型的内存池是避免动态内存管理使用的好策略 在嵌入式Linux中,这是如何解决的?我看到许多库使用动态内存。操作系统是否有防止内存碎片的机制?它是否定期清理堆?还是应该避免在嵌入式环境中使用这些库?IMHO,在这两种情况下,您都可以搜索内存分配算法,这会导致较少的碎片。并且

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


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

IMHO,在这两种情况下,您都可以搜索内存分配算法,这会导致较少的碎片。并且,在测量内存需求后,配置此算法或内存分配实现


首先,我可以推荐。

没有一个非移动内存分配器可以避免至少一个日志(M/M)因素的碎片,其中M=最大对象请求的大小,M=最小对象请求的大小(这是Robson,1971年得出的经典结果)

我和做实时系统编程的人一起工作(包括空客),他们刻意避免使用动态内存分配,而不是使用池,正如您所提到的


然而,操作系统和内存分配之间有很大的区别。向程序员公开的动态内存分配是库的一部分,与操作系统没有什么关系(除了作为内存源)。Linux本身使用基于slab的内存分配器来实现其内部目的;我假设嵌入式Linux也会这样做,但我不确定。

这取决于您如何使用内存

Linux在大多数情况下使用虚拟内存,应用程序将内存视为连续的内存块。底层内核执行虚拟内存和物理内存之间的所有手动映射,因此您不必处理它。 从物理上讲,您的内存可能分散,但您的应用程序看不到这一点

现在,如果你真的想要连续的物理内存呢?这通常发生在您想要执行DMA或来自硬件的其他硬要求时。在这种情况下,您可以分配指向特定物理内存的内存页。但你必须把它作为一个例外,而不是规范


我设计系统的方式是,大多数驱动程序(除了“实时”驱动程序)都在用户空间中。这样,您就可以获得用户空间的所有好处(更多的库、语言),如果您有bug,就不会杀死内核,并且可以利用可用的虚拟内存。

空客的那些人在遇到使用动态内存的库时会做些什么?好吧,这种情况永远不会发生。您能提供更多关于如何使用动态内存的信息吗“分配一个指向特定物理内存的内存页”?我设计系统的方式是,大多数驱动程序(除了“实时”驱动程序)都在用户空间中。“听起来像是打字错误。什么意思?Daryl,使用/dev/mem从用户空间访问物理地址。实时驱动程序通常对延迟敏感,需要内核不断关注。只有在这种情况下,我才将驱动程序移动到内核空间。