对于实时编程,引用计数在确定性方面是否优于垃圾收集?

Ste*_*eve 12 garbage-collection programming-languages functional-programming real-time

如果您正在设计一种具有自动内存管理功能的编程语言,那么使用引用计数是否允许使用垃圾收集器无法实现的确定性保证?

针对功能语言和命令式语言,这个问题会有不同的答案吗?

Nor*_*sey 15

使用引用计数是否允许使用垃圾收集器无法实现的确定性保证?

保证这个词是强有力的.以下是您可以通过引用计数提供的保证:

  • 调整引用计数的赋值的常量时间开销.

  • 释放引用计数为零的对象的恒定时间.(关键是你不能马上减少该对象的子项;相反,当使用该对象来满足未来的分配请求时,你必须懒惰地这样做.)

  • 当相关空闲列表不为空时,分配新对象的持续时间.这种保证是有条件的,不值得.

以下是您无法保证引用计数的一些事项:

  • 分配新对象的恒定时间.(在最坏的情况下,堆可能会增长,并且根据系统的不同,组织新内存的延迟可能相当大.或者更糟糕的是,您可能会填满堆而无法分配.)

  • 回收并重用所有无法访问的对象,同时保持其他操作的恒定时间.(标准参考计数器不能收集循环垃圾.有各种巧妙的解决方法,但通常它们会使简单操作的常数时间保证无效.)

现在有一些实时垃圾收集器提供了关于暂停时间的非常有趣的保证,并且在过去的5年中,在引用计数和垃圾收集方面都有相当有趣的发展.从我作为一个知情的局外人那里,没有明显的赢家.

最近关于引用计数的一些最佳工作是IBM的David Bacon和Technion的Erez Petrank.如果您想了解复杂的现代参考计数系统可以做什么,请查阅他们的论文.除此之外,他们还以惊人的方式使用多个处理器.

有关内存管理和更一般的实时保证的信息,请查看国际内存管理研讨会.

针对功能语言和命令式语言,这个问题会有不同的答案吗?

因为你询问了保证,没有.但对于一般的内存管理,性能权衡对于命令式语言(大量突变但分配率低),不纯的函数式语言(几乎没有任何突变但是高分配率)以及纯粹,懒惰的函数式语言(批次)而言是完全不同的突变 - 所有那些认为正在更新 - 和高分配率).

  • “所有不可访问的对象都被回收并重新使用,同时保持其他操作的恒定时间”。鉴于问题在于创建新语言,您可以选择强制执行单向堆(例如,像Erlang和Mathematica一样),这样就可以保证回收所有不可访问的对象并重新使用它们,同时为其他操作保持恒定的时间。 (2认同)

Oak*_*Oak 7

使用引用计数是否允许使用垃圾收集器不可能的确定性保证?

我不知道怎么样.降低对象的引用计数的过程不是时间限制的,因为该对象可以是任意大对象图的单个根.

解决实时系统GC问题的唯一方法是使用并发收集器或增量收集器 - 无论系统是否使用引用计数; 在我看来,参考计数和"收集"之间的区别无论如何都不准确,例如,利用引用计数的系统可能偶尔会执行一些内存扫描(例如,处理周期).

您可能对IBM的Metronome感兴趣,而且我也知道Microsoft已经在良好的实时内存管理方面做了一些研究.