CN110083456A - 一种针对多线程软件的死锁预防方法 - Google Patents
一种针对多线程软件的死锁预防方法 Download PDFInfo
- Publication number
- CN110083456A CN110083456A CN201910188482.0A CN201910188482A CN110083456A CN 110083456 A CN110083456 A CN 110083456A CN 201910188482 A CN201910188482 A CN 201910188482A CN 110083456 A CN110083456 A CN 110083456A
- Authority
- CN
- China
- Prior art keywords
- library
- beacon
- institute
- deadlock
- gadara
- 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.)
- Pending
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
- G06F9/524—Deadlock detection or avoidance
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种针对多线程软件的死锁预防方法。本发明基于一类特殊的Petri网,Gadara网,对多线程软件进行建模并进行迭代控制。利用已有的MIP法检测Gadara网中可被清空的信标,得到可被清空信标的补库所集。在不影响结果和系统状态的条件下对信标补库所集进行处理,删除集合中多余的操作库所,并通过不可控变迁和不安全状态添加需要控制的操作库所。本发明基于信标的角度构建约束并添加控制器,通过添加少数的控制器就可以阻止大量导致程序进入到死锁的状态且不会阻止好的状态,因此能够有效减少方法迭代次数,提高计算效率,使得最终得到的受控网结构尽可能简单,从而能将本发明应用到实际情况。
Description
技术领域
本发明涉及到多线程软件的死锁预防方法,具体涉及到使用一类特殊的Petri网对多线程软件进行建模并基于Petri网模型对软件进行死锁预防。
背景技术
计算机处理器已经从单核进入了多核时代,与传统的串行程序相比,并行程序更能充分发挥多核处理器的性能。因此,与之相匹配的多线程并行程序软件已成为主流。然而,也正由于多线程的存在,在这些软件里经常会出现互斥、同步和死锁等并发错误。多线程软件中最典型的一类并发错误就是循环互斥等待死锁,在此情况下,系统中多个线程共同竞争共享资源(互斥锁),导致所有的线程都无法继续执行,使系统进入到死锁状态。经过调查发现,目前的很多软件中,近30%的并发错误都与死锁有关。死锁的存在极大地威胁了多线程并行程序软件的安全性和可靠性,甚至可能损害计算机用户的体验和利益。
Petri网是最常用来建模并行程序的工具之一,它能够直观、准确地的捕捉到并行程序的动态,而且不需要状态枚举。并且它能够将程序中的某些行为性质等价地转化到模型中的结构性质,从而降低了分析的复杂度。基于Petri网的死锁控制方法主要有三类:死锁检测与恢复,死锁避免和死锁预防。本发明采用的是第三种方法,死锁预防。相较于前两种方法,死锁预防能够离线计算,在程序设计阶段就解决死锁问题,从而降低了生产成本。
目前针对多线程软件,虽然已经开发出了很多基于Petri网的死锁预防方法,但是它们都无法达到最优,即行为许可性、结构复杂性和计算复杂性无法满足最优,甚至仅仅在某一个方面达到最优都是很困难的。
发明内容
为了克服已有死锁预防方法的不足,本发明基于一种迭代控制的方法,使用一类特殊的Petri网,即Gadara网,对多线程软件进行建模。然后基于MIP法,对Gadara网进行检测,找到可被清空的极小信标。根据MIP的结果,构建约束,添加控制器保证网络活性从而预防死锁。
本发明的具体步骤如下:
步骤1:基于一类特殊的Petri网,即Gadara网,对多线程软件建模。
定义:令IN={1,2,...,m}为一个有限集。一个Gadara网是一个无自环且满足以下条件的Petri网NG=(P,T,F,M0):
1)P=P0∪PA∪PR,其中a)且对于所有的i≠j都有b)其中P0i={p0i};c)PR={r1,r2,...,rn},n>0;
2)且对于所有的i≠j都有
3)对于所有的i∈IN,由PSi∪{p0i}∪Ti产生的子网Ni是个强连通状态机
4)若|p·|>1,则
5)任何r∈PR,都存在一个唯一极小支撑P-不变量,Yr,使得{r}=||Yr||∩PR,
6)M0(r)=1,M0(p)=1,M0(p)≥1;
7)
步骤2:基于一种MIP法,检测Gadara网模型中包含资源数最小的可被清空信标。
注意:检测信标的MIP法并非本发明的重点,且目前的很多MIP法都可以用来得到上述的信标。因此,在此不再赘述。
步骤3:若上述MIP法无解,证明Gadara网是活的,模型中不存在死锁。那么算法结束,无需进行以下步骤。若MIP法有解,根据检测到的可被清空信标,得到该信标的补库所集。
定义:令r∈PR为Gadara网NG=(P,T,F,M0)的资源库所,S是NG的可被清空信标,使用r的操作库所集合H(r)=··r∩PS称为r的持有者,令 称为信标S的补库所集。
注意:由于Gadara网的特殊结构,得到的补库所集中可能会包含信标中的操作库所,这与补库所的定义产生了冲突。若得到的补库所集中包含信标中的操作库所,那么直接将这些操作库所从集合中删除。所以最终得到的补库所集中不会有信标中的操作库所。
步骤4:根据第三步得到的补库所集,构建约束保证那些一旦被标记就会清空极小信标的补库所不会被同时标记,从而使得信标不会被清空。
注意:此约束不仅考虑了被标记就清空信标的库所,它考虑了补库所集中的所有库所,这扩大了约束的范围,能够阻止更多的导致信标被清空的不安全状态,且不会阻止任何好的状态。
步骤5:设置一个库所集合C,初始情况下,因此步骤4中的约束可被写为∑p∈CM(p)≤∑p∈C∩M(p)=11-1。
步骤6:考虑不可控变迁tuc的问题。通常假设Gadara网中的所有分支变迁都是不可控的。若对于p∈C,t∈Tuc且即C中库所能够通过不可控变迁t从其他操作库所获得托肯,那么将这个变迁t的输入操作库所添加到C中。
步骤7:得到死标识后向上检查,因为某些状态必然会到达当前的死标识,这些不安全的状态也是必须阻止的状态。某些不在C中的库所,它们被标记后,必然会导致C中的某些库所也被标记,最终形成以上步骤中检测到的死锁状态,那么这些库所也要添加到C中。然后再回到步骤6,检测新添加的操作库所的输入变迁是否可控,并执行相应的操作。直到步骤6、7两步中不会再添加新的操作库所,再执行下一步。
步骤8:根据库所集C得到新的约束∑p∈CM(p)≤∑p∈C∩M(p)=11-1。
步骤9:利用位置不变量技术,根据步骤8得到的约束,为Gadara网添加控制器。
步骤10:获得受控网将添加的控制器库所视为新的资源库所,然后转到第2步,利用MIP法检测受控网是否还存在可被清空的极小信标,若存在继续执行第3步到第10步,直到网络中不再存在可被清空的极小信标,方法结束。
本发明针对多线程软件,提出了一种基于一类特殊Petri网的死锁预防方法,与已有的方法相比,本发明使用Gadara网对多线程软件建模,能够直观地建模多线程软件的并发特性,准确地描述其行为操作。在保证行为许可性的同时,能够提高效率、降低受控网结构复杂度,从而能够适用于大型软件,极大地降低了生产成本。
附图说明
图1为基于一类特殊Petri网的多线程软件死锁预防流程图;
图2为2.5.62版本的Linux的一段内核程序对应的Gadara网模型;
图3为图2中Gadara网的受控网模型。
具体实施方式
下面结合附图和实施例对本发明的技术方案做进一步描述。
图1为本发明基于一类特殊Petri网的多线程软件死锁预防方法的流程图,具体包括以下步骤:
步骤1:利用Gadara网对2.5.62版本的Linux内一段出现死锁的并发程序建模,这段程序包含三个线程和三个互斥锁,得到的Gadara网模型NG=(P,T,F,M0)如图2所示,其中P0={p01,p02,p03},PA={p11-p18,p21-p23,p31-p35},PR,={pR1,pR2,pR3},模型中一共有80个可达状态,其中78个活的状态,2个死的状态。
步骤2:通过MIP法对图2的Gadara网进行信标检测,本发明采用如下的MIP法:
目标函数:
约束条件:
Vp,Zt∈{0,1}
M=M0+Dσ
b(p)≤1
其中,若操作库所p会使用资源库所PR∪PC中的资源,则g=1,否则g=0;B(p)=max{M(p)|M=M0+CY,M0≥0,Y0≥0}。
根据上述MIP法,得到了一个包含资源库所数最小的可被清空信标:S1={p11-p13,p15-p18,p21,p23,p34,pR1,pR3}。
步骤3:根据第2步中的MIP法,可以得到上述信标S1的补库所集:显然,得到的补库所集中包含信标中的操作库所p15,p16,p23,将这三个库所从补库所集中删除,它们并不会影响受控网的最终状态。更新补库所集为:
步骤4:经检查发现,当库所p14,p22被同时标记,也就是p14,p22各有一个托肯M(p14)=1、M(p22)=1时,线程1和线程2同时竞争对方所持有的资源,信标S1被清空,系统进入到死锁状态,没有任何线程能够继续执行。因此,要防止这两个库所被同时标记,构建约束:p14+p22≤1。
步骤5:设置集合C,所以C={p14,p22}。
步骤6:一般情况下,Gadara网中所有分支变迁均是不可控的。从图2中可以明显看出,p14能通过不可控变迁t5从p13中获得托肯,p22能通过不可控变迁t14从p21中获得托肯,那么p13,p21将添加到C中。添加后发现,p13能通过不可控变迁t9从p15中获得托肯,将p15添加到C中。再次检查,p15的输入变迁是可控的,无需再添加其他库所。此时C更新为C={p13,p14,p15,p21,p22}。
步骤7:更新C后,结合图2发现,操作库所p12只有一个输出变迁t4,当p12被标记后,添加到C中。再次检查,不存在其他导致C中库所必然被标记的操作库所。返回到第6步,添加p12后,p12的输入变迁t3为不可控变迁,将t3的输入操作库所p11添加到C中。p11和p21的输入变迁是可控的,不需要添加其他操作库所,向下执行第7步,不存在其他一旦被标记就导致C中库所必然被标记的操作库所,更新C为C={p11,p12,p13,p14,p15,p21,p22,p23}。
步骤8:根据∑p∈CM(p)≤∑p∈C∩M(p)=11-1的形式构建约束:p11+p12+p13+p14+p15+p21+p22+p23≤1。
步骤9:通过位置不变量技术,根据上述约束p11+p12+p13+p14+p15+p21+p22+p23≤1计算下列等式:
LDp+Dc=0,其中L代表约束向量,Dp为Gadara网关联矩阵,Dc包括了连接控制器到Gadara网变迁的弧;
M(pc0)=b-LM0;
解上面两个等式得到:Dc=[-1,1,0,0,0,0,1,0,0,1,0,0,-1,0,0,0,1,0,0,0,0,0,0,0],M(pc0)=1,控制器初始标识为1。根据这两个解,可以将控制器pc1添加到原网中,受控网如图3所示。
步骤10:将添加的控制器库所视为资源库所,通过MIP法对受控网进行可被清空信标检测,此时MIP法无解,证明是活的,迭代终止,最终活的受控网如图3所示,其中仅添加了一个控制器pc1。
本发明的核心技术要点在于不止阻止了程序进入到死状态,同时还防止了那些经变迁实施,最终必然会到达死状态的不安全状态。基于信标设计控制器,仅需添加一个控制器就能够阻止所有终将导致某个信标被清空的状态,这极大地减少了死锁预防方法的迭代次数,提高了方法的效率,一定程度上保证了网络的行为许可性,并且只需添加少数的控制器,就能够保证网络的活性,使得受控网网络结构尽可能地简单。
Claims (2)
1.一种针对多线程软件的死锁预防方法,其特征在于,包括以下步骤:
(1)基于一类特殊的Petri网,Gadara网,对多线程软件建模,所述Gadara网,能够直观地建模多线程软件的并发特性,准确地描述其行为操作;
(2)利用MIP法检测(1)所述Gadara网模型中包含资源库所数最少的可被清空信标,若MIP法无解,则网络是活的,方法结束;否则,继续执行以下步骤;
(3)根据(2)所述的可被清空信标S,得到其补库所集若补库所集中包含信标中的操作库所,将其直接从补库所集中删除;
(4)根据(3)所述补库所集构建约束防止那些一旦被标记就导致所述信标S被清空的补库所被同时标记;
(5)设置集合C,
(6)考虑不可控变迁问题,若C中库所的输入变迁是不可控的,且此变迁的输入操作库所不在C中,将其输入操作库所添加到C中;
(7)以(6)所述集合C中的库所为起点向上检查,将必然导致C中库所被标记的操作库所,添加到C中;
(8)重复步骤(6)、(7)至集合C再无操作库所添加,根据C构建新的约束∑p∈CM(p)≤∑p∈C∩M(p)=11-1;
(9)利用位置不变量技术,合成与(8)所述约束对应的控制器,并添加至(1)所述模型中;
(10)将(9)所述合成的受控网输入到步骤(2)中,利用MIP法检测所述受控网中是否存在可被清空的信标,若存在,则表示受控网中存在死锁,继续执行步骤(3)及之后的步骤;否则,表示网络是活的,停止检测,方法终止。
2.如权利要求1所述的针对多线程软件的死锁预防方法,其特征在于,步骤(7)根据集合C中的库所,向上检查是否存在必然导致C中库所被标记的操作库所;某些不在C中的库所,它们被标记后,必然会导致C中的某些库所也被标记,最终形成以上步骤中检测到的死锁状态,那么这些库所也要添加到C中;这些状态称之为不安全状态,它们也是所述死锁预防方法需要阻止的状态;添加完这些导致不安全状态的操作库所后,回到第(6)步,检测新添加的操作库所的输入变迁是否可控,执行相应的操作;(6)、(7)两步形成一个小型的迭代,直到C中不会再添加任何的操作库所,此迭代终止,执行步骤(8)。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910188482.0A CN110083456A (zh) | 2019-03-13 | 2019-03-13 | 一种针对多线程软件的死锁预防方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910188482.0A CN110083456A (zh) | 2019-03-13 | 2019-03-13 | 一种针对多线程软件的死锁预防方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110083456A true CN110083456A (zh) | 2019-08-02 |
Family
ID=67413180
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910188482.0A Pending CN110083456A (zh) | 2019-03-13 | 2019-03-13 | 一种针对多线程软件的死锁预防方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110083456A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1811719A (zh) * | 2006-02-22 | 2006-08-02 | 福建师范大学 | 一种单线程微处理器的死锁检测与干预方法 |
CN103225451A (zh) * | 2012-01-30 | 2013-07-31 | 施拉奇锁有限责任公司 | 锁装置、系统和方法 |
CN103761182A (zh) * | 2013-12-26 | 2014-04-30 | 上海华为技术有限公司 | 一种死锁检测方法及装置 |
CN105159244A (zh) * | 2015-07-29 | 2015-12-16 | 安徽理工大学 | 一种基于Petri网的事件协调控制方法 |
-
2019
- 2019-03-13 CN CN201910188482.0A patent/CN110083456A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1811719A (zh) * | 2006-02-22 | 2006-08-02 | 福建师范大学 | 一种单线程微处理器的死锁检测与干预方法 |
CN103225451A (zh) * | 2012-01-30 | 2013-07-31 | 施拉奇锁有限责任公司 | 锁装置、系统和方法 |
CN103761182A (zh) * | 2013-12-26 | 2014-04-30 | 上海华为技术有限公司 | 一种死锁检测方法及装置 |
CN105159244A (zh) * | 2015-07-29 | 2015-12-16 | 安徽理工大学 | 一种基于Petri网的事件协调控制方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105956021B (zh) | 一种适用于分布式机器学习的自动化任务并行的方法及其系统 | |
Liu et al. | A survey of siphons in Petri nets | |
Varró et al. | Benchmarking for graph transformation | |
Besta et al. | Accelerating irregular computations with hardware transactional memory and active messages | |
US8793674B2 (en) | Computer-guided holistic optimization of MapReduce applications | |
CN103744643B (zh) | 一种多线程程序下多节点并行架构的方法及装置 | |
CN104461871A (zh) | 一种基于petri网的死锁检测方法 | |
JP2014513372A (ja) | 高度並行処理タスクの登録及び実行 | |
CN109308213B (zh) | 基于改进任务调度机制的多任务断点调试方法 | |
Dávid et al. | Streaming model transformations by complex event processing | |
Jacob et al. | CUDACL: A tool for CUDA and OpenCL programmers | |
CN110083456A (zh) | 一种针对多线程软件的死锁预防方法 | |
EP3005122B1 (en) | Code and model coverage as a time series | |
TWI496088B (zh) | 基於指標之程式之發散分析方法及儲存實現該方法之程式之非短暫之實體讀取媒介 | |
Kordic et al. | Formal verification of python software transactional memory based on timed automata | |
Dokulil et al. | Retargeting of the open community runtime to intel xeon phi | |
Jafari et al. | Performance analysis of distributed and asynchronous systems using probabilistic timed actors | |
Bánhelyi et al. | The Global Optimization Algorithm: Newly Updated with Java Implementation and Parallelization | |
Luckow et al. | Symbolic pathfinder v7 | |
Hayashi et al. | Search-based refactoring detection from source code revisions | |
Thuerck et al. | A fast, massively parallel solver for large, irregular pairwise Markov random fields. | |
Gyapay et al. | Joint optimization and reachability analysis in graph transformation systems with time | |
Basso et al. | Optimizing Parallel Java Streams | |
Zhang et al. | Using monterey phoenix to formalize and verify system architectures | |
Chiu et al. | Pipeflow: An efficient task-parallel pipeline programming framework using modern C++ |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20190802 |