CN104978272A - 一种用于数据竞争检测的程序调度方法 - Google Patents
一种用于数据竞争检测的程序调度方法 Download PDFInfo
- Publication number
- CN104978272A CN104978272A CN201510399123.1A CN201510399123A CN104978272A CN 104978272 A CN104978272 A CN 104978272A CN 201510399123 A CN201510399123 A CN 201510399123A CN 104978272 A CN104978272 A CN 104978272A
- Authority
- CN
- China
- Prior art keywords
- program
- data contention
- lock
- thread
- block
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种用于数据竞争检测的程序调度方法,属于软件测试领域和软件可靠性领域,步骤包括:划分给定程序为若干个程序块;通过运行程序一次,动态确定每个程序块bi中锁的类型的集合;选取数据竞争检测工具,再次运行程序p并根据每个线程和锁、程序块中锁的类型集合的关系调度每个线程的运行,并使用已选定的数据竞争检测工具检测数据竞争;在程序的调度过程中重新计算每个程序块对应的锁类型集合;重复上述步骤若干次。本发明提出了基于程序块中锁类型集合和线程对锁的获取关系来调度程序的运行,以至于隐藏的数据竞争可以被暴露出来,从而被基于Happens-before的数据竞争检测工具检测到,增加了基于Happens-before的数据竞争的检测效率。
Description
技术领域
本发明属于软件测试技术领域和软件可靠性领域,特别涉及多线程程序中数据竞争检测和程度调度方法。
背景技术
随着多核CPU的广泛使用,越来越多的软件使用了多线程技术来并发地处理一定的任务。但是,多线程程序在运行过程中需要各个线程很好地同步来完成某个任务。当这些线程之间的同步出现错误时,就会导致并发缺陷的发生,数据竞争(Data Race)就是最基本的一种并发缺陷。
数据竞争的定义为:两个或两个以上线程对同一变量同时操作(读或写),且至少包含一个写操作。主流的数据竞争的准确检测是基于Happens-before关系(简称HBR,使用符号表示的。HBR的定义如下:(1)同一个线程若先执行一条语句e1再执行一条语句e2,则(2)若线程tx释放一个锁m(记作ex),之后锁m被线程ty获取(记作ey),则(3)传递性,若且则HBR被用来判断对同一变量的两次访问(含有一个写操作)是否有先后顺序,如果没有先后顺序,则该两次访问构成一个数据竞争。
然而,HBR能够隐藏很多的数据竞争。如图1a所示,两个线程tx和ty对变量x的两次写操作构成了一个数据竞争,但是HBR由于锁m的存在而隐藏这个数据竞争,因为两个线程对x的操作是有先后顺序的(如箭头所示)。因此,单纯使用HBR来检测数据竞争,会漏掉很多的数据竞争。另外,即使大量重复运行一个程序多次,HBR也无法高效地检测到那些被它之前隐藏的数据竞争。因此,基于HBR的数据竞争工具在检测那些被其隐藏的数据竞争方面是低效的。
发明内容
本发明技术解决问题:克服现有技术的不足,提供一种用于数据竞争检测的程序调度方法,使得很难检测的数据竞争被检测到,提高了数据竞争的检测效率。
本发明技术解决方案:一种用于数据竞争检测的程序调度方法,通过分析程序中每个程序块所包含的锁类型的集合,在程序运行过程中主动调度每个线程的运行,使得很难检测的数据竞争被检测到,提高了基于Happens-before的数据竞争的检测效率,包括以下步骤:
(1)划分给定程序为若干个程序块;
(2)运行一次给定程序,并计算每个程序块中锁的类型的集合;
(3)选择数据竞争检测工具,再次运行给定程序,并根据每个线程和锁、程序块中锁类型集合的关系调度每个线程的运行;
(4)在步骤(3)的运行中同时使用选定的工具检测数据竞争;
(5)在步骤(3)的运行中同时重新计算每个程序块的锁的类型集合,用于下一次运行的调度;
(6)重复步骤(3)至(5)若干次,并收集每次检测到的数据竞争。
所述步骤(2)和(5)中程序块的锁类型集合生成为动态生成或静态生成;若使用静态生成,则权利要求1中步骤(5)可以省略。
所述步骤(1)中划分给定程序为若干个程序块采用单位程序块划分方法。
所述单位程序块划分方法包括函数、程序基本块划分。
所述步骤(1)中每个程序块为连续的若干行程序语句。
所述步骤(2)和(5)中锁类型的算法为Java程序的中的类型或用于区分不同锁的内存对象摘要算法。
所述步骤(3)中的数据竞争检测工具为Happens-before。
本发明与现有技术相比的优点在于:本发明在程序的运行中,动态地对程序的不同块进行分析,找出每个块中所含有的锁的类型集合,并在程序的之后运行中,分析每个线程将要获取的锁和其它线程正在执行的程序块之间的关系,并依据此关系主动调度各个线程的运行,使得被HBR隐藏的数据竞争得以暴露,进而被基于HBR的工具检测到,从而提高了基于HBR工具在数据竞争检测的效率。
附图说明
图1a和图1b分别为数据竞争的隐藏情况和其被本发明方法检测到的情况;
图2为本发明的实现流程图;
图3为本发明步骤(2)b)中程序块bi和bj关系示意图;
图4为数据竞争检测数量对比;
图5为本发明实施例对应的程序;
图6为本发明实施例运行中线程t1和t2的交替运行过程。
具体实施方式
针对图1中a被HBR隐藏的数据竞争,本发明会调度该程序的运行,使之产生1中b所示的运行,从而暴露在x上面的数据竞争,进而被基于HBR的数据竞争检测工具检测到。
如图2所示,本发明步骤包括:划分给定程序p为若干个程序块{b1,b2,…bn};通过运行程序p一次,动态确定每个程序块bi中锁的类型的集合{L(b1),L(b2),…L(bn)};选取某个基于Happens-before的数据竞争检测工具,再次运行程序p并根据每个线程和锁、程序块中锁的类型集合的关系调度每个线程的运行,并使用已选定的数据竞争检测工具检测数据竞争;在程序的调度过程中重新计算每个程序块对应的锁类型集合;重复上述步骤若干次。
本发明具体实现步骤如下:
(1)划分给定程序p为若干个程序块{b1,b2,…bn},每个程序块为连续的若干行程序语句;
(2)选定一个参数k(默认值为12),运行程序p,并计算每个程序块bi的锁类型集合L(bi),其中L(bi)是以下两个集合的并集:
a)所有线程在bi中运行时获取的锁的类型集合;
b)所有线程在程序块bj中运行时获取的锁的类型集合,其中bj限定为从bi可通过k个程序块的调用可到达的程序块,如图3所示。
(3)选取某个基于Happens-before的数据竞争检测工具,运行程序p,并按照如下规则调度程序p中每个线程的运行并使用已选定的数据竞争检测工具检测数据竞争:
a)当一个线程t将要获取一个锁m时,判断是否存在另一个线程t',且线程t'当前所在的程序块bt'对应的锁类型集合L(bt')包含锁m的类型。
b)若存在a)中的线程t',则暂停线程t的执行,直到线程t'获取并释放某个锁m',且锁m'和锁m具有相同的类型。
c)若程序p中全部的线程都被暂停,则随机选取一个线程并继续执行该线程。
(4)在步骤3对应的程序运行中,按照步骤2的方法重新计算每个程序块对应的锁类型集合,用作下次运行时的锁类型集合;
(5)重复步骤(3)和(4)若干次,并报告所有检测到的数据竞争。
图5列出了该实施例对应的程序p。该发明在程序p上的调度举例如下。
(1)程序p的划分。可按照程序中函数为单位,如表2中(a)所示;也可以按照程序基本块等划分,如表2中(b)所示。
表2程序的两种划分
(2)以上述划分1为例,计算每个基本块中锁的集合(LS(bi)),选取参数k为12。通过运行程序,动态计算每个程序块对应的锁集合,如表3所示。
表3
也可以按照程序代码静态计算每个块对应的锁集合,针对划分2的静态计算结果如表4所示。
表4
(3)在表2(a)所示划分以及其对应于的表3中锁集合为基础,使用该专利中的方法调度程序的运行,并使用基于HBR的数据竞争检测算法来检测数据竞争,如下:
由于main线程在启动线程t1和t2后处于等待状态(在line 9),该线程不会被调度。
对于线程t1和t2,假设在t1调用函数f1()时,线程t2刚刚进入函数f3()。
此时f1()所在的程序块为b2(见表2(a)),而b2对应的锁集合为{Double}(见表3),该发明中的调度会检查是否有其它线程当前所在的块中包含Double锁。
由于线程t2所在块即函数f3()对应的块为b4(见表2(a)),b4对应的锁集合为{Double,Integer}(见表3),该集合中包含有Double的锁。因此,该发明中的调度会暂停线程t1的执行,直到线程t2释放一个Double锁。线程t2在执行完line 50之后释放锁m即一个Double锁。之后,该发明中的调度继续运行线程t1。
当线程t2在执行完line 51时,线程t2执行结束,该线程不再被调度。
当线程t1在调用f2()(即line 28)时,由于只有t1线程可调度,该发明中的调度不再进行检查。
当线程t1执行完f2()之后,线程t1执行结束,该线程不再被调度。
之后,main线程继续执行,由于只有main线程,该线程不再被调度。
main线程执行结束后,整个程序的运行结束。
图6为上述运行中线程t1和t2的交替运行过程,其中箭头所示为锁m上的HBR关系。从图6中可以看到,在m上的HBR为line 50line 26,因此线程t1对x的访问(line 22)和线程t2对x的访问(lines 48和49)是没有HBR关系的,因此x上的数据竞争被检测到。
在上述调度所生成的运行中(即图6中),使用动态方法生成的新的程序块对应的锁集合如下:
表5
新的锁集合和之前的锁集合相比,b2和b3中多出了一个锁Integer。这是因为在之前的运行中,线程t1在运行到line 26时,x的值是1(只有线程t1在line 22修改过x的值),因此线程t1不会调用函数f2(),从而f1()对应的块不含有任何f2()中的锁。
上述调度中所使用的锁是用Java程序中的类型来表示的,即锁m和n分别表示为Double和Integer。也可以使用内存对象摘要算法来表示每个锁,用于区分类型相同的不同锁(例如2个同为Double类型的锁)。例如可以使用每个锁在第一次访问时的堆栈对于的哈希值来表示该锁,这样在图6对应的运行中,锁m可以表示为hash(f3())=0x1234,而锁n可以表示为hash(f3(),f4())=0x5678,其中hash()为一个数组哈希值函数。
本发明通过动态计算程序块中锁类型的集合和程序运行时每个线程对锁的获取情况,主动调度多线程程序的运行,使得被Happens-before关系隐藏或者难以揭露的数据竞争得以暴露,并被基于Happens-before的数据竞争检测工具所检测到,提高了对应工具对数据竞争的检测效率。
效果检验:
为了验证本发明的数据竞争检测效果,采用Dacapo数据集对本发明的方法进行测试,该数据集的详细信息如表1所示。Dacapo数据集包含有其它一些程序,排除了单线程程序和JikesRVM无法运行的程序;每个程序名最后的两位“06”和“09”发别表示了其来源为Dacapo的2006年版本或者2009版本。
表1 Dacapo数据集的特征信息
实验中选取的基于Happens-before的数据竞争检测工具为FastTrack(发表于PLDI2009会议),k的值设置为12,以程序中的每个方法(Method)为程序块。作为对比,选取了其它三种调度方法作比较:操作系统默认调度方法、ConTest调度方法、和PCT调度方法。ConTest在线程获取锁的时候随机暂停该线程一小段时间。PCT针对一般的并发缺陷,包括数据竞争,其在程序每次运行前便生成随机的调度算法。
实验环境:
实验在一台AppleMacbook上面进行,其配有Intel Core i52.6GHz处理器,8G内存,操作系统为OS X 10.9.2。
采用Jikes RVM为平台,实现该发明中的方法和FastTrack、ConTest、以及PCT。
实验步骤:
1.分别使用操作系统默认调度、ConTest调度、PCT调度、和本发明中的调度对每个程序运行10次,每次都是用FastTrack检测数据竞争;
2.针对步骤1中的每种调度方法,统计10次运行中FastTrack检测到的所有的数据竞争数量,如果一个数据竞争被多次检测到,则只算做一个,即不重复计算;
3.将本发明和其它三个调度方法下,FastTrack所检测到的数据竞争的数量做对比。
实验结果:
根据图4中的数据竞争检测数量对比,可以看出经过本发明中的调度方法,FastTrack可以检测到更多的数据竞争。具体来讲,在实验中的5个程序上面,本发明的调度方法使得FastTrack检测到的数据竞争的数量分别增加62.5%、10.38%、66.67%、11.11%,240.00%。平均来看,有17.62%的新数据竞争被FastTrack检测到。
综上所述,本发明中提出的针对数据竞争的多线程程序调度算法可以使基于Happens-before的数据竞争检测工具检测到更多的数据竞争,提高其数据竞争的检测效率。
提供以上实施例仅仅是为了描述本发明的目的,而并非要限制本发明的范围。本发明的范围由所附权利要求限定。不脱离本发明的精神和原理而做出的各种等同替换和修改,均应涵盖在本发明的范围之内。
Claims (7)
1.一种用于数据竞争检测的程序调度方法,其特征在于包括以下步骤:
(1)划分给定程序为若干个程序块;
(2)运行一次给定程序,并计算每个程序块中锁的类型的集合;
(3)选择数据竞争检测工具,再次运行给定程序,并根据每个线程和锁、程序块中锁类型集合的关系调度每个线程的运行;
(4)在步骤(3)的运行中同时使用选定的工具检测数据竞争;
(5)在步骤(3)的运行中同时重新计算每个程序块的锁的类型集合,用于下一次运行的调度;
(6)重复步骤(3)至(5)若干次,并收集每次检测到的数据竞争。
2.根据权利要求1所述的用于数据竞争检测的程序调度方法,其特征在于:所述步骤(2)和(5)中程序块的锁类型集合生成为动态生成或静态生成;若使用静态生成,则权利要求1中步骤(5)可以省略。
3.根据权利要求1或2所述的用于数据竞争检测的程序调度方法,其特征在于:所述步骤(1)中划分给定程序为若干个程序块采用单位程序块划分方法。
4.根据权利要求3所述的用于数据竞争检测的程序调度方法,其特征在于:所述单位程序块划分方法包括函数、程序基本块划分。
5.根据权利要求1所述的用于数据竞争检测的程序调度方法,其特征在于:所述步骤(1)中每个程序块为连续的若干行程序语句。
6.根据权利要求1或2所述的用于数据竞争检测的程序调度方法,其特征在于:所述步骤(2)和(5)中锁类型的算法为Java程序的中的类型或用于区分不同锁的内存对象摘要算法。
7.根据权利要求1或2所述的用于数据竞争检测的程序调度方法,其特征在于:所述步骤(3)中的数据竞争检测工具为Happens-before。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510399123.1A CN104978272B (zh) | 2015-07-08 | 2015-07-08 | 一种用于数据竞争检测的程序调度方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510399123.1A CN104978272B (zh) | 2015-07-08 | 2015-07-08 | 一种用于数据竞争检测的程序调度方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104978272A true CN104978272A (zh) | 2015-10-14 |
CN104978272B CN104978272B (zh) | 2018-05-18 |
Family
ID=54274801
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510399123.1A Active CN104978272B (zh) | 2015-07-08 | 2015-07-08 | 一种用于数据竞争检测的程序调度方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104978272B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105786703A (zh) * | 2016-02-01 | 2016-07-20 | 中国科学院软件研究所 | 一种基于锁提前获取的死锁自动修复方法 |
CN106227656A (zh) * | 2016-07-18 | 2016-12-14 | 中国科学院软件研究所 | 一种基于硬件和线程本地时序的数据竞争采样检测方法 |
CN106294169A (zh) * | 2016-08-17 | 2017-01-04 | 华中科技大学 | 一种基于符号执行虚拟机的数据竞争检测与重放方法 |
CN107515789A (zh) * | 2016-06-15 | 2017-12-26 | 阿里巴巴集团控股有限公司 | 锁竞争的分析方法及设备 |
CN109885489A (zh) * | 2019-01-31 | 2019-06-14 | 清华大学 | 驱动程序中数据竞争检测方法及装置 |
CN110083539A (zh) * | 2019-04-29 | 2019-08-02 | 广州华多网络科技有限公司 | 一种数据竞争检测方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6405326B1 (en) * | 1999-06-08 | 2002-06-11 | International Business Machines Corporation Limited | Timing related bug detector method for detecting data races |
CN1677353A (zh) * | 2004-03-24 | 2005-10-05 | 微软公司 | 用于检测多线程程序中潜在竞争的方法和系统 |
CN102760095A (zh) * | 2011-04-25 | 2012-10-31 | 清华大学 | 基于静态共享变量识别的动态数据竞争检测方法 |
-
2015
- 2015-07-08 CN CN201510399123.1A patent/CN104978272B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6405326B1 (en) * | 1999-06-08 | 2002-06-11 | International Business Machines Corporation Limited | Timing related bug detector method for detecting data races |
CN1677353A (zh) * | 2004-03-24 | 2005-10-05 | 微软公司 | 用于检测多线程程序中潜在竞争的方法和系统 |
CN102760095A (zh) * | 2011-04-25 | 2012-10-31 | 清华大学 | 基于静态共享变量识别的动态数据竞争检测方法 |
Non-Patent Citations (3)
Title |
---|
YAN CAI 等: ""ConLock: A Constraint-based Approach to Dynamic Checking on Deadlocks in Multithreaded Programs"", 《PROCEEDINGS OF THE 36TH INTERNATIONAL CONFERENCE ON SOFTWARE ENGINEERING》 * |
YAN CAI 等: ""Magiclock: Scalable Detection of Potential Deadlocks in Large-Scale Multithreaded Programs"", 《IEEE TRANSACTIONS ON SOFTWARE ENGINEERING》 * |
YAN CAI 等: ""Taming Deadlocks in Multithreaded Programs"", 《PROCEEDINGS OF THE 2013 13TH INTERNATIONAL CONFERENCE ON QUALITY SOFTWARE》 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105786703A (zh) * | 2016-02-01 | 2016-07-20 | 中国科学院软件研究所 | 一种基于锁提前获取的死锁自动修复方法 |
CN105786703B (zh) * | 2016-02-01 | 2018-02-09 | 中国科学院软件研究所 | 一种基于锁提前获取的死锁自动修复方法 |
CN105786703B9 (zh) * | 2016-02-01 | 2018-04-13 | 中国科学院软件研究所 | 一种基于锁提前获取的死锁自动修复方法 |
CN107515789A (zh) * | 2016-06-15 | 2017-12-26 | 阿里巴巴集团控股有限公司 | 锁竞争的分析方法及设备 |
CN106227656A (zh) * | 2016-07-18 | 2016-12-14 | 中国科学院软件研究所 | 一种基于硬件和线程本地时序的数据竞争采样检测方法 |
CN106227656B (zh) * | 2016-07-18 | 2018-07-17 | 中国科学院软件研究所 | 一种基于硬件和线程本地时序的数据竞争采样检测方法 |
CN106294169A (zh) * | 2016-08-17 | 2017-01-04 | 华中科技大学 | 一种基于符号执行虚拟机的数据竞争检测与重放方法 |
CN106294169B (zh) * | 2016-08-17 | 2018-08-03 | 华中科技大学 | 一种基于符号执行虚拟机的数据竞争检测与重放方法 |
CN109885489A (zh) * | 2019-01-31 | 2019-06-14 | 清华大学 | 驱动程序中数据竞争检测方法及装置 |
CN110083539A (zh) * | 2019-04-29 | 2019-08-02 | 广州华多网络科技有限公司 | 一种数据竞争检测方法及装置 |
CN110083539B (zh) * | 2019-04-29 | 2020-11-13 | 广州华多网络科技有限公司 | 一种数据竞争检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN104978272B (zh) | 2018-05-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104978272A (zh) | 一种用于数据竞争检测的程序调度方法 | |
CN100517235C (zh) | 用于检测多线程程序中潜在竞争的方法和系统 | |
US8141082B2 (en) | Node-based representation of multi-threaded computing environment tasks, and node-based data race evaluation | |
CN110399182B (zh) | 一种cuda线程放置优化方法 | |
US8739145B2 (en) | Super nested block method to minimize coverage testing overhead | |
CN103425572A (zh) | 代码分析方法及代码分析系统 | |
US7444628B2 (en) | Extension of swing modulo scheduling to evenly distribute uniform strongly connected components | |
CN103645961A (zh) | 计算密集型并行任务的异常检测方法及系统 | |
CN111104169A (zh) | 指令列表调度方法、装置、计算机设备及存储介质 | |
Higo et al. | Enhancing quality of code clone detection with program dependency graph | |
US9996354B2 (en) | Instruction stream tracing of multi-threaded processors | |
CN116795625A (zh) | 一种基于Java的多线程性能测试的方法及系统 | |
CN111124854A (zh) | 一种冒烟测试用例分配方法、系统、终端及存储介质 | |
CN110083538A (zh) | 一种并发程序噪声注入方法 | |
Alam et al. | GPU-based parallel algorithm for generating massive scale-free networks using the preferential attachment model | |
CN114356550B (zh) | 一种面向三级并行中间件的计算资源自动分配方法及系统 | |
US8453146B2 (en) | Apportioning a counted value to a task executed on a multi-core processor | |
CN110969565A (zh) | 图像处理的方法和装置 | |
CN110413849A (zh) | 一种数据排序方法及装置 | |
CN111382052A (zh) | 代码质量评价方法、装置及电子设备 | |
CN110427320B (zh) | 一种轻量级嵌入式程序控制流异常定位检测方法 | |
CN105607991A (zh) | 一种基于异步线程的测试方法和装置 | |
CN114327673A (zh) | 一种任务启动方法、装置、电子设备及存储介质 | |
Zheng et al. | Evaluating dag scheduling algorithms for maximum parallelism | |
CN111382059A (zh) | 代码质量评价方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |