论文部分内容阅读
如今,随着计算机硬件以及网络技术的发展,并发程序在提高计算效率上发挥着越来越重要的作用。然而编写高质量的并发程序对于程序员而言并不是一件简单的事。与此同时,并发程序的线程调度复杂度高的特性使得并发程序的调试、测试遇到许多问题。目前,学术界各个领域已有大量对并发程序的研究,比如并发程序测试、模型检测、数据竞争检测等。但目前的研究都会遇到各种各样的问题,例如部分研究的扩展性不高以致无法有效分析大型并发程序,如符号执行工具KLEE无法有效分析Apache等程序中锁配对问题,而部分研究成果则会产生大量的误报,如Inspector对数据竞争的误报率达88.7%。考虑到锁被广泛使用在对共享内存的访问上,如果能对真实并发程序中锁的使用情况有较深入的了解,那么将会对已有或者将来的并发程序的研究产生重大意义。本文的主要贡献由以下部分组成:(1)首先,本文实现了一个基于LLVM、静态的、保守的、低开销的、能够自动化分析并发程序中锁使用模式的工具LUPA,并通过案例分析与实验对LUPA的准确性与性能分别进行了分析说明。(2)其次,本文在LUPA的辅助下,结合人工检验首次对并发程序中与锁相关的语言特性、所使用的锁模式、不同版本之间对锁使用的演化情况,这几个方面的一般性规律分别进行了研究。通过实验可以知道LUPA对目标程序的平均分析时间为413557毫秒,而对大型程序如MySQL等的分析能在20分钟内完成。同时LUPA对特殊锁模式的识别率达到97.2%。在本文的研究里,MySQL, Apache, Aget, Pbzip2等开源并发程序被选为目标分析程序,通过对这几个程序中锁使用情况的分析,本文得出了一般锁使用的规律,使得能够有效地对并发程序分析工具的设计与实现进行改进,以及对程序员编写并发程序提出有用建议,其中一些较为重要的发现如下:(a)80.5%的锁敏感函数中只会持有1把锁;(b)相比其他锁模式,直接锁模式在并发程序中出现的比率最高,为54.5%。(c)在所分析的527个锁模式中只有12个锁模式属于条件锁模式。(d)锁敏感函数在所有函数中所占的比例只有0.65%。