我几个月前开始使用C语言为空间应用程序和使用C++语言的微控制器开发实时系统软件。在这类系统中,有一个经验法则,就是永远不要创建堆对象(因此没有malloc/new),因为这会使程序不确定性。当别人告诉我这个经验法则时,我无法验证其正确性。那么,这是一个正确的说法吗?
对我来说纠结的地方在于,据我所知,确定性意味着再次运行程序将导致完全相同的执行路径。就我的理解而言,在多线程系统中会出现这个问题,因为每次运行相同的程序可能会按不同的顺序运行不同的线程。
我几个月前开始使用C语言为空间应用程序和使用C++语言的微控制器开发实时系统软件。在这类系统中,有一个经验法则,就是永远不要创建堆对象(因此没有malloc/new),因为这会使程序不确定性。当别人告诉我这个经验法则时,我无法验证其正确性。那么,这是一个正确的说法吗?
对我来说纠结的地方在于,据我所知,确定性意味着再次运行程序将导致完全相同的执行路径。就我的理解而言,在多线程系统中会出现这个问题,因为每次运行相同的程序可能会按不同的顺序运行不同的线程。
双倍内存页面
这个算法是一个更复杂的系统,它只允许大小为2的幂的块。这种设计使得合并自由块变得更容易,并且显著减少了碎片化。该算法的核心基于一组自由列表的数组。每个列表对应一组大小为2的幂的块。例如,有一个专门用于64字节自由块的列表,另一个用于128字节块,依此类推。这种结构化方法确保特定大小的块可以随时使用,优化内存管理和访问。这种方法确保了高效的块分配和释放操作,充分利用了2的幂大小约束。通过将2的幂块大小与自由列表数组和二分搜索机制相结合,该算法在内存效率和操作速度之间取得了平衡。这是一种相当高效的内存分配方法,特别适用于内存碎片化是一个重要问题的系统。该算法将内存划分为分区,以尽量减少碎片化,而“最佳适配”算法则在页面中搜索最小的足够满足分配需求的块。此外,由于其算法化的内存分配和释放方法,该系统对于故障具有抵抗能力。合并操作有助于确保在释放后可以重新形成大的连续内存块,从而减少随时间推移的碎片化可能性。合并依赖于具有相同大小的自由块可用,但并非总是如此,因此该系统并不能完全消除碎片化,而是旨在将其最小化。 Cortex-M7上的性能测试结果。总是需要进行权衡。程序的运行环境和执行的任务应该是决定是否使用 HEAP 的基础。
当你想在多个函数调用之间共享数据时,堆对象非常高效。只需传递指针,因为堆是全局可访问的。但也存在一些缺点,例如某些函数可能释放了此内存,但仍可能在其他地方存在一些引用。
如果在完成工作后未释放堆内存并且程序继续分配更多内存,则在某些时候 HEAP 将耗尽内存并影响程序的确定性特性。
.data
和.bss
有什么不同...? - Lundin
rdrand
的指令,您可以从一个普通的用户空间进程中执行它。 它从热噪声发生器提供真正的硬件随机性,并使用AES进行条件处理(除非NSA削弱了设计…)。 当然,正如David指出的那样,rdtsc
也是不确定的,特别是考虑到仅一个进程,但他提出了不同时钟域之间的同步给出了一些真正的不确定性。 - Peter Cordes