摘要
通过记录、重放和确定性执行等技术重现程序中的并发错误,在程序编译、调试、性能优化等场景中具有重要研究意义和实用价值。随着新兴RISC-V指令架构软硬件生态的日益完善,在新硬件上支持跨指令集的程序可重现成为亟待解决的关键技术难题。现有研究往往重现开销高、可移植性差、重现结果无法保证,并不能满足跨平台程序重现的要求。针对上述问题,本文在充分分析传统程序可重现性研究基础上,设计并实现了一种基于RISC-V架构的容器化可重现方法,具体研究内容如下: 首先,研究现有记录重放和确定性执行技术,探索二者局限性,分析用户进程执行过程中的不确定性来源,提出RISC-V架构下程序的可重现性和可移植性问题,并就相关问题的国内外研究现状展开调查与分析,为容器化可重现方案寻找理论支撑和技术支持。 其次,基于传统方法中的部分先进技术,设计并实现一种用户进程确定性执行方法。通过追踪进程查找并定位不确定的系统调用,进一步优化多线程的访存竞争消解,实现线程确定性调度,保证用户进程的确定性执行。实验证明,相较于传统方法,本文工作更好的实现了程序的可重现性,并在性能损耗降低上表现显著。 最后,在确定性执行工作基础上,设计了一种2层嵌套的容器机制隔离用户程序。通过Docker与LXC嵌套的二层容器,消除底层微架构对可移植性的影响,隔绝了来自文件系统的不确定性影响;在容器内部,采用动态二进制翻译技术替换用户进程执行过程中具有不确定性的CPU指令。容器化可重现方法避免了对程序和操作系统内核的修改,减少了部署和维护的成本,同时更好的保证了用户进程的确定性。 整体方法的系统原型基于GEM5仿真平台,实现了RISC-V指令集与程序重现方法重演。为了验证所提方法的有效性,设计并实现了一整套容器化可重现框架的验证方法,并通过传统记录重放工具进行比较表明,本文中的容器化可重现方案能够支持更多程序的可重现执行,同时降低了约10%运行时间开销。