基于区域的内存管理

时间:2009-03-28 00:06:03

标签: memory-management language-design

我正在设计一种高级语言,我希望它具有C ++的速度(它将使用LLVM),但是像C#一样安全且高级。垃圾收集很慢,新/删除是不安全的。我决定尝试使用“基于区域的内存管理”(在网上有一些关于它的论文,主要是针对函数式语言)。使用它的唯一“有用”语言是Cyclone,但也有GC。基本上,对象在词法堆栈上分配,并在块关闭时释放。对象只能引用同一区域或更高区域中的其他对象,以防止悬空引用。为了使这更加灵活,我添加了可以在堆栈中上下移动的并行区域,并通过循环保留。在大多数情况下,类型系统可以验证分配,但在某些地方需要进行低开销运行时检查。

例如:

region(A) {
    Foo@A x=new Foo(); //x is deleted when this region closes.
    region(B,C) while(x.Y) {
        Bar@B n=new Bar();
        n.D=x; //OK, n is in lower region than x.
        //x.D=n; would cause error: x is in higher region than n.
        n.DoSomething();
        Bar@C m=new Bar();
        //m.D=n; would cause error: m and n are parallel.
        if(m.Y)
            retain(C); //On the next iteration, m is retained.
    }
}

这看起来有用吗?我是否需要添加非词法作用域,引用计数区域?我是否需要添加可以引用任何对象的弱变量,但是检查区域删除?你能想到任何难以用于这个系统或会泄漏的算法吗?

5 个答案:

答案 0 :(得分:13)

我会阻止你尝试地区。问题是,为了保证区域安全,你需要一个非常复杂的类型系统---我相信你已经看过Tofte和Talpin的论文,你知道所涉及的复杂性。即使你确实让地区成功运作,你的程序很可能需要一个人的生命周期是程序的生命周期 - 而且该地区至少必须进行垃圾收集。 (这就是Cyclone有区域 GC的原因。)

由于您刚开始使用,我建议您使用垃圾回收。现代垃圾收集器可以非常快速地制作而无需花费很多精力。主要问题是从连续的自由空间进行分配,以便快速分配。它有助于将AMD64或其他具有备用寄存器的机器作为目标,因此您可以使用硬件寄存器作为分配指针。

有许多好的想法可以适应;其中一个最容易实现的是基于页面的收集器,如Joel Bartlett的主要复制收集器,其中的想法是仅从完全空的页面分配。

如果你想学习现有的垃圾收集器,Lua有一个相当复杂的增量垃圾收集器(所以没有可见的暂停时间),实现只有700行。它足够快,可用于许多性能重要的游戏中。

答案 1 :(得分:4)

如果我使用基于区域的内存管理实现一种语言,我可能会阅读A language-independent framework for region inference。也就是说,自从我调查这些东西已经有一段时间了,我确信最先进的技术已经发展,如果我甚至不知道最先进的是什么。

答案 2 :(得分:0)

那么你应该去学习苹果内存管理。它有发布池和区域,这听起来很像你在这里做的。

我不会评论“GC很慢”的评论,

答案 3 :(得分:0)

您可以从Tofte和Talpin关于基于区域的内存管理的论文开始。

答案 4 :(得分:-1)

如何返回动态创建的对象?谁会“拥有”它并负责释放记忆?

Refcounting或GC非常常见,因为它们几乎总是最佳选择。分代垃圾收集器非常有效。