C++ 在任务关键型/生命关键型软件中使用动态分配

C++ 在任务关键型/生命关键型软件中使用动态分配,c++,C++,在任务关键型/生命关键型系统中使用动态分配安全吗?还是应该避免使用动态分配?如果您正在编写此类软件,您应该有一本关于您符合的规范(FAA、NATO、FDA等)的大书,说明您能做什么和不能做什么,它会告诉您 然而,总的来说;不,因为你描述的系统很难证明是正确的。虽然在生命关键型软件中,通常必须有硬件负责在发出错误条件信号时重新启动软件(即,软件必须每100ms重置一次的看门狗计时器,以防止硬件重置)最好避免它。随着时间的推移,系统中最小的内存泄漏将导致系统崩溃。例如,像汽车和飞机这样的生命关键系统

在任务关键型/生命关键型系统中使用动态分配安全吗?还是应该避免使用动态分配?

如果您正在编写此类软件,您应该有一本关于您符合的规范(FAA、NATO、FDA等)的大书,说明您能做什么和不能做什么,它会告诉您


然而,总的来说;不,因为你描述的系统很难证明是正确的。虽然在生命关键型软件中,通常必须有硬件负责在发出错误条件信号时重新启动软件(即,软件必须每100ms重置一次的看门狗计时器,以防止硬件重置)

最好避免它。随着时间的推移,系统中最小的内存泄漏将导致系统崩溃。例如,像汽车和飞机这样的生命关键系统不使用动态分配

我所研究过的所有交易系统和其他银行软件都大量使用动态分配,对于使用它们的IBs来说,它们是至关重要的任务。我更喜欢避免在生活关键系统上工作,所以不能为他们说话。< / P> < P>我是C++新手。 但既然一切都在记忆中;你会用它的。 所以程序员为什么要避免它


注:欢迎提供信息性意见。:)

当我无法完全避免在“不能失败”类型的应用程序中进行动态分配时,我使用的一种方法是,在应用程序首次启动时,只分配一次所需的缓冲区和其他数据结构,因此它们永远不需要释放。循环和释放/删除与新闻/分配不一致,这往往会导致问题


当这还不够时,我使用的另一个技巧是使用我自己的自定义版本malloc和free运行,代码会特别注意检查常见的错误情况,例如释放已经释放的内容,定期验证freelist指针完整性,查看总内存使用是否随时间增加,等等。

对于关键软件,您希望您的系统具有尽可能确定的行为

动态内存、内存碎片、可能的泄漏,以及在某些情况下(不太罕见)malloc的错误行为,将使获得100%确定性变得更加困难


也就是说,如果您的程序的一部分(比如算法)需要动态分配,并且您可以证明您的内存分配和取消分配(空闲)将是确定性的(请参阅RickNZ的宝贵说明)那么你就更接近于拥有一个确定性系统。

我觉得你完全可以在任务关键型应用程序、MC应用程序中使用动态内存分配,它们不一定是RT应用程序,它们只是意味着它们对业务运作至关重要。当使用动态内存分配结构时,总是必须进行大型压力测试,当模拟真实的客户环境时,这可能会显示内存泄漏,这样您才能理解动态内存分配的影响,是不是有一种影响。

在嵌入式系统和生命与任务关键型应用程序中,其目的是减少对动态内存分配的依赖。通常,在运行时无法确定实例数时,需要动态内存。例如,从用户获取输入时使用动态内存

从传感器读取数据和从其他来源获取实时数据时,不使用动态存储器。许多应用程序使用队列并仅保留当前数据

嵌入式系统在使用动态内存分配时,会有某种内存回收算法,无论是垃圾回收(GC)还是分配后的内存整合。如果没有可用内存,许多多线程和多任务系统将强制执行垃圾收集、删除不必要的变量或等待一段时间,然后重试分配


如果绝对没有可用的内存(并且所有回收内存的工作都已耗尽),那么是时候参考需求规范,看看它是怎么说的了。

我认为如果没有动态内存分配,编写任何合理的大型系统都是非常困难的

但是默认的内存管理是一个通用内存管理器,只有非常有限的保证。

如果您有特定的需求,那么您应该编写一个符合您需要的需求的专用内存管理库。

嗯,您无法避免动态分配。不知何故,在某个地方,您的堆栈至少必须得到分配。通常,当人们开始过分担心某样东西是在堆栈上还是堆上时,这表明他们变得有点滑稽。与堆相关的错误一样,可以有多个或多个与堆栈相关的错误,但在测试中,只要避免使用自己内存管理的lib,就可以很容易地捕获与堆相关的错误。但是C++最初并不是这种应用程序的最佳语言。

当然,这没有问题。但是:分配失败不应导致程序失败

这一原则扩展到实时程序。实时
malloc
应该有一个上限;在某些情况下,内存可能无法及时使用,并且必须返回NULL


现在,有人可能想知道,当内存分配失败时,为什么任务关键型系统可以工作。这很简单:“工作”通常不是黑白状态。任何有趣的任务关键型系统都有“应”和“应”的混合需求。当分配内存失败违反“应该”要求时,可以使用动态内存分配。例如,“系统应支持200个小部件,并应支持400个”-静态分配前200个小部件,动态分配下200个小部件。

如果你必须在这里问这个问题,那么你不应该问。这不仅仅是生命攸关的问题