[发明专利]基于静态共享变量识别的动态数据竞争检测方法有效
申请号: | 201110103794.0 | 申请日: | 2011-04-25 |
公开(公告)号: | CN102760095A | 公开(公告)日: | 2012-10-31 |
发明(设计)人: | 郑纬民;盛田维;陈文光;蒋运韫 | 申请(专利权)人: | 清华大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京路浩知识产权代理有限公司 11002 | 代理人: | 王莹 |
地址: | 100084 北京市海*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 静态 共享 变量 识别 动态 数据 竞争 检测 方法 | ||
技术领域
本发明涉及计算机软件可靠性技术领域,特别涉及一种基于静态共享变量识别的动态数据竞争检测方法。
背景技术
随着底层多核处理器的发展,并发程序越来越受到程序员的欢迎。但是并发程序不仅不易正确编写,而且会出现各种难以调试和重现的软件缺陷。数据竞争是引起并发程序软件缺陷的重要原因之一。数据竞争是指多个线程没有同步保护地访问同一个内存地址,且至少一个访问是写操作。因为其会导致严重的后果,学术界和工业界一直试图找到一种有效的检测方法。
现有的数据竞争检测方式都基于软件插装的方法,主要分为两类:程序运行前的静态插装和程序运行中的动态插装。程序运行前的静态插装工具在程序真正运行前对源代码或者二进制文件进行插装,得到一个插装后的二进制代码,最后按照原始程序的运行方式执行插装程序。程序运行中的动态插装在程序执行的过程中动态插入插装指令,现有的动态插装工具一般采用类似Java虚拟机的即时执行方式,在执行过程中动态翻译执行用户程序指令并插入插装指令。相对于静态插装,动态插装方式的功能更加丰富且方便使用(比如不需要重新编译链接程序,可以监控运行进程等)。现有的广泛使用的插装工具Pin和Valgrind都采用动态插装方式。
对于数据竞争,不管是动态插装方式,还是静态插装方式,都面临着开销和于扰性的问题。在典型应用程序中,不管是串行还是并行程序,内存访问操作数量占的比例都很大,因此数据竞争检测的开销和干扰性主要来源于对于内存操作的插装。最新的研究提出了基于采样的方法,也即不需要插装程序中所有的内存访问,而只以采样的方式插装一部分内存访问操作。对于采样,首先要解决的问题是采样的对象或者粒度。现有的一个方法(参考LiteRace:effective sampling for lightweight data-race detection,PLDI′09 Proceedings of the 2009 ACMSIGPLAN conference on Programming language design and implementation)采用一个基于函数粒度的采样,也就是针对一个函数,统计其动态执行过程运行的次数,不同函数以不同的概率各自进行采样而不互相干扰。但是其选取函数作为采样粒度并不合适,主要存在下面的问题:
1、采样检查开销增大。程序中大多数的函数都和数据竞争无关,盲目对每个函数检查采样会使检查开销增大。如果某个热点函数中不涉及数据竞争,而基于函数粒度采样的方法每次运行这个函数之前都需要检查采样条件,这会引入额外不必要的开销。如果检查采样的代码实现的不合理,这个开销有时候会达到20%。
2、代码膨胀。一个函数体如果很大,但是真正与数据竞争相关的只是其中的一小部分代码区域,基于函数粒度的采样会复制整个函数,并在复制的函数中加入插装代码,这必然会引起程序代码膨胀,对程序产生干扰。
总之,现有基于函数粒度的采样方法没有考虑并发程序缺陷或者数据竞争的特性。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题是:如何以较小的资源开销代价实现动态数据竞争检测。
(二)技术方案
为解决上述技术问题,本发明提供了一种基于静态共享变量识别的动态数据竞争检测方法,包括以下步骤:
S1:识别待检测程序的共享变量;
S2:对所述待检测程序中包含共享变量的基本块进行数据竞争检测插装和采样,得到所述待检测程序经插装和采样后的二进制代码,所述基本块是指一个连续的程序语句序列,控制流从它的开始进入,并从它的末尾离开,中间没有中断或者分支;
S3:运行所述二进制代码动态检测所述待检测程序中的数据竞争。
其中,所述步骤S1具体包括:
S1.1:读取所述待检测程序的源代码,为源代码中的每一个函数建立函数信息,对所有函数根据其调用关系建立一个不完整的函数调用图,不完整的函数调用关系图不包括函数中指针的调用关系;
S1.2:对函数进行上下文敏感的指针分析,并构建完整函数调用图,指针分析的结果为每一个函数建立一个指针别名图。指针别名图的结点代表该函数中可以访问的内存空间,边代表结点之间的指向关系,指针分析还需要建立函数调用者指针和被调用者指针的指向图之间的关系;
S1.3:采用自底向上的方式遍历线程间完整的函数调用图,识别出共享变量。
其中,所述函数信息包括:符号表信息、中间表示结构。
其中,所述步骤S2具体包括:
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于清华大学,未经清华大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201110103794.0/2.html,转载请声明来源钻瓜专利网。
- 上一篇:扣件结构
- 下一篇:一种用于储存汽车的设备