我希望在C中为内存受限的微控制器实现堆分配算法.我已将搜索范围缩小到我所知道的两个选项,但我对建议非常开放,我正在寻找有经验的人的建议或意见.
我的要求:
-Speed绝对有意义,但是次要问题.
- 定时确定性并不重要 - 需要确定性最坏情况时序的代码的任何部分都有自己的分配方法.
- 主要要求是碎片免疫力.该设备正在运行lua脚本引擎,这将需要一系列分配大小(32字节块上很重).主要要求是该设备长时间运行而不会将其堆转变为不可用状态.
另请注意:
- 作为参考,我们讨论的是Cortex-M和PIC32部件,内存范围从128K到16MB或内存(重点放在低端).
- 我不想使用编译器的堆,因为1)我希望所有编译器具有一致的性能,2)它们的实现通常非常简单,对于碎片来说是相同或更差的.
- 双重间接选项是因为巨大的Lua代码库,我不想基本上改变和重新验证.
我最喜欢的方法:
1)有一个二进制伙伴分配器,并牺牲内存使用效率(四舍五入为2的大小). - 这将(据我所知)要求每个订单/ bin的二叉树存储按内存地址排序的空闲节点,以便进行快速伙伴块查找以进行重新链接.
2)有两个二进制树用于空闲块,一个按大小排序,一个按内存地址排序.(所有二叉树链接都存储在块本身中) - 使用对表的大小查找最佳匹配 - 然后通过地址从另一个树中删除该块 - 释放将按地址查找相邻块以进行重新连接
- 两种算法还需要在分配块的开始之前存储分配大小,并且具有作为2减4(或8取决于对齐)的幂的块.(除非他们将二叉树存储在别处以跟踪按内存地址排序的分配,我认为这不是一个好选择)
- 两种算法都需要高度平衡的二叉树代码.
- 算法2没有要求通过舍入到2的幂来浪费存储器.
- 在任何一种情况下,我都可能有一个由嵌套位字段分配的固定32字节块,用于卸载此大小或更小的块,这将不受外部碎片的影响.
我的问题:
- 有什么理由为什么方法1对碎片的免疫力比方法2更强?
- 我是否有任何可能符合要求的替代方案?
问题: 在 Node.js 中,如果将可读流通过管道传输到可写流,并且两者都超出范围,则这对流是否会在读取器完成之前被垃圾收集?(因为它们现在无法访问)
背景: 我试图了解管道对流对象生命周期的影响。我的操作假设管道代表两个流之间的双向引用,因此如果一个流可访问,则两个流都不会被垃圾收集(当然,直到读取器结束并且管道关闭)。
因此,有了这样的假设:运行时中是否有任何东西可以在管道处于活动状态时或在 Readable 上的“数据”侦听器执行等效操作时保持流的存在?(除了明显的,例如事件侦听器函数和其他对象中嵌入的引用)
一个具体的例子是将文件读取流传输到 http 响应对象。如果我“管道后忘记”,并且不保留对文件或响应流的引用,那么此过程是否容易在中途中断?
或者,如果某些东西阻碍了管道流的 GC,那么两个套接字之间的双向管道是否会无限期地存在,即使它们都无法访问?(并且完全无法关闭?)