并行程序中死锁检测的方法和系统的制作方法

文档序号:6582934阅读:147来源:国知局
专利名称:并行程序中死锁检测的方法和系统的制作方法
技术领域
本发明涉及并行程序,特别涉及并行程序中死锁检测的方法和系统。
背景技术
并行程序中的进程(线程)死锁(deadlock)是一个非常致命的问题。进程(线 程)死锁是指是指两个或两个以上的进程(线程)在执行过程中,因竞争共享资源而造成 的一种互相等待的现象,除非发生死锁的某个进程(线程)放弃该共享资源,否则死锁中的 两个事务都将无限期等待下去。进程(线程)死锁通常会导致整个系统瘫痪。触发进程 (线程)死锁的因素很多,其中主要包括(1)有限的系统资源;(2)进程(线程)运行推进 的顺序不合适;(3)资源分配不当。如果系统资源充足,进程的资源请求都能够得到满足, 死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺 序与速度不同,也可能产生死锁。为了避免进程(线程)死锁对整个系统造成的重大危害, 提高系统的稳定性,需要有一个有效的方法进行死锁检测,以便及时发现进程(线程)死 锁,并采取适当的措施解除死锁,避免系统运行状况进一步恶化。通常基于图论理论的死锁检测算法来解决死锁检测的问题,通过记录并行程序执 行过程中的锁事件来构建直观地表示死锁状况的图,例如锁图(lock graph)和资源分配 图,在图中,节点表示为资源的锁,从一个节点指向另一个节点的有向边表示已获得某个资 源的锁的进程正在请求获得另一个资源的锁。如果图中两个或多个节点之间的有向边构成 闭合的有向环,说明并行程序中存在死锁,因此可以通过检查图中是否存在有向环来检测 死锁。评价死锁检测算法性能时,伪死锁率被视为一项重要指标,在实际应用中,如果伪 死锁率过高,往往耗费掉测试人员大量的时间和精力才能找到真正的死锁,因此降低伪死 锁率对死锁检测至关重要,目前也有一些研究致力于改进算法来降低伪死锁率,然而理论 上的算法改进在实际应用中并不具有普适性,即使采用相同的算法,也要针对具体的应用 环境和产品对算法进行适应性的调整。这需要测试开发人员对算法的内核非常了解,才能 够针对不同的环境对算法的代码进行修改,然而实际应用中对算法内核的修改存在很大的 风险而且代码移植性差,因此,需要一种改进的死锁检测方法,可以灵活地应用于各种开发 环境,而不依赖于死锁检测算法本身就能够提高死锁检测的准确性,并且降低开发成本。

发明内容
基于上述问题,本发明提供一种并行程序中死锁检测的方法和系统。根据本发明的一个方面,提供一种并行程序中死锁检测的方法,该方法包括记录 并行程序运行过程中的锁事件及所述锁事件之间的第一次序关系;将并行程序运行的相关 信息转化为保护锁事件并记录所述保护锁事件;建立保护锁事件和与所述保护锁事件相关 的锁事件之间的第二次序关系,并将所述第二次序关系添加到所述第一次序关系中;根据 添加后的第一次序关系构建对应于所述并行程序运行过程的锁图;以及对所述构建的锁图进行死锁检测。根据本发明的另一个方面,提供一种并行程序中死锁检测的系统,该系统包括记 录模块,用于记录并行程序运行过程中的锁事件及所述锁事件之间的第一次序关系;转化 模块,用于将并行程序运行的相关信息转化为保护锁事件并记录所述保护锁事件;建立模 块,用于建立保护锁事件和与所述保护锁事件相关的锁事件之间的第二次序关系,并将所 述第二次序关系添加到所述第一次序关系中;锁图构建模块,用于根据添加后的第一次序 关系构建对应于所述并行程序运行过程的锁图;以及死锁检测模块,用于对所述构建的锁 图进行死锁检测。本发明的死锁检测方法和系统可以灵活地应用于各种开发环境,而不依赖于死锁 检测算法本身就能够提高死锁检测的准确性,并且降低开发成本。


结合附图,通过参考下列详细的示例性实施例的描述,将会更好地理解本发明本 身、优选的实施方式以及本发明的目的和优点,其中图1示出根据本发明实施例的并行程序的死锁检测方法;图加示出利用现有死锁检测方法针对第一实施例构建的锁图;图2b示出根据本发明实施例的方法对第一实施例重新构建的锁图;图3a示出利用现有死锁检测方法对第二实施例重新构造的锁图;图北示出根据本发明的方法对第二实施例重新构造的锁图;图如示出利用现有死锁检测方法对第三实施例重新构造的锁图;图4b示出根据本发明的方法对第三实施例重新构造的锁图;图fe示出利用现有死锁检测方法对第四实施例重新构造的锁图;图恥示出根据本发明的方法对第四实施例重新构造的锁图;以及图6示出根据本发明实施例的并行程序的死锁检测系统。
具体实施例方式以下结合附图描述根据本发明实施例的并行程序的死锁检测方法和系统。本发明 的基本思想是利用现有死锁检测算法中普遍适用的规则在锁图中,如果构成死锁的所有 节点共享相同的保护锁(gate lock),则该死锁不是真正的死锁。保护锁的定义是死锁检 测算法还必须要考虑保护死锁的第三锁,如果这个锁是线程在获得其他两个锁之前要第一 个获得的锁,那么这个第三锁被称之为保护锁。该规则的理论基础是由于死锁形成条件中 的循环等待条件要求构成死锁的各个锁只有唯一的执行顺序,如果执行顺序被破坏,则无 法构成死锁。例如A、B、C三个锁构成死锁。A、B和C之间只有唯一的执行顺序会导致死锁, 即A等待B正在使用的资源,B等待C正在使用的资源,C等待A正在使用的资源。一旦执 行顺序被破坏,将不构成死锁。举例如果存在锁A、B、C共享保护锁G,因为对于不同的线程 来说,当它要对锁A、B或C进行操作时,都要先操作保护锁,因此死锁顺序被破坏,不会构成 死锁。本发明利用这一规则,将并行程序运行的相关信息转化为保护锁,从而利用现有的死 锁检测算法将伪死锁识别出来,提高死锁检测的准确性。图1示出根据本发明实施例的并行程序的死锁检测方法,该方法包括以下步骤6在步骤S101,记录并行程序运行过程中的锁事件及所述锁事件之间的第一次序关系。在 Java环境中,可以利用字节码插入技术在锁操作后插入跟踪代码来获得并行程序运行过程 中的 锁事件,并为锁事件中的每个分配唯一的ID,以及利用所述分配的ID将锁事件以及锁 事件之间的第一次序关系保存到存储器中。在步骤S102,将并行程序运行的相关信息转化为保护锁事件并记录所述保护锁 事件。具体地,可以通过修改并行程序的代码来获得并行程序运行的相关信息,在Java环 境中,例如,利用字节码插入技术在并行程序的代码中插入跟踪代码来获得并行程序运行 的相关信息。并行程序运行的相关信息可以是线程相关信息、程序逻辑相关信息或者二者 的组合,其中线程相关信息可以是线程标识信息、线程创建信息或线程间的同步信息。例 如定义一个postLock对象,其中postLock对象中包括锁信息、执行方法信息以及本发明 所需的线禾呈信息° 在方法 public static synchronized void postLockAcquire (Object objectLocked, Class IockingClass, int IineNum, String methodlnfo)中除了获得锁/[言 息、执行方法信息外,本发明的实施例利用公用函数Thread. currentThread()获得当前线 程的信息,并将线程信息添加到PostLock对象,以及将PostLock对象保存在一个链表的数 据结构中,为所述保护锁事件的每个分配唯一的ID,利用所述分配的ID将所述保护锁事件 保存到存储器中。在步骤S103,建立保护锁事件和与所述保护锁事件相关的锁事件之间的第二次序 关系,并将所述第二次序关系添加到所述第一次序关系中。其中根据并行程序运行过程中 的锁事件的第一次序关系,确定保护锁事件与相关的锁事件之间的第二次序关系。根据本发明的一个实施例,并行程序运行的相关信息包括线程创建信息,线程创 建信息包括父线程信息和子线程信息,其中建立保护锁事件与相关的锁事件之间的第二次 序关系包括所述父线程在创建子线程之前获得第一锁事件集合;所述子线程获得第二锁 事件集合;获得所述第一锁事件集合和所述第二锁事件集合交集的第三锁事件集合;以及 建立所述线程创建信息与所述第三锁事件集合中的锁事件之间的次序关系。根据本发明的一个实施例,并行程序运行的相关信息包括线程标识信息,其中建 立保护锁事件与相关的锁事件之间的第二次序关系进一步包括建立所述线程标识信息与 所述线程标识信息所标识的线程所获得过的锁事件之间的次序关系。根据本发明的一个实施例,并行程序运行的相关信息包括线程间的同步信息,线 程间的同步信息包括通知线程信息和等待线程信息,其中建立保护锁事件与相关的锁事件 之间的第二次序关系进一步包括所述通知线程在发出通知之前获得第一锁事件集合;所 述等待线程在接收通知之后获得第二锁事件集合;获得所述第一锁事件集合和所述第二锁 事件集合交集的第三锁事件集合;以及建立所述线程间的同步信息与所述第三锁事件集合 中的锁事件之间的次序关系。根据本发明的一个实施例,并行程序运行的相关信息包括程序逻辑信息,其中建 立保护锁事件与相关的锁事件之间的第二次序关系进一步包括所述程序逻辑信息所决定 的并行程序的先执行部分获得第一锁事件集合;所述程序逻辑信息所决定的并行程序的后 执行部分获得第二锁事件集合;获得所述第一锁事件集合和所述第二锁事件集合交集的第 三锁事件集合;以及建立所述程序逻辑信息与所述第三锁事件集合中的锁事件之间的次序 关系。
本领域技术人 员可以理解,本发明示例性地给出并行程序运行的相关信息的具体 实施例,这些实施例既可以单独实施,也可以将其中的一个或多个结合起来实施,结合起来 实施能够更好地提升死锁检测的准确性。在步骤S104,根据添加后的第一次序关系构建对应于所述并行程序运行过程的锁 图,其中锁图中增加了并行程序运行的相关信息转化的保护锁节点以及在保护锁节点与相 关锁事件之间建立的有向边。以及在步骤S105,对所述构建的锁图进行死锁检测,利用现有死锁检测算法进行 死锁检测,由于现有死锁检测算法中具有普遍适用的规则如果构成死锁的所有节点共享 相同的保护锁(gate lock),则该死锁不是真正的死锁。因此利用这一规则,将并行程序运 行的相关信息转化的保护锁所保护的伪死锁识别出来,从而提高死锁检测的准确性。根据本发明的实施例,为了进一步提高死锁检测的准确性,对死锁检测结果进一 步过滤,过滤的原则是如果所检测出的死锁的环中至少任意两个节点共享一个保护锁,则 确定所检测出来的死锁不是真正的死锁。该原则的理论基础是由于死锁形成条件中有一个 循环等待条件,如果A,B,C三个锁存在死锁的话,A,B和C之间只有唯一的执行顺序会导致 死锁,即A等待B正在使用的资源,B等待C正在使用的资源,C等待A正在使用的资源。一 旦执行顺序被破坏,将不构成死锁。举例如果存在A,C共享保护锁G,当存在B等待C正在 使用资源的时候,因为存在保护锁G,就一定不会发生C等待A正在使用的资源的情况(因 为一旦获得G,A就要等待G被释放),死锁顺序被破坏,将不会构成死锁。现以Java为例说明本发明的实施例,当然,本发明不限于Java环境,而是也适合 于其他面向对象语言的环境或其他编程语言环境。以下示出利用本发明实施例的方法对程 序代码example 1进行死锁检测的实例。
权利要求
1.一种并行程序中死锁检测的方法,包括记录并行程序运行过程中的锁事件及所述锁事件之间的第一次序关系; 将并行程序运行的相关信息转化为保护锁事件并记录所述保护锁事件; 建立所述保护锁事件和与所述保护锁事件相关的锁事件之间的第二次序关系,并将所 述第二次序关系添加到所述第一次序关系中;根据添加后的第一次序关系构建对应于所述并行程序运行过程的锁图;以及 对所述构建的锁图进行死锁检测。
2.根据权利要求1所述的方法,其中记录所述保护锁事件进一步包括为所述保护锁事 件分配唯一的ID ;以及利用分配的所述ID将所述保护锁事件保存到存储器中。
3.根据权利要求1或2所述的方法,还包括对死锁检测结果进行过滤,过滤原则是如 果检测出构成死锁的有向环的至少任意两条有向边共享一个保护锁,则确定所述检测出的 死锁不是真正的死锁。
4.根据权利要求1或2所述的方法,其中所述并行程序运行的相关信息至少包括线程 相关信息和程序逻辑相关信息的其中之一。
5.根据权利要求4所述的方法,其中所述并行程序运行的相关信息包括线程创建信 息,所述线程创建信息包括父线程信息和子线程信息,其中建立保护锁事件和与所述保护 锁事件相关的锁事件之间的第二次序关系进一步包括所述父线程在创建子线程之前获得第一锁事件集合; 所述子线程获得第二锁事件集合;获得所述第一锁事件集合和所述第二锁事件集合交集的第三锁事件集合;以及 建立所述线程创建信息与所述第三锁事件集合中的锁事件之间的次序关系。
6.根据权利要求4所述的方法,其中所述并行程序运行的相关信息包括线程标识信 息,其中建立保护锁事件和与所述保护锁事件相关的锁事件之间的第二次序关系进一步包 括建立所述线程标识信息与所述线程标识信息所标识的线程所获得过的锁事件之间的次 序关系。
7.根据权利要求4所述的方法,其中所述并行程序运行的相关信息包括线程间的同步 信息,所述线程间的同步信息包括通知线程信息和等待线程信息,其中建立保护锁事件与 和与所述保护锁事件相关的锁事件之间的第二次序关系进一步包括所述通知线程在发出通知之前获得第一锁事件集合; 所述等待线程在接收通知之后获得第二锁事件集合;获得所述第一锁事件集合和所述第二锁事件集合交集的第三锁事件集合;以及 建立所述线程间的同步信息与所述第三锁事件集合中的锁事件之间的次序关系。
8.根据权利要求4所述的方法,其中所述并行程序运行的相关信息包括程序逻辑信 息,其中建立保护锁事件和与所述保护锁事件相关的锁事件之间的第二次序关系进一步包 括所述程序逻辑信息所决定的并行程序的先执行部分获得第一锁事件集合; 所述程序逻辑信息所决定的并行程序的后执行部分获得第二锁事件集合; 获得所述第一锁事件集合和所述第二锁事件集合交集的第三锁事件集合;以及 建立所述程序逻辑信息与所述第三锁事件集合中的锁事件之间的次序关系。
9.根据权利要求1所述的方法,其中所述并行程序运行的相关信息是通过修改所述并 行程序的代码来获得的。
10.一种并行程序中死锁检测的系统,包括记录模块,用于记录并行程序运行过程中的锁事件及所述锁事件之间的第一次序关系;转化模块,用于将并行程序运行的相关信息转化为保护锁事件并记录所述保护锁事件;建立模块,用于建立保护锁事件和与所述保护锁事件相关的锁事件之间的第二次序关 系,并将所述第二次序关系添加到所述第一次序关系中;锁图构建模块,用于根据添加后的第一次序关系构建对应于所述并行程序运行过程的 锁图;以及死锁检测模块,用于对所述构建的锁图进行死锁检测。
11.根据权利要求10所述的系统,其中转化模块进一步包括为所述保护锁事件的每个 分配唯一的ID的子模块;以及利用分配的所述ID将所述保护锁事件保存到存储器中的子 模块。
12.根据权利要求10或11所述的系统,还包括死锁过滤模块,用于对死锁检测结果进 行过滤,过滤原则是如果检测出构成死锁的有向环的至少任意两条有向边共享一个保护 锁,则确定所述检测出的死锁不是真正的死锁。
13.根据权利要求10或11所述的系统,其中所述与程序相关的信息至少包括线程相关 信息和程序逻辑相关信息的其中之一。
14.根据权利要求13所述的系统,其中所述并行程序运行的相关信息包括线程创建信 息,所述线程创建信息包括父线程信息和子线程信息,其中所述建立模块进一步包括所述父线程在创建子线程之前获得第一锁事件集合的子模块; 所述子线程获得第二锁事件集合的子模块;获得所述第一锁事件集合和所述第二锁事件集合交集的第三锁事件集合的子模块;以及建立所述线程创建信息与所述第三锁事件集合中的锁事件之间的次序关系的子模块。
15.根据权利要求13所述的系统,其中所述并行程序运行的相关信息包括线程标识信 息,其中所述建立模块进一步包括建立所述线程标识信息与所述线程标识信息所标识的线 程所获得过的锁事件之间的次序关系的子模块。
16.根据权利要求13所述的系统,其中所述并行程序运行的相关信息包括线程间的同 步信息,所述线程间的同步信息包括通知线程信息和等待线程信息,其中所述建立模块进 一步包括所述通知线程在发出通知之前获得第一锁事件集合的子模块; 所述等待线程在接收通知之后获得第二锁事件集合的子模块; 获得所述第一锁事件集合和所述第二锁事件集合交集的第三锁事件集合的子模块;以及建立所述线程间的同步信息与所述第三锁事件集合中的锁事件之间的次序关系的子 模块。
17.根据权利要求13所述的系统,其中所述并行程序运行的相关信息包括程序逻辑信 息,其中所述建立模块进一步包括所述程序逻辑信息所决定的并行程序的先执行部分获得第一锁事件集合的子模块; 所述程序逻辑信息所决定的并行程序的后执行部分获得第二锁事件集合的子模块; 获得所述第一锁事件集合和所述第二锁事件集合交集的第三锁事件集合的子模块;以及建立所述程序逻辑信息与所述第三锁事件集合的锁事件之间的次序关系的子模块。
18.根据权利要求10所述的系统,其中所述并行程序运行的相关信息是通过修改所述 并行程序的代码来获得的。
全文摘要
本发明公开一种并行程序中死锁检测的方法和系统,该方法包括记录并行程序运行过程中的锁事件及所述锁事件之间的第一次序关系;将并行程序运行的相关信息转化为保护锁事件并记录所述保护锁事件;建立保护锁事件和与所述保护锁事件相关的锁事件之间的第二次序关系,并将所述第二次序关系添加到所述第一次序关系中;根据添加后的第一次序关系构建对应于所述并行程序运行过程的锁图;以及对所述构建的锁图进行死锁检测。本发明的死锁检测方法不依赖于死锁检测算法本身就能够提高死锁检测的准确性,可以灵活地应用于各种开发环境并且降低开发成本。
文档编号G06F9/46GK102053861SQ20091020907
公开日2011年5月11日 申请日期2009年10月30日 优先权日2009年10月30日
发明者李丽芳, 车漾, 齐尧 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1