Operating system 内存池与malloc

Operating system 内存池与malloc,operating-system,real-time,rtos,Operating System,Real Time,Rtos,我正在浏览一些实时操作系统规范,我读到在RTOS中,我们通常不喜欢使用malloc。原因是:对于性能问题,我们不应该使用malloc,因为通过malloc分配内存非常耗时,而且跟踪分配内存的开销更高 现在在实时系统中,所有进程都有时间限制,我们通常不使用malloc。我很好奇,开始研究RTOS运行时内存是如何分配的,我发现了内存池。现在有人写道,内存池实际上意味着固定大小的块分配。现在,内存池的优点是它不会受到碎片的影响。怎么可能呢?假设我们有3个4字节的池,而应用程序需要10个字节,那么在这种

我正在浏览一些实时操作系统规范,我读到在RTOS中,我们通常不喜欢使用malloc。原因是:对于性能问题,我们不应该使用malloc,因为通过malloc分配内存非常耗时,而且跟踪分配内存的开销更高

现在在实时系统中,所有进程都有时间限制,我们通常不使用malloc。我很好奇,开始研究RTOS运行时内存是如何分配的,我发现了内存池。现在有人写道,内存池实际上意味着固定大小的块分配。现在,内存池的优点是它不会受到碎片的影响。怎么可能呢?假设我们有3个4字节的池,而应用程序需要10个字节,那么在这种情况下,内存池将受到内部碎片的影响


内存池如何工作以及如何分配内存?应用程序是否在编译时获取池,就像特定应用程序从4字节大小的池中获取3个池一样?如果它们需要的内存无法放入池中,该怎么办。这种系统中是否存在许多大小不同的内存池?请给我解释一下。

好吧,碎片将取决于内存池的实现。通常,内存池是固定大小的内存块池。当某个对象需要一个大小相同的内存块时,它就会进入该池。因此,不存在碎片,因为所有需要该大小的块的东西都是从该大小的块池中获得的

现在,如果不存在特定大小的块池,则可以使用更大大小的块池。如果出现这种情况,那么从技术上讲,就会出现碎片,因为分配的内存块的某一部分没有被使用(碎片化)


如果所有内存池都提供了所需大小的块,那么就不会有碎片。

池不会消除碎片,但它们可以显著减少碎片,还可能减少分配大量非常小的块的开销。一个好的方案是一个库,它允许客户机代码为其每个高度伸缩的结构创建一个池。在创建池时,可以指定块大小、初始分配和增长的块数,以及用于调试的文本名称

要分配块,请将池ID传递给分配器。每当池中没有空闲块时,它就会分配一个连续的块并使它们可用,并返回其中一个块。每当一个块被释放时,如果该块的块中的所有块都是空闲的,那么它就会释放该块

对于调试,有一个例程可以打印所有池,给出描述、分配的数量,以及可能的其他统计信息,如可用池的数量(如果这个数量很高,则存在碎片问题)和分配的最大值。非常有助于查找内存泄漏

对于这种类型的库,最糟糕的情况是子系统分配了大量的块,然后在系统生命周期的早期随机释放了大部分块。许多块仍将被分配,但使用的块很少。最好的情况(与malloc相比)是需要具有广泛变化的生命周期的新块的连续循环,对于必须长时间运行的系统,如某些嵌入式系统

这是最简单的,最适用于单线程应用程序。对于多线程应用程序,必须注意使其线程安全,并且您可能需要模仿malloc()经常在幕后进行的优化,以最大限度地减少锁定开销(例如,每个线程“竞技场”)