论文部分内容阅读
随着多核系统的不断发展,处理器核数不断增加,越来越多的软件将通过并发来充分利用处理器性能。目前软件系统实现并发的最主要方式是使用线程,线程之间使用锁进行同步。然而基于线程和锁的并发编程易于出错,研究发现即使是成熟的开源软件也存在不少并发相关错误,且这些错误难以调试和修复。如何重现这些错误具有重要的研究意义和实用价值。记录和重放来自计算机系统自身和外部环境的不确定性是重现软件执行过程的一个重要技术。之前的研究工作对单核系统的记录和重放已经做了比较全面的研究,而对多核系统来说,不同处理器对共享内存的访问顺序大大增加了系统的不确定性,我们需要使用确定性重放技术才能实现对系统执行的忠实重现。记录共享访存的顺序是高效实现确定性重放的一大挑战,有些研究工作修改硬件来记录访存顺序,这些工作在现有的硬件上还不能使用;而基于现有硬件的工作其访存顺序的记录存在可伸缩性问题,随着处理器核数的增加,这些系统的性能反而可能下降。在充分分析之前研究工作的基础上,本文提出了一种基于现有硬件的可伸缩的访存顺序记录算法,并利用多核全系统模拟器COREMU和二进制翻译工具DynamoRIO实现了全系统和应用程序的确定性重放。使用并行基准测试程序的性能评测表明,本文实现的确定性重放系统具有良好的可伸缩性。为进一步提升系统性能,本文还探索了使用硬件事务内存来记录访存顺序的方法。具体来说,本文做出了如下贡献:1.分析之前工作提出的访存顺序记录算法存在伸缩性问题的原因,提出了一种基于现有硬件的可伸缩的访存顺序记录算法。该算法利用共享对象版本序列化所有的写操作,并巧妙的记录了处理器之间的读后写顺序。算法记录精确的访存顺序,在记录顺序时仅需每个处理器局部的信息和共享对象版本,需要原子性访问的临界区很短,这些特点使得算法具有良好的可伸缩性。2.首次在并行全系统模拟器上实现确定性重放工具ReEmu。我们对全系统模拟器不确定性的来源做了充分的分析,并针对本文使用的并行全系统模拟器COREMU的特点实现了全系统确定性重放。ReEmu使用类似seqlock的方法实现了本文提出的可伸缩的访存顺序记录算法,并尝试使用锁聚集优化来提高访存顺序记录的性能。我们使用五个特性不同的PARSEC并行基准测试程序评测系统性能,在模拟16个虚拟核时ReEmu相比COREMU的平均开销为68.9%(范围51.8%--94.7%),模拟从1到16个虚拟核的运行时间体现了良好的可伸缩性。利用COREMU的跨体系结构的支持,我们还实现了ARM系统的确定性重放。3.使用DynamoRIO实现了应用程序确定性重放工具Dr. Replay,该工具根据每个系统调用的不同语意单独记录和重放,为帮助调试应用程序,Dr.Replay记录了系统调用的偏序。本文指出了操作系统与进程间除系统调用之外的隐式交互为实现应用程序确定性重放带来的挑战。我们使用1-16个线程记录PARSEC基准测试程序的执行,Dr. Replay同样显示了良好的可伸缩性。Dr. Replay记录程序执行的运行时间平均为原生执行的14.8倍(最低11.6倍,最高19.8倍),比同样使用二进制翻译的应用程序确定性重放工具PinPlay有着更好的性能。4.首次尝试使用硬件事务内存记录访存顺序,提出了基于事务提交顺序的记录算法。我们还分析了Intel Haswell微架构处理器事务内存扩展的适用范围,通过实际测试指出简单的对访存顺序记录算法的实现使用HLE并不能提升性能。