CN106257425B - 一种基于并发控制流图的Java并发程序路径剖析方法 - Google Patents
一种基于并发控制流图的Java并发程序路径剖析方法 Download PDFInfo
- Publication number
- CN106257425B CN106257425B CN201610577045.4A CN201610577045A CN106257425B CN 106257425 B CN106257425 B CN 106257425B CN 201610577045 A CN201610577045 A CN 201610577045A CN 106257425 B CN106257425 B CN 106257425B
- Authority
- CN
- China
- Prior art keywords
- thread
- control flow
- current control
- flow graph
- path
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公布了一种基于并发控制流图的Java并发程序路径剖析方法,通过分析Java源码中的线程内控制流关系和线程间的联系(包括线程的创建和各类同步关系),构建Java并发控制流图;在Java并发控制流图上实施并发路径剖析算法,并按照算法结果对Java源码进行插桩,使得插桩后的源码在执行过程中能够生成并发程序的路径剖析结果。
Description
技术领域
本发明属于动态程序分析领域,涉及一种基于并发控制流图的Java并发程序路径剖析方法。
背景技术
动态程序分析是基于程序执行的分析技术,所以收集程序的执行信息是动态分析方法不可缺少的一部分。为了高效的收集路径的执行信息,现有技术普遍采用路径编码的方式,将每条路径映射到一个或一组整数,以快速的判断当前执行的路径是否与已执行的某条路径相同,方便的进行执行次数的累加。相应的,为了实现路径的编码,在程序执行之前,首先要对程序进行插桩,在分析程序的控制流图(CFG,control flow graph)的基础上,在程序的相关位置***一个或多个探针变量的值操作语句及相关的逻辑控制、探针收集等语句。这样当程序每一次执行完毕之后,所收集的路径编码计算结果就唯一确定该次执行的路径。
对于单线程程序,在其控制流分析的基础上,现有的技术可以将每条可执行路径编码为一个唯一的非负整数或一串唯一的整数集合;为了实现该种路径编码,在程序中插桩的语句需要随着目标程序的执行而执行,在执行完毕时计算出最终的路径编码。
对于并发程序,传统的剖析方法难以实施的困难主要有二:并发程序增加了线程的创建、终止和交互机制,导致控制流结构和执行空间都与单线程程序有很大的不同;并发程序中各个线程交替混合执行,导致探针变量的计算语句也可能发生乱序的情况,难以处理。
在实际的Java软件中,并发机制的应用较为广泛,多个线程之间的复杂关系会导致其控制流图执行混乱,因此,针对并发程序的实用剖析方案不可缺少。
发明内容
技术问题:本发明提供一种其中探针计算与路径编码方式能够保证并发程序中每个线程的执行路径的编码具有唯一性,达到能够精确收集并发程序执行信息的效果的基于并发控制流图的Java并发程序路径剖析方法。
技术方案:本发明的基于并发控制流图的Java并发程序路径剖析方法,包括如下步骤:
步骤1)从Java并发程序源码中获取各个线程内部的控制流结构和线程之间的并发关系;
步骤2)首先在各个线程内部的控制流结构的基础之上,按照线程之间的并发关系类型,对不同的并发元素分别做如下处理,最终构建得到并发控制流图:
a)对于线程创建关系,增加从线程创建节点到被创建线程入口节点的控制流边;
b)对于“通知-阻塞”的线程同步关系,识别同步控制语句,按照每条同步控制语句的含义,删除线程内部因同步而消失的控制流图结构,增加线程之间因同步而出现的控制流图结构,使得并发控制流图正确表示线程中每条语句的执行先后次序;
c)对于FutureGet机制的线程同步关系,增加通知节点到被通知节点的控制流边,并被通知节点在线程内部的所有出边;
步骤3)在所述步骤2获得的并发控制流图中实施剖析算法,并将所需探针语句插桩到原并发程序中,保证插桩后的并发程序在任意的执行情况下,每个线程的执行轨迹均由唯一的路径编码标识;
步骤4)执行插桩后的程序,在程序执行过程中,通过所插桩的探针语句计算路径编码并统计路径频率,作为最终的剖析结果。
进一步的,本发明方法中,步骤3)中所需探针语句使用多个探针变量,在插桩到原并发程序的过程中按照Java线程ID来动态分配每个线程唯一的探针变量。
进一步的,本发明方法中,步骤3中的所需探针语句根据全路径剖析法计算得到。
本发明提出了一种基于并发控制流图的Java并发程序路径剖析方法,主要是在合并多个线程内部控制流图的基础上,通过分析并发相关代码,增加、删除相应的控制流边,以构建并发控制流图,进而在并发控制流图的基础上实施路径剖析方法。
有益效果:本发明与现有技术相比,具有以下优点:
(1)现有的路径剖析技术未能构建线程之间的控制流关系,亦缺乏对并发程序中每个线程的剖析能力。本发明由于增加了对线程间创建关系和同步关系等信息的处理,构建了并发控制流图,能够在执行过程中区分每个线程执行过程中和其他线程的不同同步状态,进而使得所编码的路径信息能够包含每个线程的创建、执行和终止,保证了准确剖析并发Java程序的能力。
(2)现有的路径剖析技术普遍采用单变量作为探针变量,导致多个线程的探针语句执行互相影响,难以区分。本发明方法利用了Java语言的线程ID机制,针对每个线程按照其线程ID动态分配一个特有的探针变量进行编码计算,各个线程之间的执行过程中的路径编码操作互不影响,能够处理并发程序中同时执行的多个线程。即使是由同一段代码创建的不同线程,由于其线程ID不同,故也能够在剖析过程中明确地区分,获取每个线程相应的剖析结果。
附图说明
图1是本发明的体系结构。
图2是并发控制流图构造中对线程创建关系的处理示意图。
图3是并发控制流图构造中对线程“通知-阻塞”同步关系的处理示意图。
图4是并发控制流图构造中对线程“FutureGet”同步关系的处理示意图。
图5是示例程序对应的单线程控制流图。
图6是针对图5生成的并发控制流图。
具体实施方式
下面结合实施例和说明书附图对本发明作进一步的说明。
技术中的探针计算和路径编码是密不可分的两个部分,路径的编码与插桩的探针语句相对应,而探针语句又由所插桩的探针语句在目标程序执行过程中计算得出。精确的路径编码要求任一路径的编码具有唯一性,相应的,不同路径上所执行的的探针语句也必须计算出不同的变量取值。
本发明方法的基础在于并发控制流图的构建,该图描述了线程内部的控制流关系和线程之间的同步执行关系;在并发控制流图模型上实施相应的探针插桩方法,该方法保证了并发执行路径编码的唯一性,并能够简明的得以实现。
一、体系结构
图1给出了本方法的体系结构。下面给出几个主要部分的具体说明。
1并发控制流分析
该部分的功能在于从源代码中获取线程内部的控制流关系和线程之间的同步执行关系等相关信息,以应用于探针插桩方法。在本发明中需要的控制流信息主要包括单个方法内部的控制流图、方法之间的调用关系以及线程之间的控制流关系。
a)对于线程创建关系,如果存在A线程控制流图中的Ax节点创建了线程B,线程B的入口节点为B1,那么在并发控制流图中增加控制流边(Ax,B1),如图2所示:图左侧是线程A和线程B的控制流图以及A对B的创建关系描述,右侧是相应生成的并发控制流图。
b)对于“通知-阻塞”的线程同步关系,通过识别同步控制语句修正并发控制流图。在“通知-阻塞”中通知节点分为4类:(1)继承自Object基类的notify、notifyAll;(2)countdown机制的删减语句;(3)条件变量的signal、signalAll;(4)通过Phaser类实现的arrive通知语句。与通知节点对应的阻塞节点分别为wait,await,await,awaitAdvance。在并发控制流图中,构建与阻塞语句相对应的通知语句节点到该阻塞语句后续执行节点的控制流边,同时在线程内部的控制流结构中删除阻塞语句与其后续执行节点的控制流边,如图3所示(图中含义同图2)。
c)对于FutureGet机制的线程同步关系,如果存在A线程控制流图中的Ax节点调用了线程B的get()或join()方法,线程B的出口节点为By,那么在并发控制流图中增加控制流边(By,Ax),并删去A线程控制流图中的Ax节点的出边,如图4所示(图中含义同图2)。
2并发路径剖析算法
在单个过程的控制流中,探针计算方式需要能够区分不同的路径。传统的单线程路径剖析算法计算方式为:输入控制流图,通过分析控制流图的结构决定如何进行插桩。所插桩的语句定义了个整数类型的探针变量r,在程序的不同位置插桩r相关的操作语句(即探针,包含对r的赋值、累加和累乘等操作),使r的值随着程序执行而变化,与路径编码相对应。
在此基础上,本发明的并发路径剖析算法改进包括两部分:
a)控制流图的改进。有别于传统路径剖析算法以单线程控制流图作为输入,本发明通过前一步骤生成了并发控制流图,进而在并发控制流图上实施传统的单线程路径剖析算法,保证单个线程的剖析能够正确完成。
b)插装方式的改进。有别于传统路径剖析算法使用单一变量作为探针变量,本发明使用的探针变量为一组整数类型的变量ri,对于并发控制流图中的每一个可能执行的线程使用一个变量作为其探针变量,避免并发机制中的无序执行对探针计算的干扰,保证不同线程所执行的路径编码互不干涉。
具体的计算方式是:所有探针变量由一个整数类型的变量数组实现;每个线程创建时,根据线程编号i申请本线程的探针变量ri,并初始化ri;在线程执行过程中,每个线程的探针语句通过当前线程编号区分,不会互相影响,进而保证整个并发程序的路径剖析能够正确实施。
3执行与路径编码
对于静态路径有限的控制流图,本发明采用的路径编码方式是:在目标程序执行之前,枚举所有静态无环路径,并建立每条路径与其编码的一一对应关系表;在每次执行完毕时,按照所收集的编码查表即可得知所执行的路径。
对于有循环语句、递归调用或循环线程依赖的情况下,静态路径数目无限,无法枚举。这样在目标程序执行之前,无法列出路径编码与路径的一一对应表。为了从路径编码的统计结果得出相应的路径执行结果,需要采用现有剖析领域中的路径回溯的方法获取编码所对应的路径。
在插桩后的代码中,探针语句随着并发程序的执行过程不断计算各个线程的路径编码,在线程终止及程序终止时,使用的探针变量个数即为所执行的线程数目,每个探针变量的值即为每个线程执行路径的编码。
二、方法流程
本方法通过对目标程序控制流结构的分析,计算出需要在程序源码中插桩的探针,然后通过目标程序的执行以收集路径编码,得出最后的执行结果。具体的步骤如下:
步骤1)从程序源码中获取各个线程内部和线程之间的控制结构,构造并发控制流图;
步骤2)对于并发控制流图实施并发路径剖析算法,计算相应的探针并插桩到程序源码之中;
步骤3)执行插桩后的程序,并收集相应的路径编码及其频率;
步骤4)由收集到的信息在并发控制流图上进行回溯,将路径编码转化为路径,以获取并发路径的执行结果。
实施例:
为了方便描述,我们假定有如下简化的应用实例,目标并发程序的源码如下所示:
该代码功能为:生产者Producer和消费者Comsumer并发执行,Producer向Container的栈中压入数据,Consumer从Container的栈中取出数据,如果栈满,则Producer线程等待,如果栈空,则Consumer线程等待。
该程序的单线程中方法内和方法间的控制流结构如图5所示。
按照本发明的并发控制流图构造方法,在图5的基础上做如下修正(参见图6):
1.分析线程创建关系,增加线程创建边:4→28,5→-39;
2.分析线程“通知-阻塞”关系,可知程序中通知节点为16和22,相应的阻塞节点为20和13,而阻塞节点的后继节点为21和14。因此增加边16→21,22→14,删除边13→14,21→22。
在并发控制流图上插桩的探针如下(每个线程使用自身ID申请、使用唯一的探针变量ri):
12→14:ri=ri*2;
22→14:ri=ri*2+1;
19→21:ri=ri*2;
16→21:ri=ri*2+1;
4→28:ri=ri*2;
31→28:ri=ri*2+1;
30→31:ri=ri*2;
16→31:ri=ri*2+1;
5→39:ri=ri*2;
42→39:ri=ri*2+1;
41→42:ri=ri*2;
23→42:ri=ri*2+1。
假设有如下执行过程:
执行过程中依次运行了如下边上的探针(计算后的探针变量的值在括号中):
Producer:(r2=0)4→28(r2=0),12→14(r2=0),16→31(r2=1),31→28(r2=3),22→14(r2=7),16→31(r2=15)
Consumer:(r3=0)5→39(r3=0),19→21(r3=0),23→42(r3=1),42→39(r3=3),19→21(r3=6),23→42(r3=13)
相应的路径编码:Producer线程为15,Consumer线程为13。
如果另一次执行过程为:
那么执行过程中依次运行了如下探针:
Producer:(r2=0)4→28(r2=0),12→14(r2=0),16→31(r2=1),31→28(r2=3),22→14(r2=7),16→31(r2=15)
Consumer:(r3=0)5→39(r3=0),19→21(r3=0),23→42(r3=1),42→39(r3=3),16→21(r3=7),23→42(r3=15)
相应的路径编码:Producer线程为15,Consumer线程为15。
上述实施例仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和等同替换,这些对本发明权利要求进行改进和等同替换后的技术方案,均落入本发明的保护范围。
Claims (3)
1.一种基于并发控制流图的Java并发程序路径剖析方法,其特征在于,该方法包括如下步骤:
步骤1)从Java并发程序源码中获取各个线程内部的控制流结构和线程之间的并发关系;
步骤2)首先在各个线程内部的控制流结构的基础之上,按照线程之间的并发关系类型,对不同的并发元素分别做如下处理,最终构建得到并发控制流图:
a)对于线程创建关系,增加从线程创建节点到被创建线程入口节点的控制流边;
b)对于“通知-阻塞”的线程同步关系,识别同步控制语句,按照每条同步控制语句的含义,删除线程内部因同步而消失的控制流图结构,增加线程之间因同步而出现的控制流图结构,使得并发控制流图正确表示线程中每条语句的执行先后次序;
c)对于FutureGet机制的线程同步关系,则在并发控制流图中增加通知节点到被通知节点的控制流边,并删去被通知节点在线程内部的所有出边;
步骤3)在所述步骤2)获得的并发控制流图中实施剖析算法,并将所需探针语句插桩到原并发程序中,保证插桩后的并发程序在任意的执行情况下,每个线程的执行轨迹均由唯一的路径编码标识;
步骤4)执行插桩后的程序,在程序执行过程中,通过所插桩的探针语句计算路径编码并统计路径频率,作为最终的剖析结果。
2.根据权利要求1所述的基于并发控制流图的Java并发程序路径剖析方法,其特征是,所述步骤3)中所需探针语句使用多个探针变量,在插桩到原并发程序的过程中按照Java线程ID来动态分配每个线程唯一的探针变量。
3.根据权利要求1或2所述的基于并发控制流图的Java并发程序路径剖析方法,其特征是,所述步骤3)中的所需探针语句根据全路径剖析法计算得到。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610577045.4A CN106257425B (zh) | 2016-07-20 | 2016-07-20 | 一种基于并发控制流图的Java并发程序路径剖析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610577045.4A CN106257425B (zh) | 2016-07-20 | 2016-07-20 | 一种基于并发控制流图的Java并发程序路径剖析方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106257425A CN106257425A (zh) | 2016-12-28 |
CN106257425B true CN106257425B (zh) | 2019-04-09 |
Family
ID=57714172
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610577045.4A Active CN106257425B (zh) | 2016-07-20 | 2016-07-20 | 一种基于并发控制流图的Java并发程序路径剖析方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106257425B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108182144B (zh) * | 2017-12-14 | 2020-12-11 | 东南大学 | 一种基于序列模式挖掘的并发程序剖析方法 |
CN108170434A (zh) * | 2017-12-26 | 2018-06-15 | 首都师范大学 | 危险路径的并行获取方法及装置 |
CN109189483A (zh) * | 2018-08-02 | 2019-01-11 | 优视科技新加坡有限公司 | 任务执行的调控方法、装置、设备/终端/服务器及存储介质 |
WO2022178889A1 (zh) * | 2021-02-27 | 2022-09-01 | 华为技术有限公司 | 函数调用上下文的编码、解码方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101364185A (zh) * | 2008-09-02 | 2009-02-11 | 中国科学院软件研究所 | 线程池容量自适应调节方法及应用服务器并发控制方法 |
CN101702176A (zh) * | 2009-11-25 | 2010-05-05 | 南开大学 | 一种基于局部路径锁的xml数据并发控制方法 |
CN102110052A (zh) * | 2011-03-03 | 2011-06-29 | 华中科技大学 | 一种程序行为动态剖析的并行加速方法 |
CN103197920A (zh) * | 2013-03-25 | 2013-07-10 | 华为技术有限公司 | 一种并发控制方法、控制节点及*** |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150067283A1 (en) * | 2013-08-27 | 2015-03-05 | International Business Machines Corporation | Image Deduplication of Guest Virtual Machines |
-
2016
- 2016-07-20 CN CN201610577045.4A patent/CN106257425B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101364185A (zh) * | 2008-09-02 | 2009-02-11 | 中国科学院软件研究所 | 线程池容量自适应调节方法及应用服务器并发控制方法 |
CN101702176A (zh) * | 2009-11-25 | 2010-05-05 | 南开大学 | 一种基于局部路径锁的xml数据并发控制方法 |
CN102110052A (zh) * | 2011-03-03 | 2011-06-29 | 华中科技大学 | 一种程序行为动态剖析的并行加速方法 |
CN103197920A (zh) * | 2013-03-25 | 2013-07-10 | 华为技术有限公司 | 一种并发控制方法、控制节点及*** |
Non-Patent Citations (3)
Title |
---|
"Java并发程序动态分析技术研究";王越等;《南京大学学报(自然科学)》;20051031;第41卷;全文 |
"对Java并发程序进行模型检测";周志远等;《计算机工程与设计》;20090228;第30卷(第2期);全文 |
"飞行控制软件测试中插桩技术的优化方法";郭君红等;《计算机工程》;20100228;第36卷(第4期);全文 |
Also Published As
Publication number | Publication date |
---|---|
CN106257425A (zh) | 2016-12-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106257425B (zh) | 一种基于并发控制流图的Java并发程序路径剖析方法 | |
Liu et al. | Transition cover-based design of Petri net controllers for automated manufacturing systems | |
Palamidessi | Comparing the expressive power of the synchronous and asynchronous-calculi | |
Uzam et al. | An iterative synthesis approach to Petri net-based deadlock prevention policy for flexible manufacturing systems | |
Hu et al. | Liveness and ratio-enforcing supervision of automated manufacturing systems using Petri nets | |
Como et al. | Scaling limits for continuous opinion dynamics systems | |
CN105683940A (zh) | 处理混合流的数据流图 | |
CN103744643A (zh) | 一种多线程程序下多节点并行架构的方法及装置 | |
US8843902B2 (en) | Program flow route constructor | |
Srivastava et al. | Tractability of planning with loops | |
Freund et al. | How to obtain computational completeness in P systems with one catalyst | |
WO2021147878A1 (zh) | 控制任务集中的任务并行的***及其方法 | |
CN104978272A (zh) | 一种用于数据竞争检测的程序调度方法 | |
Amadio et al. | Resource control for synchronous cooperative threads | |
Larbi et al. | Modeling the scheduling problem of identical parallel machines with load balancing by time petri nets | |
Dalai et al. | Test case generation for concurrent object-oriented systems using combinational UML models | |
Martin et al. | A tool for proving deadlock freedom | |
Kao et al. | Competitive design and analysis for machine-minimizing job scheduling problem | |
Orchard et al. | Using session types as an effect system | |
CN103606042B (zh) | 基于动态依赖图的服务组合实例迁移有效性判定方法 | |
Svendsen et al. | Joins: A case study in modular specification of a concurrent reentrant higher-order library | |
Chen et al. | Resource-oriented Petri net-based approach to deadlock prevention of AMSs | |
Jin et al. | A center-based community detection method in weighted networks | |
Devismes et al. | Weak vs. self vs. probabilistic stabilization | |
Mahmood et al. | Membrane computing to enhance time efficiency of minimum dominating set |
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 |