一种用于数据竞争检测的程序调度方法

文档序号:9261307阅读:201来源:国知局
一种用于数据竞争检测的程序调度方法
【技术领域】
[0001] 本发明属于软件测试技术领域和软件可靠性领域,特别设及多线程程序中数据竞 争检测和程度调度方法。
【背景技术】
[0002] 随着多核CPU的广泛使用,越来越多的软件使用了多线程技术来并发地处理一定 的任务。但是,多线程程序在运行过程中需要各个线程很好地同步来完成某个任务。当该 些线程之间的同步出现错误时,就会导致并发缺陷的发生,数据竞争值ataRace)就是最基 本的一种并发缺陷。
[0003] 数据竞争的定义为;两个或两个W上线程对同一变量同时操作(读或写),且至少 包含一个写操作。主流的数据竞争的准确检测是基于Happens-before关系(简称皿R,使 用符号表示的。皿R的定义如下;(1)同一个线程若先执行一条语句ei再执行一条语句 62,则ej-62; 0)若线程tx释放一个锁m(记作e,),之后锁m被线程ty获取(记作ey), 则一 0)传递性,若ey丑Cywe"则(j、一ez。皿R被用来判断对同一变量的 两次访问(含有一个写操作)是否有先后顺序,如果没有先后顺序,则该两次访问构成一个 数据竞争。
[0004] 然而,皿R能够隐藏很多的数据竞争。如图la所示,两个线程t济ty对变量X的 两次写操作构成了一个数据竞争,但是皿R由于锁m的存在而隐藏该个数据竞争,因为两个 线程对X的操作是有先后顺序的(如箭头所示)。因此,单纯使用皿R来检测数据竞争,会 漏掉很多的数据竞争。另外,即使大量重复运行一个程序多次,皿R也无法高效地检测到那 些被它之前隐藏的数据竞争。因此,基于皿R的数据竞争工具在检测那些被其隐藏的数据 竞争方面是低效的。

【发明内容】

[0005] 本发明技术解决问题;克服现有技术的不足,提供一种用于数据竞争检测的程序 调度方法,使得很难检测的数据竞争被检测到,提高了数据竞争的检测效率。
[0006] 本发明技术解决方案:一种用于数据竞争检测的程序调度方法,通过分析程序中 每个程序块所包含的锁类型的集合,在程序运行过程中主动调度每个线程的运行,使得很 难检测的数据竞争被检测到,提高了基于Happens-before的数据竞争的检测效率,包括W 下步骤:
[0007] (1)划分给定程序为若干个程序块;
[000引 (2)运行一次给定程序,并计算每个程序块中锁的类型的集合;
[0009] (3)选择数据竞争检测工具,再次运行给定程序,并根据每个线程和锁、程序块中 锁类型集合的关系调度每个线程的运行;
[0010] (4)在步骤(3)的运行中同时使用选定的工具检测数据竞争;
[0011] (5)在步骤(3)的运行中同时重新计算每个程序块的锁的类型集合,用于下一次 运行的调度;
[0012] (6)重复步骤(3)至(5)若干次,并收集每次检测到的数据竞争。
[0013] 所述步骤(2)和巧)中程序块的锁类型集合生成为动态生成或静态生成;若使用 静态生成,则权利要求1中步骤(5)可W省略。
[0014] 所述步骤(1)中划分给定程序为若干个程序块采用单位程序块划分方法。
[0015] 所述单位程序块划分方法包括函数、程序基本块划分。
[0016] 所述步骤(1)中每个程序块为连续的若干行程序语句。
[0017] 所述步骤(2)和巧)中锁类型的算法为化va程序的中的类型或用于区分不同锁 的内存对象摘要算法。
[0018] 所述步骤(3)中的数据竞争检测工具为Happens-before。
[0019] 本发明与现有技术相比的优点在于:本发明在程序的运行中,动态地对程序的不 同块进行分析,找出每个块中所含有的锁的类型集合,并在程序的之后运行中,分析每个线 程将要获取的锁和其它线程正在执行的程序块之间的关系,并依据此关系主动调度各个线 程的运行,使得被皿R隐藏的数据竞争得W暴露,进而被基于皿R的工具检测到,从而提高 了基于皿R工具在数据竞争检测的效率。
【附图说明】
[0020] 图la和图化分别为数据竞争的隐藏情况和其被本发明方法检测到的情况;
[0021] 图2为本发明的实现流程图;
[002引图3为本发明步骤(2)b)中程序块bi和bj.关系示意图;
[0023] 图4为数据竞争检测数量对比;
[0024] 图5为本发明实施例对应的程序;
[0025] 图6为本发明实施例运行中线程tl和t2的交替运行过程。
【具体实施方式】
[0026] 针对图1中a被皿R隐藏的数据竞争,本发明会调度该程序的运行,使之产生1中 b所示的运行,从而暴露在X上面的数据竞争,进而被基于皿R的数据竞争检测工具检测到。
[0027] 如图2所示,本发明步骤包括;划分给定程序P为若干个程序块{bi,b2,…b。};通 过运行程序P-次,动态确定每个程序块bi中锁的类型的集合{L化1),L化2),…Ub。)};选 取某个基于Happens-before的数据竞争检测工具,再次运行程序P并根据每个线程和锁、 程序块中锁的类型集合的关系调度每个线程的运行,并使用已选定的数据竞争检测工具检 测数据竞争;在程序的调度过程中重新计算每个程序块对应的锁类型集合;重复上述步骤 若干次。
[002引本发明具体实现步骤如下:
[0029] (1)划分给定程序P为若干个程序块{biA,…b。},每个程序块为连续的若干行程 序语句;
[0030] (2)选定一个参数k(默认值为12),运行程序P,并计算每个程序块bi的锁类型集 合L化1),其中L化1)是W下两个集合的并集:
[0031] a)所有线程在b冲运行时获取的锁的类型集合;
[0032]b)所有线程在程序块bj.中运行时获取的锁的类型集合,其中bj.限定为从bi可通 过k个程序块的调用可到达的程序块,如图3所示。
[0033] (3)选取某个基于化卵ens-be化re的数据竞争检测工具,运行程序P,并按照如下 规则调度程序P中每个线程的运行并使用已选定的数据竞争检测工具检测数据竞争:
[0034]a)当一个线程t将要获取一个锁m时,判断是否存在另一个线程t',且线程t'当 前所在的程序块Iv对应的锁类型集合UbtO包含锁m的类型。
[003引 b)若存在a)中的线程t',则暂停线程t的执行,直到线程t'获取并释放某个锁 m',且锁m'和锁m具有相同的类型。
[0036]C)若程序P中全部的线程都被暂停,则随机选取一个线程并继续执行该线程。
[0037] (4)在步骤3对应的程序运行中,按照步骤2的方法重新计算每个程序块对应的锁 类型集合,用作下次运行时的锁类型集合;
[003引 (5)重复步骤(3)和(4)若干次,并报告所有检测到的数据竞争。
[0039] 图5列出了该实施例对应的程序P。该发明在程序P上的调度举例如下。
[0040] (1)程序P的划分。可按照程序中函数为单位,如表2中(a)所示;也可W按照程 序基本块等划分,如表2中(b)所不:。
[0041] 表2程序的两种划分
[0042]
[0044] (2)W上述划分1为例,计算每个基本块中锁的集合(LS(bi)),选取参数k为12。 通过运行程序,动态计算每个程序块对应的锁集合,如表3所示。
[0045] 表 3
[0046]
[0047] 也可W按照程序代码静态计算每个块对应的锁集合,针对划分2的静态计算结果 如表4所示。
[0048]表 4
[0049]
[0051] (3)在表2(a)所示划分W及其对应于的表3中锁集合为基础,使用该专利中的方 法调度程序的运行,并使用基于皿R的数据竞争检测算法来检测数据竞争,如下:
[0052] 由于main线程在启动线程tl和t2后处于等待状态(在line9),该线程不会被 调度。
[005引对于线程tl和t2,假设在tl调用函数n0时,线程t2刚刚进入函数f30。[0化4]此时n0所在的程序块为b2(见表2 (a)),而b2对应的锁集合为化ouble}(见表 3),该发明中的调度会检查是否有其它线程当前所在的块中包含Double锁。
[0055] 由于线程t2所
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1