[在实时应用程序中使用malloc

问题描述 投票:0回答:1

我们的一个实时应用程序出现了问题。想法是每2ms(500 Hz)运行一个线程。在应用程序运行了半小时左右后,我们注意到该线程落后了。

经过一些讨论,人们抱怨实时线程中的malloc分配,或者根本原因是malloc分配。

我想知道,在实时线程中避免所有动态内存分配总是一个好主意吗?

Internet对此资源很少?如果您可以提出一些讨论,那我们也将非常有用。

谢谢

c linux malloc real-time
1个回答
0
投票

[第一步是分析代码,并确保您确切地了解瓶颈所在,您可以自己自己检测一下例程的几个部分,并以固定间隔转储最小/平均/最大持续时间。您想查看最坏的情况(最大),以及平均持续时间是否随着时间的流逝而增加。

取决于对象的寿命短,可以浪费多少内存以及预先知道多少需求,可以采用几种方法:

  1. 常规用途分配(标准库或任何第三方实现中的malloc):如果您的RAM数量“足够”,许多短期对象并且没有严格的延迟要求,则是最佳方法

    • PROS:适用于开箱即用的任何对象大小,熟悉的界面,内存是动态共享的,如果内存不是问题,则无需“提前计划”
    • CONS:在分配和/或重新分配期间会稍微降低性能,在对不同大小的对象进行大量分配/取消分配时内存碎片问题,运行时分配是否会失败并不确定,并且在运行时无法轻松缓解]
  2. 内存池

  3. :在大多数情况下内存有限且要求低延迟的最佳方法
  • [PROS:在任何合理的实现中,分配/取消分配的时间都保证为O(1),不会出现碎片,更容易预先计划其大小,在运行时分配失败(很可能)更容易缓解
  • CONS:适用于单个特定的对象大小-程序其他部分之间不共享内存,需要对池的正确大小进行规划,否则有可能浪费内存的风险
  • 单个静态分配的对象

  • :长寿命对象的最佳方法
    • PROS:完全没有分配-在应用程序生命周期中所有必需的对象都存在,分配/解除分配没有问题
    • CONS:如果对象应该短命,则会浪费内存
    © www.soinside.com 2019 - 2024. All rights reserved.