论文部分内容阅读
随着对多核技术的深入研究与多核体系结构的广泛应用,多线程程序的开发与维护问题越来越引起人们的重视。其中,多线程程序运行时对内存访问顺序的不确定性常为程序带来数据竞争、死锁等问题。由于上述程序错误发生的不确定性,以及程序出错的位置与引发错误的具体原因往往没有直接关系,所以对多线程程序错误的检测与排除变得非常困难。对于由多线程程序运行时的不确定性引发的问题,学术界提出了多种例如数据竞争检测、确定性回放等方法用于检测与排错。但是,这些方法都面临着相同的性能瓶颈。数据竞争检测算法一般会引入2x~10x的额外运行开销,而确定性回放系统平均额外开销可达10x~100x。巨大的性能开销阻碍了这些方法的广泛应用。数据竞争检测算法与确定性回放算法的主要性能开销来自对程序内存访问的监控:动态数据竞争检测算法需要对程序的内存访问进行监控以找出运行时的数据竞争错误;确定性回放算法需要记录不同线程对内存访问的顺序来确定性的重现程序运行。因此,如何减少上述系统在内存监控上的开销是系统设计者面临的一个共同问题。在多线程应用程序中中存在着大量只被赋值一次的对象。这类对象首先被某个线程写操作赋值,之后被多线程只读访问。我们称这类对象为单赋值对象。虽然单赋值对象在程序运行的生命周期中能够被多个线程访问,但是除第一次的赋值写访问之外,其他访问均为读操作,所以,对单赋值对象的内存访问不需要被数据竞争、确定性回放等系统监控。实验数据表明,单赋值对象内存访问在实际内存访问中占很大比例。分析找出单赋值对象并去除对单赋值对象的内存访问监控可以进一步提高数据竞争检测、确定性回放等系统的性能,从而扩展此类方法的应用范围。本文首先指出了单赋值对象这一问题对数据竞争检测、确定性回放等系统的性能影响,并通过对多个多线程程序测试集的测试证明了单赋值对象内存访问在程序内存访问中占很大比例;然后给出了单赋值对象的形式化定义,并根据这一定义设计了一种基于静态分析的对象单赋值分析算法;最后将这一算法实现在Java语言上,对Java程序字节码进行对象单赋值分析,并将算法的分析结果应用到多种成熟的数据竞争检测系统和一个确定性回放系统中。测试数据表明使用对象单赋值分析算法的分析结果可以有效减少数据竞争检测、确定性回放系统的运行开销,从而扩展系统应用场景。论文的主要贡献包括:·提出了多线程程序运行中存在的单赋值对象问题,并对单赋值对象做出了形式化的定义;·使用静态分析方法构建了对象单赋值分析算法;·将对象单赋值分析算法的分析结果分别应用在基于LockS et、HappenBefor算法的数据竞争检测系统和一个确定性回放系统中,分别减少了39%、75%和62%的额外开销。