当前位置: 首页 > 专利查询>清华大学专利>正文

基于静态共享变量识别的动态数据竞争检测方法技术

技术编号:7935403 阅读:159 留言:0更新日期:2012-11-01 05:07
本发明专利技术公开了一种基于静态共享变量识别的动态数据竞争检测方法,包括:S1:识别待检测程序的共享变量;S2:对所述待检测程序中包含共享变量的基本块进行数据竞争检测插装和采样,得到所述待检测程序经插装和采样后的二进制代码,所述基本块是指一个连续的程序语句序列,控制流从它的开始进入,并从它的末尾离开,中间没有中断或者分支;S3:运行所述二进制代码动态检测所述点检测程序中的数据竞争。本发明专利技术对含有共享变量的基本块进行插装和采样,避免了代码膨胀问题,大大减小了系统开销。

【技术实现步骤摘要】

本专利技术涉及计算机软件可靠性
,特别涉及一种。
技术介绍
随着底层多核处理器的发展,并发程序越来越受到程序员的欢迎。但是并发程序不仅不易正确编写,而且会出现各种难以调试和重现的软件缺陷。数据竞争是引起并发程序软件缺陷的重要原因之一。数据竞争是指多个线程没有同步保护地访问同一个内存地址,且至少一个访问是写操作。因为其会导致严重的后果,学术界和工业界一直试图找到一种有效的检测方法。现有的数据竞争检测方式都基于软件插装的方法,主要分为两类程序运行前的静态插装和程序运行中的动态插装。程序运行前的静态插装工具在程序真正运行前对源代码或者二进制文件进行插装,得到一个插装后的二进制代码,最后按照原始程序的运行方式执行插装程序。程序运行中的动态插装在程序执行的过程中动态插入插装指令,现有的动态插装工具一般采用类似Java虚拟机的即时执行方式,在执行过程中动态翻译执行用户程序指令并插入插装指令。相对于静态插装,动态插装方式的功能更加丰富且方便使用(比如不需要重新编译链接程序,可以监控运行进程等)。现有的广泛使用的插装工具Pin 和Valgrind都采用动态插装方式。对于数据竞争,不管是动态插装方式,还是静态插装方式,都面临着开销和于扰性的问题。在典型应用程序中,不管是串行还是并行程序,内存访问操作数量占的比例都很大,因此数据竞争检测的开销和干扰性主要来源于对于内存操作的插装。最新的研究提出了基于采样的方法,也即不需要插装程序中所有的内存访问,而只以采样的方式插装一部分内存访问操作。对于采样,首先要解决的问题是采样的对象或者粒度。现有的一个方法(参考LiteRace !effective sampling for lightweight data-race detection, PLDI' 09Proceedings of the 2009 ACMSIGPLAN conference on Programming language designand implementation)采用一个基于函数粒度的采样,也就是针对一个函数,统计其动态执行过程运行的次数,不同函数以不同的概率各自进行采样而不互相干扰。但是其选取函数作为采样粒度并不合适,主要存在下面的问题I、采样检查开销增大。程序中大多数的函数都和数据竞争无关,盲目对每个函数检查采样会使检查开销增大。如果某个热点函数中不涉及数据竞争,而基于函数粒度采样的方法每次运行这个函数之前都需要检查采样条件,这会引入额外不必要的开销。如果检查采样的代码实现的不合理,这个开销有时候会达到20%。2、代码膨胀。一个函数体如果很大,但是真正与数据竞争相关的只是其中的一小部分代码区域,基于函数粒度的采样会复制整个函数,并在复制的函数中加入插装代码,这必然会引起程序代码膨胀,对程序产生干扰。总之,现有基于函数粒度的采样方法没有考虑并发程序缺陷或者数据竞争的特性。
技术实现思路
(一 )要解决的技术问题本专利技术要解决的技术问题是如何以较小的资源开销代价实现动态数据竞争检测。(二)技术方案为解决上述技术问题,本专利技术提供了一种,包括以下步骤SI :识别待检测程序的共享变量; S2:对所述待检测程序中包含共享变量的基本块进行数据竞争检测插装和采样,得到所述待检测程序经插装和采样后的二进制代码,所述基本块是指一个连续的程序语句序列,控制流从它的开始进入,并从它的末尾离开,中间没有中断或者分支;S3 :运行所述二进制代码动态检测所述待检测程序中的数据竞争。其中,所述步骤SI具体包括SI. I :读取所述待检测程序的源代码,为源代码中的每一个函数建立函数信息,对所有函数根据其调用关系建立一个不完整的函数调用图,不完整的函数调用关系图不包括函数中指针的调用关系;SI. 2 :对函数进行上下文敏感的指针分析,并构建完整函数调用图,指针分析的结果为每一个函数建立一个指针别名图。指针别名图的结点代表该函数中可以访问的内存空间,边代表结点之间的指向关系,指针分析还需要建立函数调用者指针和被调用者指针的指向图之间的关系;SI. 3:采用自底向上的方式遍历线程间完整的函数调用图,识别出共享变量。其中,所述函数信息包括符号表信息、中间表示结构。其中,所述步骤S2具体包括S2. I :遍历函数中间表示的过程中收集包含共享变量的基本块集合;S2. 2 :复制每一个包含共享变量的基本块,并且在基本块中插入采样检查语句,进行基本块采样;S2. 3 :编译并链接经插装和采样后的源代码,生成插装和采样后的可执行的二进制代码。其中,所述步骤S2. 2中在复制基本块之前包括步骤S2. 2. I :检查一个基本块是否属于某个循环,若是,则复制整个外层循环并插入采样检查语句。其中,所述步骤S2. 2. I之前还包括步骤比较包含共享变量的基本块数量和函数中总的基本块数量,若两者之间的比例小于预定阈值,则步骤S2.2中不执行步骤S2. 2. 1,也不复制基本块,而进行函数粒度的采样。其中,所述预定阈值为10%。其中,所述采样方式采用软件采样、突发性采样、可适应的采样及线程敏感采样中的一种或几种。(三)有益效果本专利技术通过对含有共享变量的基本块进行插装和采样,避免了代码膨胀问题,大大减小了系统开销。附图说明图I是本专利技术实施例的一种的框架设计图;图2是本专利技术实施例的一种流程图;图3是图I中步骤S2的基于基本块的插装过程示意图;图4是图I中步骤S2的基于基本块粒度的采样算法;图5是采用图I中的检测方法的代码大小比较结果; 图6是采用图I中的检测方法的性能比较结果。具体实施例方式下面结合附图和实施例,对本专利技术的具体实施方式作进一步详细描述。以下实施例用于说明本专利技术,但不用来限制本专利技术的范围。经过研究发现,非死锁类型的并发程序缺陷,比如数据竞争,其发生只与程序中的共享变量相关。基于这个观察,本专利技术提出了一种基于共享变量识别的动态数据竞争检测方法,如图I所示,为本实施例中方法实现框架,在本实施例中首先利用编译器的过程间分析模块实现了一个静态共享变量识别算法,输出共享变量的识别结果。编译器后端的数据竞争检测插装和采样模块利用共享变量的识别结果,实现了一个基于基本块粒度的数据竞争检测插装和采样方法,最后得到一个插装后的二进制版本。通过运行插装的二进制代码动态检测程序中的数据竞争。具体流程如图2所示,包括步骤S101,识别待检测程序的共享变量。该步骤具体包括三个步骤过程间的指针别名分析;线程间函数调用图构建;识别算法。其中指针别名分析和线程间函数调用图的构建两者在一起完成。最后的识别算法依赖于指针别名分析和线程间函数调用图。算法首先读入整个程序的源代码,为每一个函数建立后续所需的信息,比如符号表信息,中间表示(Intermediate Representation)结构等。在整个过程间分析的开始阶段,算法需要对所有函数根据其调用关系进行一个不完整的排序(不完整是因为有函数指针的存在),建立一个不完整的函数调用图。接着算法在不完整函数调用的基础上进行一个上下文敏感的指针分析,并在此过程中逐步构建完整函数调用图。指针分析的结果为每一个函数建立一个指针别名图(alias graph)(指针别名图的结点代表该函数中可以访问的内存空间,边代表结点之间的指向关系本文档来自技高网
...

【技术保护点】
一种基于静态共享变量识别的动态数据竞争检测方法,其特征在于,包括以下步骤:S1:识别待检测程序的共享变量;S2:对所述待检测程序中包含共享变量的基本块进行数据竞争检测插装和采样,得到所述待检测程序经插装和采样后的二进制代码,所述基本块是指一个连续的程序语句序列,控制流从它的开始进入,并从它的末尾离开,中间没有中断或者分支;S3:运行所述二进制代码动态检测所述待检测程序中的数据竞争。

【技术特征摘要】

【专利技术属性】
技术研发人员:郑纬民盛田维陈文光蒋运韫
申请(专利权)人:清华大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1