运行环境之列车算法

尽管世代方法在处理年轻对象时非常高效,但它在处理成熟对象时却相对低效,因为每当一个垃圾回收过程涉及某个成熟对象时,该对象都会被移动,而且它们不太可能变成垃圾。另一种 被称为列车算法的增量式回收方法用于改进对成熟对象的处理。它可以用来回收所有的垃圾。 但是更好的方法是使用世代方法来处理年轻的对象,只有当这些对象经历了几轮世代回收之后仍然存在,才将它们提升到另一个由列车算法管理的堆区。列车算法的另一个优点是我们永远不需要进行全面的垃圾回收过程,而在世代垃圾回收中却仍然必须偶尔那样做。

为了描述列车算法的动机,我们首先看一个简单的例子。该例子告诉我们为什么在世代方法中必须偶尔进行一轮全面的垃圾回收。给出了位于两个区域i和j中的两个相互连接的对象,其中j>i。因为这两个对象都有来自其区域之外的指针,只对区域i或只对区域j进行回收都不能回收这两个对象。然而,它们可能实际上是一个循环垃圾结构中的一部分,没有外部链接指向该垃圾结构。一般来说,这里显示的对象之间的“链接”可能涉及很多对象和一条很长的引用链。

并行垃圾回收算法

我们必须控制启动跟踪过程的频率,这很重要。跟踪步骤就像是一场赛跑。增变者创建出必须被扫描的新对象和新引用,而跟踪过程则试图扫描所有可达对象,并重新扫描同时产生的脏卡片。
下面给出一个并行、并发垃圾回收算法的大概描述,我们可以仔细看一下,:

1)扫描每个增变者线程的根集,将所有可以从根集中直接到达的对象设为待扫描状态。完成这一步的最简单的增量式做法是等待一个增变者线程调用内存管理器,如果那时它的根集还没有被扫描,就让它扫描自己的根集。如果所有其他跟踪工作都已经完成,而某个增变者线程还没有调用内存分配函数,那么必须暂停这个线程,扫描它的根集。

动态规划的算法

计算一个结点n的代价包括在给定寄存器数量的情况下对S求值时所需要的全部加载和保 存运算,也包括了计算S的根结点处的运算符所需要的代价。代价向量的第0个元素存放的是把子树S的值计算出来并保存到内存的最优代价。只需要考虑S的根结点的各子树的最优程序的 不同组合,就可以生成S的最优程序。这是由连续求值的性质来确保的。这个限制减少了需要考虑的情况。
动态规划算法有三个步骤(假设目标机器具有r个寄存器):

1)对表达式树的每个结点n自底向上地计算得到一个代价数组C,其中C的第i个元素 C[i]是在假设有i(1≤i≤r)个可用寄存器的情况下对以n为根的子树S求值并将结果存放在一个寄存器中的最优代价。

变量表达式算法可用

交汇运算是交集运算,任何发现x+y在某个程序点上不可用的理由都会在流图中沿着所有可能的路径向前传播,直到x+y被重新计算并再次变得可用为止。第二,只有两个理由可能会使x+y变成不可用的。

1)因为x或y在基本块B中被定值且其后没有计算x+y,因此x+y被杀死。在这种情况下,我们第一次应用传递函数fs的时候,x+y就会从OUT[B]中被删除。

2)在某些路径中,x+y—直没有被计算。因为x+y肯定不会在OUT[ENTRY]中,并且它也不会在上面说的那条路径中被生成。我们可以通过对路径长度的归纳来证明x + y最终会从这条路径的所有基本块的IN和OUT值中删除。

通用框架的迭代算法

数据流框架具有有穷高度的情况。因为每个IN[B]和OUT[B]的值在每次被改变时都会减小,而程序在某一轮循环中没有值改变时就会停止,因此算法的迭代次数不会大于框架高度和流图结点个数的乘积,因此算法必然终止。
我们可以对算法进行推广,使之能够处理各种数据流问题。通用数据流框架的迭代解法。

输入:一个由下列部分组成的数据流框架:

1)一个数据流图,它有两个被特别标记为ENTRY和EXIT的结点。

2)数据流的方向D。

3)一个值集V。

«1»
最近发表
控制面板
您好,欢迎到访网站!
  [查看权限]
网站分类
搜索
Tags列表
网站收藏
图标汇集
  • 订阅本站的 RSS 2.0 新闻聚合
友情链接

热门搜索: 外链域名 高外链域名 高收录域名

Copyright www.thyst.cn. Some Rights Reserved.