CN113360290B - 死锁检测方法和装置 - Google Patents

死锁检测方法和装置 Download PDF

Info

Publication number
CN113360290B
CN113360290B CN202010144616.1A CN202010144616A CN113360290B CN 113360290 B CN113360290 B CN 113360290B CN 202010144616 A CN202010144616 A CN 202010144616A CN 113360290 B CN113360290 B CN 113360290B
Authority
CN
China
Prior art keywords
task
queue
execution
program
tasks
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
Application number
CN202010144616.1A
Other languages
English (en)
Other versions
CN113360290A (zh
Inventor
孙斐
孙冰心
张宪锋
郁利涛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN202010144616.1A priority Critical patent/CN113360290B/zh
Publication of CN113360290A publication Critical patent/CN113360290A/zh
Application granted granted Critical
Publication of CN113360290B publication Critical patent/CN113360290B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/524Deadlock detection or avoidance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请提供一种死锁检测方法和装置。本申请死锁检测方法,包括:获取第一任务序列,所述第一任务序列为待检测程序的至少一个任务序列中的任意一个,所述第一任务序列用于表征所述待检测程序包括的至少两个任务的执行顺序;根据所述第一任务序列获取所述至少两个任务的所属队列及所述所属队列的队列类型;根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁;当确定所述待检测程序会发生死锁时,抛出异常提示。本申请可以以很小的计算量对程序进行死锁检测,不但可以在保证待检测程序运行性能,也可以兼容各种运行环境,对各种高级编程语言编写的程序进行高效的程序测试。

Description

死锁检测方法和装置
技术领域
本申请涉及计算机技术,尤其涉及一种死锁检测方法和装置。
背景技术
随着计算机技术的发展,各类操作系统级的编程框架向开发者提供多线程开发模型,其包括多种开发框架和函数库,帮助开发者更方便的使用多线程相关技术开发自己的应用程序。但是开发者开发应用程序时可能会造成死锁,死锁是指两个或两个以上的线程在执行过程中,由于彼此等待而造成的一种阻塞的现象,若无外力作用,该两个或两个以上的线程都将无法推进下去。此时称应用程序处于死锁状态或产生了死锁。死锁会导致应用程序冻屏、无响应或超时退出等,从而对开发者和使用者造成一定的损失。
目前常用的死锁检测方法是在应用程序运行过程中,借助额外的检测线程或全局的数据结构对应用程序进行实时检测。
但是上述方法会占用较多的计算机资源,使应用程序执行效率变低,甚至可能产生卡顿等问题。
发明内容
本申请提供一种死锁检测方法和装置,可以以很小的计算量对程序进行死锁检测,不但可以在保证待检测程序运行性能,也可以兼容各种运行环境,对各种高级编程语言编写的程序进行高效的程序测试。
第一方面,本申请提供一种死锁检测方法,包括:获取第一任务序列,所述第一任务序列为待检测程序的至少一个任务序列中的任意一个,所述第一任务序列用于表征所述待检测程序包括的至少两个任务的执行顺序;根据所述第一任务序列获取所述至少两个任务的所属队列及所述所属队列的队列类型;根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁;当确定所述待检测程序会发生死锁时,抛出异常提示。
本申请可以在待检测程序运行的同时,对程序进行死锁检测,该死锁检测所产生的计算量很小,并且不需要创建全局的数据结构,可以在保证待检测程序运行性能的同时实现程序的死锁检测。也可以兼容各种运行环境,对各种高级编程语言编写的程序进行测试,而且该死锁检测所产生的计算量也很小,可以实现兼容性强、高效的程序测试。
在一种可能的实现方式中,所述根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁,包括:判断第一任务的执行队列集合是否包括第二任务的所属队列,所述第一任务调度所述第二任务,所述至少两个任务包括所述第一任务和所述第二任务,且所述第一任务的所属队列和所述第二任务的所属队列均为串行队列,所述执行队列集合包括至少一个队列,所述至少一个队列包括对应任务的所属队列;若所述第一任务的执行队列集合包括所述第二任务的所属队列,则确定所述待检测程序会发生死锁。
针对第一任务调度第二任务的情况,通过判断第一任务所属队列是否包括第二任务所属队列来确定待检测程序会发生死锁,其所需的计算量很小,对程序的运行不会造成影响。
在一种可能的实现方式中,还包括:若所述第一任务的执行队列集合不包括所述第二任务的所属队列,则判断是否有第三任务,所述第二任务调度所述第三任务,所述至少两个任务包括所述第三任务;若有所述第三任务,则判断所述第二任务的执行队列集合是否包括所述第三任务的所属队列;若所述第二任务的执行队列集合包括所述第三任务的所属队列,则确定所述待检测程序会发生死锁。
针对第一任务调度第二任务,第二任务调度第三任务的情况,通过进一步判断第二任务所属队列是否包括第三任务所属队列来确定待检测程序会发生死锁,其所需的计算量很小,对程序的运行不会造成影响。
在一种可能的实现方式中,还包括:若所述第二任务的执行队列集合不包括所述第三任务的所属队列,则判断是否有第四任务,所述第四任务为所述第三任务的前序任务,所述至少两个任务包括所述第四任务;若有所述第四任务,则判断所述第二任务的执行队列集合和所述第四任务的执行队列集合是否包含相同的队列;若所述第二任务的执行队列集合和所述第四任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
针对第一任务调度第二任务,第二任务调度第三任务,第三任务有前序第四任务的情况,通过进一步判断第二任务的执行队列集合和第四任务的执行队列集合是否包含相同的队列来确定待检测程序会发生死锁,其所需的计算量很小,对程序的运行不会造成影响。
在一种可能的实现方式中,还包括:若所述第一任务的执行队列集合不包括所述第二任务的所属队列或者,则判断是否有第五任务,所述第五任务为所述第二任务的前序任务,所述至少两个任务包括所述第五任务;若有所述第五任务,则判断所述第一任务的执行队列集合和所述第五任务的执行队列集合是否包含相同的队列;若所述第一任务的执行队列集合和所述第五任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
针对第一任务调度第二任务,第二任务有前序第五任务的情况,通过进一步判断第一任务的执行队列集合和第五任务的执行队列集合是否包含相同的队列来确定待检测程序会发生死锁,其所需的计算量很小,对程序的运行不会造成影响。
在一种可能的实现方式中,还包括:若所述第一任务的执行队列集合和所述第五任务的执行队列集合不包含相同的队列,则判断是否有第六任务,所述第五任务调度所述第六任务,所述至少两个任务包括所述第六任务;若有所述第六任务,则判断所述第一任务的执行队列集合和所述第六任务的执行队列集合是否包含相同的队列;若所述第一任务的执行队列集合和所述第六任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
针对第一任务调度第二任务,第二任务有前序第五任务,第五任务调度第六任务的情况,通过进一步判断第一任务的执行队列集合和第六任务的执行队列集合是否包含相同的队列来确定待检测程序会发生死锁,其所需的计算量很小,对程序的运行不会造成影响。
在一种可能的实现方式中,还包括:若所述第二任务的执行队列集合和所述第四任务的执行队列集合不包含相同的队列,则判断是否有第七任务,所述第四任务调度所述第七任务,所述至少两个任务包括所述第七任务;若有所述第七任务,则判断所述第二任务的执行队列集合和所述第七任务的执行队列集合是否包含相同的队列;若所述第二任务的执行队列集合和所述第七任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
针对第一任务调度第二任务,第二任务调度第三任务,第三任务有前序第四任务,第四任务调度第七任务的情况,通过进一步判断第二任务的执行队列集合和第七任务的执行队列集合是否包含相同的队列来确定待检测程序会发生死锁,其所需的计算量很小,对程序的运行不会造成影响。
在一种可能的实现方式中,所述执行队列集合由比特位串表示,所述比特位串包括至少两个比特位,所述至少两个比特位和至少两个队列对应;当所述执行队列集合包括第一队列时,所述第一队列对应的比特位用1表示,当所述执行队列集合不包括第一队列时,所述第一队列对应的比特位用0表示,所述第一队列为所述至少两个队列中的任意一个;判断两个所述执行队列集合是否包含相同的队列,包括:将所述两个所述执行队列集合的比特位串进行与运算;若所述与运算的结果不为0,则确定所述两个所述执行队列集合是否包含相同的队列。
通过比特位串的方式表示队列集合,所需的计算量更小。
在一种可能的实现方式中,所述抛出异常提示之后,还包括:执行死锁处理任务,所述死锁处理任务用于在所述待检测程序运行的过程中避免死锁的发生。
在一种可能的实现方式中,所述根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁,包括:判断线程池中运行的任务是否包括第八任务,所述线程池中运行的任务包括第九任务,所述第九任务调度第十任务,所述第十任务的前序任务为第十一任务,所述第十一任务调度所述第八任务,所述至少两个任务包括所述第八任务、所述第九任务、所述第十任务和所述第十一任务,且所述第八任务和所述第九任务的所属队列为并行队列,所述第十任务和所述第十一任务的所属队列为串行队列,所述线程池的线程资源全部被占用的;若所述线程池中运行的任务不包括所述第八任务,则确定所述待检测程序会发生死锁。
针对并行队列的情况,通过判断线程池是否包括关键任务来确定待检测程序会发生死锁,其所需的计算量很小,对程序的运行不会造成影响。
在一种可能的实现方式中,所述抛出异常提示之后,还包括:采用运行所述第十一任务的线程资源运行所述第八任务;或者,临时创建线程资源运行所述第八任务。
第二方面,本申请提供一种死锁检测装置,包括:获取模块,用于获取第一任务序列,所述第一任务序列为待检测程序的至少一个任务序列中的任意一个,所述第一任务序列用于表征所述待检测程序包括的至少两个任务的执行顺序;根据所述第一任务序列获取所述至少两个任务的所属队列及所述所属队列的队列类型;检测模块,用于根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁;提示模块,用于当确定所述待检测程序会发生死锁时,抛出异常提示。
在一种可能的实现方式中,所述检测模块,具体用于判断第一任务的执行队列集合是否包括第二任务的所属队列,所述第一任务调度所述第二任务,所述至少两个任务包括所述第一任务和所述第二任务,且所述第一任务的所属队列和所述第二任务的所属队列均为串行队列,所述执行队列集合包括至少一个队列,所述至少一个队列包括对应任务的所属队列;若所述第一任务的执行队列集合包括所述第二任务的所属队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块,还用于若所述第一任务的执行队列集合不包括所述第二任务的所属队列,则判断是否有第三任务,所述第二任务调度所述第三任务,所述至少两个任务包括所述第三任务;若有所述第三任务,则判断所述第二任务的执行队列集合是否包括所述第三任务的所属队列;若所述第二任务的执行队列集合包括所述第三任务的所属队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块,还用于若所述第二任务的执行队列集合不包括所述第三任务的所属队列,则判断是否有第四任务,所述第四任务为所述第三任务的前序任务,所述至少两个任务包括所述第四任务;若有所述第四任务,则判断所述第二任务的执行队列集合和所述第四任务的执行队列集合是否包含相同的队列;若所述第二任务的执行队列集合和所述第四任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块,还用于若所述第一任务的执行队列集合不包括所述第二任务的所属队列或者,则判断是否有第五任务,所述第五任务为所述第二任务的前序任务,所述至少两个任务包括所述第五任务;若有所述第五任务,则判断所述第一任务的执行队列集合和所述第五任务的执行队列集合是否包含相同的队列;若所述第一任务的执行队列集合和所述第五任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块,还用于若所述第一任务的执行队列集合和所述第五任务的执行队列集合不包含相同的队列,则判断是否有第六任务,所述第五任务调度所述第六任务,所述至少两个任务包括所述第六任务;若有所述第六任务,则判断所述第一任务的执行队列集合和所述第六任务的执行队列集合是否包含相同的队列;若所述第一任务的执行队列集合和所述第六任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块,还用于若所述第二任务的执行队列集合和所述第四任务的执行队列集合不包含相同的队列,则判断是否有第七任务,所述第四任务调度所述第七任务,所述至少两个任务包括所述第七任务;若有所述第七任务,则判断所述第二任务的执行队列集合和所述第七任务的执行队列集合是否包含相同的队列;若所述第二任务的执行队列集合和所述第七任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述执行队列集合由比特位串表示,所述比特位串包括至少两个比特位,所述至少两个比特位和至少两个队列对应;当所述执行队列集合包括第一队列时,所述第一队列对应的比特位用1表示,当所述执行队列集合不包括第一队列时,所述第一队列对应的比特位用0表示,所述第一队列为所述至少两个队列中的任意一个;所述检测模块,具体用于将所述两个所述执行队列集合的比特位串进行与运算;若所述与运算的结果不为0,则确定所述两个所述执行队列集合是否包含相同的队列。
在一种可能的实现方式中,所述提示模块,还用于执行死锁处理任务,所述死锁处理任务用于在所述待检测程序运行的过程中避免死锁的发生。
在一种可能的实现方式中,所述检测模块,具体用于判断线程池中运行的任务是否包括第八任务,所述线程池中运行的任务包括第九任务,所述第九任务调度第十任务,所述第十任务的前序任务为第十一任务,所述第十一任务调度所述第八任务,所述至少两个任务包括所述第八任务、所述第九任务、所述第十任务和所述第十一任务,且所述第八任务和所述第九任务的所属队列为并行队列,所述第十任务和所述第十一任务的所属队列为串行队列,所述线程池的线程资源全部被占用的;若所述线程池中运行的任务不包括所述第八任务,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述提示模块,还用于采用运行所述第十一任务的线程资源运行所述第八任务;或者,临时创建线程资源运行所述第八任务。
第三方面,本申请提供一种设备,包括:一个或多个处理器,被配置为调用存储在存储器中的程序指令,以执行如上述第一方面中任一项所述的方法。
第四方面,本申请提供一种计算机可读存储介质,包括计算机程序,所述计算机程序在计算机或处理器上被执行时,使得所述计算机或处理器执行上述第一方面中任一项所述的方法。
第五方面,本申请提供一种计算机程序,当所述计算机程序被计算机执行时,用于执行上述第一方面中任一项所述的方法。
第六方面,本申请提供一种芯片,包括处理器和存储器,所述存储器用于存储计算机程序,所述处理器用于调用并运行所述存储器中存储的计算机程序,以执行如上述第一方面中任一项所述的方法。
第七方面,本申请提供一种计算机程序产品,所述计算机程序产品包括计算机程序代码,当所述计算机程序代码在计算机上运行时,使得计算机执行上述第一方面中的操作和/或处理。
附图说明
图1示出了设备100的一个示例性的结构示意图;
图2示出了程序的运行环境的一个示例性的框架图;
图3示出了自锁的一个示例性的示意图;
图4示出了循环锁的一个示例性的示意图;
图5示出了串行队列互锁的一个示例性的示意图;
图6示出串行队列与并行队列互锁的一个示例性的示意图;
图7为本申请死锁检测方法实施例一的流程图;
图8为本申请死锁检测方法实施例二的流程图;
图9为本申请死锁检测装置实施例的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请中的附图,对本申请中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请的说明书实施例和权利要求书及附图中的术语“第一”、“第二”等仅用于区分描述的目的,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元。方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
应当理解,在本申请中,“至少一个(项)”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,用于描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:只存在A,只存在B以及同时存在A和B三种情况,其中A,B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b或c中的至少一项(个),可以表示:a,b,c,“a和b”,“a和c”,“b和c”,或“a和b和c”,其中a,b,c可以是单个,也可以是多个。
本申请提供了一种死锁检测方法,可以应用于两种场景,场景一是程序的运行场景,该场景下当程序被设备执行时,可以在程序的基础上增加死锁检测功能,以对该程序是否存在死锁的可能性进行动态并实时的检测。场景二是实现程序测试功能的程序产品,该场景下当前述程序产品被设备执行时,可以提供程序的运行环境,当程序运行于该运行环境下时,可以对该程序进行测试,尤其是对该程序是否存在死锁的可能性进行检测。
应该理解,上述设备可以是任意具备执行程序或程序产品功能的装置、芯片或实体设备等,例如,计算机、小型设备和终端设备及其处理器芯片等。本申请对此不做具体限定。
图1示出了设备100的一个示例性的结构示意图。如图1所示,设备100包括:应用处理器101、微控制器单元(microcontroller unit,MCU)102、存储器103、输入/输出(input/output,I/O)设备109等部件。
可选的,设备100还包括:调制解调器(modem)104、射频(radio frequency,RF)模块105、无线保真(Wireless-Fidelity,简称Wi-Fi)模块106、蓝牙模块107、传感器108、定位模块110等部件。
这些部件可通过一根或多根通信总线或信号线进行通信。前述通信总线或信号线可以是本申请提供的CAN总线。本领域技术人员可以理解,设备100可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
下面结合图1对设备100的各个部件进行具体的介绍:
应用处理器101是设备100的控制中心,利用各种接口和总线连接设备100的各个部件。在一些实施例中,处理器101可包括一个或多个处理单元。
MCU 102是用于获取并处理来自传感器108的数据的协处理器,MCU 102的处理能力和功耗小于应用处理器101,但具有“永久开启(always on)”的特点,可以在应用处理器101处于休眠模式时持续收集以及处理传感器数据,以极低的功耗保障传感器的正常运行。在一个实施例中,MCU 102可以为sensor hub芯片。
存储器103中存储有计算机程序,诸如图1所示的操作系统111和应用程序112。应用处理器101被配置用于执行存储器103中的计算机程序,从而实现该计算机程序定义的功能,例如应用处理器101执行操作系统111从而在设备100上实现操作系统的各种功能。存储器103还存储有除计算机程序之外的其他数据,诸如操作系统111和应用程序112运行过程中产生的数据。存储器103为非易失性存储介质,一般包括内存和外存。内存包括但不限于随机存取存储器(random access memory,RAM),只读存储器(read-only memory,ROM),或高速缓存(cache)等。外存包括但不限于闪存(flash memory)、硬盘、光盘、通用串行总线(universal serial bus,USB)盘等。计算机程序通常被存储在外存上,处理器在执行计算机程序前会将该程序从外存加载到内存。存储器103可以是独立的,通过总线与应用处理器101相连接;存储器103也可以和应用处理器101集成到一个芯片子系统。
输入/输出设备109包括但不限于:显示器1091、触摸屏1092,以及音频电路1093等等。
其中,触摸屏1092可采集设备100的用户在其上或附近的触摸事件(比如用户使用手指、触控笔等任何适合的物体在触摸屏1092上或在触控屏触摸屏1092附近的操作),并将采集到的触摸事件发送给其他器件(例如应用处理器101)。其中,用户在触摸屏1092附近的操作可以称之为悬浮触控;通过悬浮触控,用户可以在不直接接触触摸屏1092的情况下选择、移动或拖动目的(例如图标等)。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型来实现触摸屏1092。
显示器(也称为显示屏)1091用于显示用户输入的信息或展示给用户的信息。可以采用液晶显示屏、有机发光二极管等形式来配置显示器。触摸屏1092可以覆盖在显示器1091之上,当触摸屏1092检测到触摸事件后,传送给应用处理器101以确定触摸事件的类型,随后应用处理器101可以根据触摸事件的类型在显示器1091上提供相应的视觉输出。虽然在图1中,触摸屏1092与显示器1091是作为两个独立的部件来实现设备100的输入和输出功能,但是在某些实施例中,可以将触摸屏1092与显示器1091集成而实现设备100的输入和输出功能。另外,触摸屏1092和显示器1091可以以全面板的形式配置在设备100的正面,以实现无边框的结构。
音频电路1093、扬声器1094、麦克风1095可提供用户与设备100之间的音频接口。音频电路1093可将接收到的音频数据转换后的电信号,传输到扬声器1094,由扬声器1094转换为声音信号输出;另一方面,麦克风1095将收集的声音信号转换为电信号,由音频电路1093接收后转换为音频数据,再通过modem 104和射频模块105将音频数据发送给比如另一设备,或者将音频数据输出至存储器103以便进一步处理。
另外,设备100还可以具有指纹识别功能。例如,可以在设备100的背面(例如后置摄像头的下方)配置指纹采集器件,或者在设备100的正面(例如触摸屏1092的下方)配置指纹采集器件。又例如,可以在触摸屏1092中配置指纹采集器件来实现指纹识别功能,即指纹采集器件可以与触摸屏1092集成在一起来实现设备100的指纹识别功能。在这种情况下,该指纹采集器件配置在触摸屏1092中,可以是触摸屏1092的一部分,也可以以其他方式配置在触摸屏1092中。本申请实施例中的指纹采集器件的主要部件是指纹传感器,该指纹传感器可以采用任何类型的感测技术,包括但不限于光学式、电容式、压电式或超声波传感技术等。
modem 104以及射频模块105构成了设备100通信子系统,用于实现无线通信标准协议的主要功能。其中,modem 104用于编解码、信号的调制解调、均衡等。射频模块105用于无线信号的接收和发送,射频模块105包括但不限于天线、至少一个放大器、耦合器、双工器等。射频模块105配合modem 104实现无线通信功能。modem 104可以作为单独的芯片,也可以与其他芯片或电路在一起形成系统级芯片或集成电路。这些芯片或集成电路可应用于所有实现无线通信功能的设备,包括:手机、电脑、笔记本、平板、路由器、可穿戴设备、汽车、家电设备等。
设备100还可以使用Wi-Fi模块106,蓝牙模块107等来进行无线通信。Wi-Fi模块106用于为设备100提供遵循Wi-Fi相关标准协议的网络接入,设备100可以通过Wi-Fi模块106接入到Wi-Fi接入点,进而访问互联网。在其他一些实施例中,Wi-Fi模块106也可以作为Wi-Fi无线接入点,可以为其他设备提供Wi-Fi网络接入。蓝牙模块107用于实现设备100与其他设备(例如手机、智能手表等)之间的短距离通信。本申请实施例中的Wi-Fi模块106可以是集成电路或Wi-Fi芯片等,蓝牙模块107可以是集成电路或者蓝牙芯片等。
定位模块110用于确定设备100的地理位置。可以理解的是,定位模块110具体可以是全球定位系统(global position system,GPS)或北斗卫星导航系统、俄罗斯GLONASS等定位系统的接收器。
Wi-Fi模块106,蓝牙模块107和定位模块110分别可以是单独的芯片或集成电路,也可以集成到一起。例如,在一个实施例中,Wi-Fi模块106,蓝牙模块107和定位模块110可以集成到同一芯片上。在另一个实施例中,Wi-Fi模块106,蓝牙模块107、定位模块110以及MCU 102也可以集成到同一芯片中。
传感器108可以包括光传感器、运动传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示器1091的亮度,接近传感器可在设备100移动到耳边时,关闭显示屏的电源。作为运动传感器的一种,加速计传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向;传感器108还可以包括陀螺仪、气压计、湿度计、温度计、红外线传感器等其它传感器,在此不再赘述。MCU 102和传感器108可以集成到同一块芯片上,也可以是分离的元件,通过总线连接。
进一步地,设备100搭载的操作系统111可以为
Figure BDA0002400300380000081
或者其它操作系统,本申请实施例对此不作任何限制。
以搭载
Figure BDA0002400300380000082
操作系统的设备100为例,设备100从逻辑上可划分为硬件层、操作系统111,以及应用层。硬件层包括如上所述的应用处理器101、MCU 102、存储器103、modem 104、Wi-Fi模块106、传感器108、定位模块110等硬件资源。应用层包括一个或多个应用程序,比如应用程序112,应用程序112可以为社交类应用、电子商务类应用、浏览器等任意类型的应用程序。操作系统111作为硬件层和应用层之间的软件中间件,是管理和控制硬件与软件资源的计算机程序。
在一个实施例中,操作系统111包括内核,硬件抽象层(hardware abstractionlayer,HAL)、库和运行时(libraries and runtime)以及框架(framework)。其中,内核用于提供底层系统组件和服务,例如:电源管理、内存管理、线程管理、硬件驱动程序等;硬件驱动程序包括Wi-Fi驱动、传感器驱动、定位模块驱动等。硬件抽象层是对内核驱动程序的封装,向框架提供接口,屏蔽低层的实现细节。硬件抽象层运行在用户空间,而内核驱动程序运行在内核空间。
库和运行时也叫做运行时库,它为可执行程序在运行时提供所需要的库文件和执行环境。在一个实施例中,库与运行时包括安卓运行时(android runtime,ART),库,以及场景包运行时。ART是能够把应用程序的字节码转换为机器码的虚拟机或虚拟机实例。库是为可执行程序在运行时提供支持的程序库,包括浏览器引擎(比如webkit)、脚本执行引擎(比如JavaScript引擎)、图形处理引擎等。场景包运行时是场景包的运行环境,主要包括页面执行环境(page context)和脚本执行环境(script context),其中,页面执行环境通过调用相应的库解析html、css等格式的页面代码,脚本执行环境通过调用相应的功能库解析执行JavaScript等脚本语言实现的代码或可执行文件。
框架用于为应用层中的应用程序提供各种基础的公共组件和服务,比如窗口管理、位置管理等等。在一个实施例中,框架包括地理围栏服务,策略服务,通知管理器等。
以上描述的操作系统111的各个组件的功能均可以由应用处理器101执行存储器103中存储的程序来实现。
所属领域的技术人员可以理解设备100可包括比图1所示的更少或更多的部件,图1所示的该设备仅包括与本申请所公开的多个实现方式更加相关的部件。
图2示出了程序的运行环境的一个示例性的框架图,如图2所示,该运行环境可以部署于上述设备中,其包括操作系统、系统接口、任务队列线程模型、死锁检测模型和程序。其中,操作系统提供了资源管理、设备管理等基础功能,还提供了线程、进程等基础单元,为运行程序提供基础设施。系统接口提供了运行程序的基础接口、基础库以及可以运行高级编程语言的虚拟机。任务队列线程模型提供了各类任务调度器,例如串行任务调度器、并行任务调度器和专有任务调度器,可以通过任务调度器分发并执行具体任务。程序即为开发人员采用高级编程语言编写的代码,可以实现业务逻辑,程序被拆解为多个任务,基于多个任务之间的逻辑,该多个任务被加入到任务队列线程模型提供的各类任务调度器中,在程序运行的过程中获得来自死锁检测模型的死锁提示,并及时做出死锁应急响应。死锁检测模型基于任务队列线程模型提供的各类任务调度器,对程序的任务进行死锁检测。
上述任务调度器和任务的所属队列关联,串行任务调度器用于调度串行队列中的任务,串行队列中的任务之间依顺序存在依赖关系,并行任务调度器用于调度并行队列中的任务,并行队列中的任务之间无依赖关系且可以并发执行,专有任务调度器专用于调度如用户界面(user interface,UI)、输入/输出(input/output,IO)、图形处理器(graphicsprocessing unit,GPU)等专有任务。
基于上述程序的运行环境的框架图,在任务之间的调度不当时,可能会存在以下几种死锁的情况:
一、自锁
图3示出了自锁的一个示例性的示意图,如图3所示,某个串行队列中包括三个任务(1-3),这三个任务的执行顺序为任务1→任务2→任务3,即最先执行任务1,然后执行任务2,最后执行任务3,前一任务完成后才能执行下一个任务。而任务1的执行过程中需要调度任务3。由于任务3必须等任务2和任务1执行完成,因此该示例中的三个任务产生了任务间的互相等待,造成死锁。
二、循环锁
图4示出了循环锁的一个示例性的示意图,如图4所示,三个串行队列(1-3)、七个任务(1-7),其中,串行队列1的执行顺序为任务1→任务4→任务5,串行队列2的执行顺序为任务2→任务6,串行队列3的执行顺序为任务3→任务7,而任务1的执行过程中需要调度任务2,任务2的执行过程中需要调度任务3,任务3的执行过程中需要调度任务5。由于任务5必须等任务4和任务1执行完成,因此该示例中的任务1、任务2、任务3、任务5、任务4存在循环依赖,产生死锁。
三、串行队列互锁
图5示出了串行队列互锁的一个示例性的示意图,如图5所示,两个串行队列(1-2)、六个任务(1-6),其中,串行队列1的执行顺序为任务1→任务4→任务6,串行队列2的执行顺序为任务2→任务3→任务5,而任务1的执行过程中需要调度任务5,而任务2的执行过程中需要调度任务4。由于任务5必须等任务3和任务2执行完成,任务2必须等任务4执行完成,任务4必须等任务1执行完成,因此该示例中当前任务都需要等待其他队列中的任务执行完成才能完成,导致互相等待死锁。
四、串行队列与并行队列互锁
图6示出串行队列与并行队列互锁的一个示例性的示意图,如图6所示,一个并行队列、一个串行队列、n+n个任务(1-n+n),其中,并行队列中的任务(1-n、x)中的n个任务可以同时被放入线程池(容量n)中并行执行,串行队列的执行顺序为任务m→任务n+1→……→任务n+n,而任务1的执行过程中需要调度任务n+1,任务2的执行过程中需要调度任务n+2,……,任务n的执行过程中需要调度任务n+n,任务m的执行过程中需要调度任务x。但是由于线程池已被并行队列中的任务(1-n)全部占用,且任务(1-n)需要等待串行队列中的相关任务(n+1-n+n)执行完毕才能完成,被等待的任务(n+1-n+n)又要等其前序任务执行完毕,任务x无法得到线程池中的资源而无法完成,任务m等不到任务x执行完毕也无法完成,这样就导致所有任务互相等待死锁。
针对上述死锁情况,本申请提供了一种死锁检测方法,以在程序的各个任务执行之前检测出各个任务是否存在死锁的可能性,从而预先避免死锁的发生。
图7为本申请死锁检测方法实施例一的流程图,如图7所示,本实施例的方法可以由上述设备执行。该死锁检测方法包括:
步骤701、获取第一任务序列,第一任务序列为待检测程序的至少一个任务序列中的任意一个。
任务序列用于表征待检测程序包括的至少两个任务的执行顺序,至少两个任务根据实际运行情况可能出现多个任务序列,第一任务序列是多个任务序列中的任意一个。
如果是并行队列,那么该并行队列中的任务理论上是可以并列执行的,但由于线程池的资源有限,因此可以同时执行的最多任务量即为线程池的上限,那么并行队列中的任务可能会有部分任务先被加入线程池中从而先执行,而其他任务后被加入线程池从而后执行。这样就出现了并行队列中的任务的执行顺序的不确定性(主要取决于任务被加入线程池中的先后顺序)。例如,并行队列中有任务1-3,线程池最多可以执行两个任务,那么可能会出现先同时执行任务1和2,后执行任务3的任务序列,即1+2→3,也可能会出现1+3→2的任务序列,还可能会出现2+3→1的任务序列。而多个并行队列彼此之间可能会因为获取资源的先后顺序,而出现多个并行队列的执行顺序有先有后。例如,并行队列1中有任务1-3,并行队列2中有任务4-5,线程池最多可以执行三个任务,那么可能会出现1+2+3→4+5的任务序列,也可能会出现4+5→1+2+3的任务序列等等。
如果是串行队列,同一个串行队列中的任务有严格的执行顺序,前一任务执行完后,才会执行下一个任务。例如,串行队列中有任务1-3,串行队列的执行顺序为1→2→3。而多个串行队列如果彼此之间没有调度关系,彼此之间也可能会因为获取资源的先后顺序,而出现多个串行队列的执行顺序有先有后,还可能出现多个串行队列同时执行。例如,串行队列1中有任务1-3,串行队列2中有任务4-5,可能会出现1→2→3→4→5的任务序列,也可能会出现4→5→1→2→3的任务序列,还可能会出现1→4→2→5→3的任务序列等等。
由此可见,同一个程序可能会因为运行环境中资源的分配策略、线程运行效率等因素导致该程序中没有依赖关系的任务的执行顺序发生改变,从而出现多个任务序列。
如上,本申请的死锁检测方法可以应用于两种场景:
在场景一下,死锁检测方法是在程序的特定运行环境下由相关线程实现,由于运行环境唯一,因此此时程序可以只有一个对应于该运行环境的任务序列,那么死锁检测方法就只需要获取到该任务序列后对其进行死锁检测即可。
在场景二下,死锁检测方法是实现程序测试功能的程序产品,该程序产品为了兼容对不同运行环境、不同高级编程语言的程序进行测试,模拟出了针对前述不同的多种运行环境,那么此时测试用的程序产品在对待检测的程序进行测试时,可以让其在模拟出的各种运行环境下执行,可能就会出现同一程序的多个任务序列,死锁检测方法需要对多个任务序列分别进行死锁检测,确保该程序在各种情况下均不会出现死锁。
步骤702、根据第一任务序列获取至少两个任务的所属队列及所属队列的队列类型。
待检测程序可以是由开发人员采用高级编程语言编写的代码,该高级编程语言可以包括C、C++、Java等。如上所述,基于待检测程序包括的至少两个任务的逻辑关系可以将任务加入一个或多个队列中。队列类型可以是指队列为并行队列、串行队列等,而根据队列类型,可以获取队列中包括的任务的执行顺序和调用关系。
步骤703、根据至少两个任务的所属队列及所属队列的队列类型确定待检测程序是否会发生死锁。
确定待检测程序是否存在死锁的可能性即是确定该程序的多个任务在一个或多个任务序列下,是否存在如上的四种死锁情况中的任意一种。而针对多个任务序列的死锁检测逻辑可以是相同的,以下以对一个任务序列的死锁检测为例进行说明。
本申请通过判断该任务序列中的两个存在调度关系的任务分别所在的执行队列集合是否存在交集,从而确定该任务序列是否存在死锁的可能。这是因为如上述四种死锁情况,通常死锁产生于两个存在调度关系的任务,因此为了减少程序运行的负载,可以在一个任务调度另一个任务的情况下开始死锁的检测。若前述两个执行队列集合存在交集,则说明两个存在调度关系的任务可能会出现死锁的可能。
图8为本申请死锁检测方法实施例二的流程图,如图8所示,该方法从即将执行两个存在调度关系的任务开始(步骤801)。
首先判断这两个任务的所属队列的类型(步骤802),若这两个任务的所属队列为串行队列,则跳转至步骤803,若这两个任务的所属队列为并行队列,则跳转至步骤804。
判断调度任务的执行队列集合是否包括被调度任务的所属队列(步骤803),若调度任务的执行队列集合不包括被调度任务的所属队列,则跳转至步骤805,若调度任务的执行队列集合包括被调度任务的所属队列,则跳转至步骤806。需要说明的是,该步骤不仅仅限于存在调度关系的两个任务,还可适用于存在调度关系的多个任务,例如任务一调度任务二,任务二调度任务三,任务三调度任务四,先判断任务一的执行队列集合是否包括任务二的所属队列,若不包括继续判断任务二的执行队列集合是否包括任务三的所属队列,若不包括再判断任务三的执行队列集合是否包括任务四的所属队列。本申请中所属队列是指在上述步骤701中基于待检测程序中的至少两个任务的逻辑关系,将这些任务加入一个或多个队列中,每个队列针对队列中的任务来讲即是该任务的所属队列。执行队列集合是指运行某一个任务时,除了该任务的所属队列,还有其他调用该任务的任务的所属队列,可以认为执行队列集合是运行该任务时占用的所有线程资源对应的一个或多个队列。
判断被调度任务在其所属队列中是否存在前序任务(步骤805),若被调度任务在其所属队列中存在前序任务,则跳转至步骤807,若被调度任务在其所属队列中不存在前序任务,则跳转至步骤808。前序任务即为同一个串行队列中,如果开始执行某一个任务,是建立在其他一个或多个任务已经执行完毕的基础上,例如上述串行队列的执行顺序为1→2→3,任务3的前序任务包括任务1和2,任务2的前序任务包括任务1。
判断调度任务的执行队列集合和前序任务的执行队列集合是否存在交集(步骤807),若调度任务的执行队列集合和前序任务的执行队列集合不存在交集,则跳转至步骤809,若调度任务的执行队列集合和前序任务的执行队列集合存在交集,则跳转至步骤806。步骤807中的调度任务即步骤803中的调度任务。
判断前序任务是否调度其他任务(步骤809),若前序任务调度其他任务,则跳转至步骤810,若前序任务没有调度其他任务,则跳转至步骤808。
判断调度任务的执行队列集合和前序任务调度的其他任务的执行队列集合是否存在交集(步骤810),若调度任务的执行队列集合和前序任务调度的其他任务的执行队列集合存在交集,则跳转至步骤806,若调度任务的执行队列集合和前序任务调度的其他任务的执行队列集合不存在交集,则跳转至步骤808。步骤810中的调度任务即步骤803中的调度任务。需要说明的是,该步骤不仅仅限于前序任务调度的其他任务,还可适用于前序任务调度其他任务,该其他任务又要调度别的任务等存在多层嵌套调度的多个任务,例如前序任务调度任务一,任务一调度任务二,任务二调度任务三,先判断调度任务的执行队列集合和任务一的执行队列集合是否存在交集,若不存在继续判断调度任务的执行队列集合和任务二的执行队列集合是否存在交集,若不存在再判断调度任务的执行队列集合和任务三的执行队列集合是否存在交集。
判断线程池是否达到容量上限(步骤804),若线程池达到容量上限,则跳转至步骤811,若线程池没有达到容量上限,则跳转至步骤808。
在当前线程直接执行或者临时创建新线程执行(步骤811)。
确定两个存在调度关系的任务存在死锁的可能性(步骤806)。
确定两个存在调度关系的任务不存在死锁的可能性,正常执行该两个任务(步骤808)。
以下针对图3-5所示的几种死锁情况对本申请确定待检测程序是否存在死锁的可能性的方法进行说明:
一、自锁
当图3中的任务1调度任务3时,任务1的执行队列集合为S1={D1},任务3的所属队列均为D1。由于S1包括D1,因此确定任务1调度任务3会引起死锁,该待检测程序存在死锁的可能性。
二、循环锁
当图4中任务1调度任务2时,任务1的执行队列集合为S1={D1},任务2的所属队列为D2。由于S1不包括D2,继续判断。当图4中的任务2调度任务3时,任务2的执行队列集合为S2={D1,D2},任务3的所属队列为D3。由于S2不包括D2,继续判断。当图4中的任务3调度任务5时,任务3的执行队列集合为S3={D1,D2,D3},任务5的所属队列为D1。由于S3包括D1,因此确定任务1调度任务2会引起死锁,该待检测程序存在死锁的可能性。
三、串行队列互锁
当图5中任务1调度任务5时,任务1的执行队列集合为S1={D1},任务5的所属队列为D2。由于S1不包括D2,继续判断。任务5有前序任务3和2,任务3的执行队列集合为S3={D2},任务2的执行队列集合为S2={D2}。由于任务1的执行队列集合为S1分别和任务3的执行队列集合S3、任务2的执行队列集合S2不存在交集,继续判断。任务2调度任务4,任务4的执行队列集合S4={D1,D2}。由于任务1的执行队列集合S1和任务4的执行队列集合S4存在交集D1,因此确定任务1调度任务5会引起死锁,该待检测程序存在死锁的可能性。
步骤704、当确定待检测程序会发生死锁时,抛出异常提示。
如果确定待检测程序存在死锁的可能性时,可以抛出异常提示,使待检测程序通过回调处理方法或者异常处理方法避免死锁的发生。其中回调处理方法是指,程序在执行存在死锁可能的任务前再次调用相关任务,对未处理的任务进行再次处理,以将死锁的负面效应降低到最低。异常处理方法是指程序在执行存在死锁可能的任务前进入异常处理分支,抛弃有问题的任务,以避免死锁。
本实施例,上述场景一,可以在待检测程序运行的同时,对程序进行死锁检测,该死锁检测所产生的计算量很小,并且不需要创建全局的数据结构,可以在保证待检测程序运行性能的同时实现程序的死锁检测。上述场景二,可以兼容各种运行环境,对各种高级编程语言编写的程序进行测试,而且该死锁检测所产生的计算量很小,可以实现兼容性强、高效的程序测试。
可选的,上本申请提供的死锁检测方法可以结合比特位串的方法实现。即用比特位串表示待检测程序中的任务的执行队列集合,比特位串的每个比特位对应一个队列,若任务的执行队列集合中包括某个队列,则该队列对应的比特位置为1,若任务的执行队列集合中不包括某个队列,则该队列对应的比特位置为0。通过表示两个执行队列集合的比特位串进行与运算,当与运算的结果为0表示二者没有交集,可以确定程序不存在死锁的可能性,当与运算的结果不为0表示二者有交集,可以确定程序存在死锁的可能性。以下针对图3-5所示的几种死锁情况对本申请确定待检测程序是否存在死锁的可能性的方法进行说明,假设比特位串包括3个比特,其中最高位表示D3,中间位表示D2,最低位表示D1。
一、自锁
当图3中的任务1调度任务3时,任务1的执行队列集合为S1={D1},可以表示为001,任务3的所属队列均为D1,可以表示为001。001&001=001≠0,因此确定任务1调度任务3会引起死锁,该待检测程序存在死锁的可能性。
二、循环锁
当图4中任务1调度任务2时,任务1的执行队列集合为S1={D1},可以表示为001,任务2的所属队列为D2,可以表示为010。001&010=0,继续判断。当图4中的任务2调度任务3时,任务2的执行队列集合为S2={D1,D2},可以表示为011,任务3的所属队列为D3,可以表示为100。011&100=0,继续判断。当图4中的任务3调度任务5时,任务3的执行队列集合为S3={D1,D2,D3},可以表示为111,任务5的所属队列为D1,可以表示为001。111&001=001≠0,因此确定任务1调度任务2会引起死锁,该待检测程序存在死锁的可能性。
三、串行队列互锁
当图5中任务1调度任务5时,任务1的执行队列集合为S1={D1},可以表示为001,任务5的所属队列为D2,可以表示为010。001&010=0,继续判断。任务5有前序任务3和2,任务3的执行队列集合为S3={D2},可以表示为010,任务2的执行队列集合为S2={D2},可以表示为010。001&010=0,继续判断。任务2调度任务4,任务4的执行队列集合S4={D1,D2},可以表示为001。001&011=001≠0,因此确定任务1调度任务5会引起死锁,该待检测程序存在死锁的可能性。
该实施例用比特位串的方式确定队列集合之间是否存在交集,可以用更小的计算量完成程序的死锁检测,实现高效的死锁检测。
图9为本申请死锁检测装置实施例的结构示意图,如图9所示,本实施例的装置可以是上述方法实施例的执行主体,例如图1所示的设备100。该死锁检测装置包括:获取模块901、检测模块902和提示模块903,其中,获取模块901,用于获取第一任务序列,所述第一任务序列为待检测程序的至少一个任务序列中的任意一个,所述第一任务序列用于表征所述待检测程序包括的至少两个任务的执行顺序;根据所述第一任务序列获取所述至少两个任务的所属队列及所述所属队列的队列类型;检测模块902,用于根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁;提示模块903,用于当确定所述待检测程序会发生死锁时,抛出异常提示。
在一种可能的实现方式中,所述检测模块902,具体用于判断第一任务的执行队列集合是否包括第二任务的所属队列,所述第一任务调度所述第二任务,所述至少两个任务包括所述第一任务和所述第二任务,且所述第一任务的所属队列和所述第二任务的所属队列均为串行队列,所述执行队列集合包括至少一个队列,所述至少一个队列包括对应任务的所属队列;若所述第一任务的执行队列集合包括所述第二任务的所属队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块902,还用于若所述第一任务的执行队列集合不包括所述第二任务的所属队列,则判断是否有第三任务,所述第二任务调度所述第三任务,所述至少两个任务包括所述第三任务;若有所述第三任务,则判断所述第二任务的执行队列集合是否包括所述第三任务的所属队列;若所述第二任务的执行队列集合包括所述第三任务的所属队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块902,还用于若所述第二任务的执行队列集合不包括所述第三任务的所属队列,则判断是否有第四任务,所述第四任务为所述第三任务的前序任务,所述至少两个任务包括所述第四任务;若有所述第四任务,则判断所述第二任务的执行队列集合和所述第四任务的执行队列集合是否包含相同的队列;若所述第二任务的执行队列集合和所述第四任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块902,还用于若所述第一任务的执行队列集合不包括所述第二任务的所属队列或者,则判断是否有第五任务,所述第五任务为所述第二任务的前序任务,所述至少两个任务包括所述第五任务;若有所述第五任务,则判断所述第一任务的执行队列集合和所述第五任务的执行队列集合是否包含相同的队列;若所述第一任务的执行队列集合和所述第五任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块902,还用于若所述第一任务的执行队列集合和所述第五任务的执行队列集合不包含相同的队列,则判断是否有第六任务,所述第五任务调度所述第六任务,所述至少两个任务包括所述第六任务;若有所述第六任务,则判断所述第一任务的执行队列集合和所述第六任务的执行队列集合是否包含相同的队列;若所述第一任务的执行队列集合和所述第六任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述检测模块902,还用于若所述第二任务的执行队列集合和所述第四任务的执行队列集合不包含相同的队列,则判断是否有第七任务,所述第四任务调度所述第七任务,所述至少两个任务包括所述第七任务;若有所述第七任务,则判断所述第二任务的执行队列集合和所述第七任务的执行队列集合是否包含相同的队列;若所述第二任务的执行队列集合和所述第七任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述执行队列集合由比特位串表示,所述比特位串包括至少两个比特位,所述至少两个比特位和至少两个队列对应;当所述执行队列集合包括第一队列时,所述第一队列对应的比特位用1表示,当所述执行队列集合不包括第一队列时,所述第一队列对应的比特位用0表示,所述第一队列为所述至少两个队列中的任意一个;所述检测模块902,具体用于将所述两个所述执行队列集合的比特位串进行与运算;若所述与运算的结果不为0,则确定所述两个所述执行队列集合是否包含相同的队列。
在一种可能的实现方式中,所述提示模块903,还用于执行死锁处理任务,所述死锁处理任务用于在所述待检测程序运行的过程中避免死锁的发生。
在一种可能的实现方式中,所述检测模块902,具体用于判断线程池中运行的任务是否包括第八任务,所述线程池中运行的任务包括第九任务,所述第九任务调度第十任务,所述第十任务的前序任务为第十一任务,所述第十一任务调度所述第八任务,所述至少两个任务包括所述第八任务、所述第九任务、所述第十任务和所述第十一任务,且所述第八任务和所述第九任务的所属队列为并行队列,所述第十任务和所述第十一任务的所属队列为串行队列,所述线程池的线程资源全部被占用的;若所述线程池中运行的任务不包括所述第八任务,则确定所述待检测程序会发生死锁。
在一种可能的实现方式中,所述提示模块903,还用于采用运行所述第十一任务的线程资源运行所述第八任务;或者,临时创建线程资源运行所述第八任务。
本实施例的装置,可以用于执行图7或8所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
在实现过程中,上述方法实施例的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。处理器可以是通用处理器、数字信号处理器(digital signalprocessor,DSP)、特定应用集成电路(application-specific integrated circuit,ASIC)、现场可编程门阵列(field programmable gate array,FPGA)或其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。本申请实施例公开的方法的步骤可以直接体现为硬件编码处理器执行完成,或者用编码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
上述各实施例中提及的存储器可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(read-onlymemory,ROM)、可编程只读存储器(programmable ROM,PROM)、可擦除可编程只读存储器(erasable PROM,EPROM)、电可擦除可编程只读存储器(electrically EPROM,EEPROM)或闪存。易失性存储器可以是随机存取存储器(random access memory,RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(static RAM,SRAM)、动态随机存取存储器(dynamic RAM,DRAM)、同步动态随机存取存储器(synchronous DRAM,SDRAM)、双倍数据速率同步动态随机存取存储器(double data rateSDRAM,DDR SDRAM)、增强型同步动态随机存取存储器(enhanced SDRAM,ESDRAM)、同步连接动态随机存取存储器(synchlink DRAM,SLDRAM)和直接内存总线随机存取存储器(directrambus RAM,DR RAM)。应注意,本文描述的系统和方法的存储器旨在包括但不限于这些和任意其它适合类型的存储器。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read-only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

Claims (22)

1.一种死锁检测方法,其特征在于,包括:
获取第一任务序列,所述第一任务序列为待检测程序的至少一个任务序列中的任意一个,所述第一任务序列用于表征所述待检测程序包括的至少两个任务的执行顺序;
根据所述第一任务序列获取所述至少两个任务的所属队列及所述所属队列的队列类型;
根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁;
当确定所述待检测程序会发生死锁时,抛出异常提示;
其中,所述根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁,包括:
判断第一任务的执行队列集合是否包括第二任务的所属队列,所述第一任务调度所述第二任务,所述至少两个任务包括所述第一任务和所述第二任务,且所述第一任务的所属队列和所述第二任务的所属队列均为串行队列,所述执行队列集合包括至少一个队列,所述至少一个队列包括对应任务的所属队列;
若所述第一任务的执行队列集合包括所述第二任务的所属队列,则确定所述待检测程序会发生死锁。
2.根据权利要求1所述的方法,其特征在于,还包括:
若所述第一任务的执行队列集合不包括所述第二任务的所属队列,则判断是否有第三任务,所述第二任务调度所述第三任务,所述至少两个任务包括所述第三任务;
若有所述第三任务,则判断所述第二任务的执行队列集合是否包括所述第三任务的所属队列;
若所述第二任务的执行队列集合包括所述第三任务的所属队列,则确定所述待检测程序会发生死锁。
3.根据权利要求2所述的方法,其特征在于,还包括:
若所述第二任务的执行队列集合不包括所述第三任务的所属队列,则判断是否有第四任务,所述第四任务为所述第三任务的前序任务,所述至少两个任务包括所述第四任务;
若有所述第四任务,则判断所述第二任务的执行队列集合和所述第四任务的执行队列集合是否包含相同的队列;
若所述第二任务的执行队列集合和所述第四任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
4.根据权利要求1所述的方法,其特征在于,还包括:
若所述第一任务的执行队列集合不包括所述第二任务的所属队列或者,则判断是否有第五任务,所述第五任务为所述第二任务的前序任务,所述至少两个任务包括所述第五任务;
若有所述第五任务,则判断所述第一任务的执行队列集合和所述第五任务的执行队列集合是否包含相同的队列;
若所述第一任务的执行队列集合和所述第五任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
5.根据权利要求4所述的方法,其特征在于,还包括:
若所述第一任务的执行队列集合和所述第五任务的执行队列集合不包含相同的队列,则判断是否有第六任务,所述第五任务调度所述第六任务,所述至少两个任务包括所述第六任务;
若有所述第六任务,则判断所述第一任务的执行队列集合和所述第六任务的执行队列集合是否包含相同的队列;
若所述第一任务的执行队列集合和所述第六任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
6.根据权利要求3所述的方法,其特征在于,还包括:
若所述第二任务的执行队列集合和所述第四任务的执行队列集合不包含相同的队列,则判断是否有第七任务,所述第四任务调度所述第七任务,所述至少两个任务包括所述第七任务;
若有所述第七任务,则判断所述第二任务的执行队列集合和所述第七任务的执行队列集合是否包含相同的队列;
若所述第二任务的执行队列集合和所述第七任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
7.根据权利要求1-6中任一项所述的方法,其特征在于,所述执行队列集合由比特位串表示,所述比特位串包括至少两个比特位,所述至少两个比特位和至少两个队列对应;当所述执行队列集合包括第一队列时,所述第一队列对应的比特位用1表示,当所述执行队列集合不包括第一队列时,所述第一队列对应的比特位用0表示,所述第一队列为所述至少两个队列中的任意一个;
判断两个所述执行队列集合是否包含相同的队列,包括:
将所述两个所述执行队列集合的比特位串进行与运算;
若所述与运算的结果不为0,则确定所述两个所述执行队列集合是否包含相同的队列。
8.根据权利要求1-6中任一项所述的方法,其特征在于,所述抛出异常提示之后,还包括:
执行死锁处理任务,所述死锁处理任务用于在所述待检测程序运行的过程中避免死锁的发生。
9.根据权利要求1所述的方法,其特征在于,所述根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁,包括:
判断线程池中运行的任务是否包括第八任务,所述线程池中运行的任务包括第九任务,所述第九任务调度第十任务,所述第十任务的前序任务为第十一任务,所述第十一任务调度所述第八任务,所述至少两个任务包括所述第八任务、所述第九任务、所述第十任务和所述第十一任务,且所述第八任务和所述第九任务的所属队列为并行队列,所述第十任务和所述第十一任务的所属队列为串行队列,所述线程池的线程资源全部被占用的;
若所述线程池中运行的任务不包括所述第八任务,则确定所述待检测程序会发生死锁。
10.根据权利要求9所述的方法,其特征在于,所述抛出异常提示之后,还包括:
采用运行所述第十一任务的线程资源运行所述第八任务;或者,
临时创建线程资源运行所述第八任务。
11.一种死锁检测装置,其特征在于,包括:
获取模块,用于获取第一任务序列,所述第一任务序列为待检测程序的至少一个任务序列中的任意一个,所述第一任务序列用于表征所述待检测程序包括的至少两个任务的执行顺序;根据所述第一任务序列获取所述至少两个任务的所属队列及所述所属队列的队列类型;
检测模块,用于根据所述至少两个任务的所属队列及所述所属队列的队列类型确定所述待检测程序是否会发生死锁;
提示模块,用于当确定所述待检测程序会发生死锁时,抛出异常提示;
其中,所述检测模块,具体用于判断第一任务的执行队列集合是否包括第二任务的所属队列,所述第一任务调度所述第二任务,所述至少两个任务包括所述第一任务和所述第二任务,且所述第一任务的所属队列和所述第二任务的所属队列均为串行队列,所述执行队列集合包括至少一个队列,所述至少一个队列包括对应任务的所属队列;若所述第一任务的执行队列集合包括所述第二任务的所属队列,则确定所述待检测程序会发生死锁。
12.根据权利要求11所述的装置,其特征在于,所述检测模块,还用于若所述第一任务的执行队列集合不包括所述第二任务的所属队列,则判断是否有第三任务,所述第二任务调度所述第三任务,所述至少两个任务包括所述第三任务;若有所述第三任务,则判断所述第二任务的执行队列集合是否包括所述第三任务的所属队列;若所述第二任务的执行队列集合包括所述第三任务的所属队列,则确定所述待检测程序会发生死锁。
13.根据权利要求12所述的装置,其特征在于,所述检测模块,还用于若所述第二任务的执行队列集合不包括所述第三任务的所属队列,则判断是否有第四任务,所述第四任务为所述第三任务的前序任务,所述至少两个任务包括所述第四任务;若有所述第四任务,则判断所述第二任务的执行队列集合和所述第四任务的执行队列集合是否包含相同的队列;若所述第二任务的执行队列集合和所述第四任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
14.根据权利要求11所述的装置,其特征在于,所述检测模块,还用于若所述第一任务的执行队列集合不包括所述第二任务的所属队列或者,则判断是否有第五任务,所述第五任务为所述第二任务的前序任务,所述至少两个任务包括所述第五任务;若有所述第五任务,则判断所述第一任务的执行队列集合和所述第五任务的执行队列集合是否包含相同的队列;若所述第一任务的执行队列集合和所述第五任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
15.根据权利要求14所述的装置,其特征在于,所述检测模块,还用于若所述第一任务的执行队列集合和所述第五任务的执行队列集合不包含相同的队列,则判断是否有第六任务,所述第五任务调度所述第六任务,所述至少两个任务包括所述第六任务;若有所述第六任务,则判断所述第一任务的执行队列集合和所述第六任务的执行队列集合是否包含相同的队列;若所述第一任务的执行队列集合和所述第六任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
16.根据权利要求13所述的装置,其特征在于,所述检测模块,还用于若所述第二任务的执行队列集合和所述第四任务的执行队列集合不包含相同的队列,则判断是否有第七任务,所述第四任务调度所述第七任务,所述至少两个任务包括所述第七任务;若有所述第七任务,则判断所述第二任务的执行队列集合和所述第七任务的执行队列集合是否包含相同的队列;若所述第二任务的执行队列集合和所述第七任务的执行队列集合包含相同的队列,则确定所述待检测程序会发生死锁。
17.根据权利要求11-16中任一项所述的装置,其特征在于,所述执行队列集合由比特位串表示,所述比特位串包括至少两个比特位,所述至少两个比特位和至少两个队列对应;当所述执行队列集合包括第一队列时,所述第一队列对应的比特位用1表示,当所述执行队列集合不包括第一队列时,所述第一队列对应的比特位用0表示,所述第一队列为所述至少两个队列中的任意一个;
所述检测模块,具体用于将所述两个所述执行队列集合的比特位串进行与运算;若所述与运算的结果不为0,则确定所述两个所述执行队列集合是否包含相同的队列。
18.根据权利要求11-16中任一项所述的装置,其特征在于,所述提示模块,还用于执行死锁处理任务,所述死锁处理任务用于在所述待检测程序运行的过程中避免死锁的发生。
19.根据权利要求11所述的装置,其特征在于,所述检测模块,具体用于判断线程池中运行的任务是否包括第八任务,所述线程池中运行的任务包括第九任务,所述第九任务调度第十任务,所述第十任务的前序任务为第十一任务,所述第十一任务调度所述第八任务,所述至少两个任务包括所述第八任务、所述第九任务、所述第十任务和所述第十一任务,且所述第八任务和所述第九任务的所属队列为并行队列,所述第十任务和所述第十一任务的所属队列为串行队列,所述线程池的线程资源全部被占用的;若所述线程池中运行的任务不包括所述第八任务,则确定所述待检测程序会发生死锁。
20.根据权利要求19所述的装置,其特征在于,所述提示模块,还用于采用运行所述第十一任务的线程资源运行所述第八任务;或者,临时创建线程资源运行所述第八任务。
21.一种死锁检测设备,其特征在于,包括:
一个或多个处理器,被配置为调用存储在存储器中的程序指令,以执行如权利要求1-10中任一项所述的方法。
22.一种计算机可读存储介质,其特征在于,包括计算机程序,所述计算机程序在计算机或处理器上被执行时,使得所述计算机或处理器执行权利要求1-10中任一项所述的方法。
CN202010144616.1A 2020-03-04 2020-03-04 死锁检测方法和装置 Active CN113360290B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010144616.1A CN113360290B (zh) 2020-03-04 2020-03-04 死锁检测方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010144616.1A CN113360290B (zh) 2020-03-04 2020-03-04 死锁检测方法和装置

Publications (2)

Publication Number Publication Date
CN113360290A CN113360290A (zh) 2021-09-07
CN113360290B true CN113360290B (zh) 2023-02-03

Family

ID=77523442

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010144616.1A Active CN113360290B (zh) 2020-03-04 2020-03-04 死锁检测方法和装置

Country Status (1)

Country Link
CN (1) CN113360290B (zh)

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109815021A (zh) * 2018-12-18 2019-05-28 深圳先进技术研究院 针对递归树建模程序的资源关键树算法及系统

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6665818B1 (en) * 2000-04-27 2003-12-16 Hewlett-Packard Development Company, L.P. Apparatus and method for detecting, diagnosing, and handling deadlock errors
GB0118294D0 (en) * 2001-07-27 2001-09-19 Ibm Method and system for deadlock detection and avoidance
US20100153957A1 (en) * 2008-12-16 2010-06-17 Sensormatic Electronics Corporation System and method for managing thread use in a thread pool
US20140040220A1 (en) * 2012-07-31 2014-02-06 Hideaki Kimura Methods and systems for deadlock detection
CN107783844A (zh) * 2017-10-13 2018-03-09 锐捷网络股份有限公司 一种计算机程序运行异常检测方法、装置和介质

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109815021A (zh) * 2018-12-18 2019-05-28 深圳先进技术研究院 针对递归树建模程序的资源关键树算法及系统

Also Published As

Publication number Publication date
CN113360290A (zh) 2021-09-07

Similar Documents

Publication Publication Date Title
CN109960582B (zh) 在tee侧实现多核并行的方法、装置及系统
KR102219546B1 (ko) 사용자 모드 크래시 리포트를 위한 프레임워크
Huang et al. ShuffleDog: characterizing and adapting user-perceived latency of android apps
US10592218B2 (en) Dynamic data and compute resource elasticity
CN111158879B (zh) 一种系统资源的调度方法,装置、机器可读介质和系统
US9658890B2 (en) Runtime agnostic representation of user code for execution with selected execution runtime
US20180357085A1 (en) Method and apparatus for running android application on windows system
US9575864B2 (en) Function-level dynamic instrumentation
US20210208935A1 (en) Method for Scheduling Multi-Core Processor, Terminal, and Storage Medium
US11847497B2 (en) Methods and apparatus to enable out-of-order pipelined execution of static mapping of a workload
US20170192762A1 (en) Declarative programming model with a native programming language
WO2014179635A1 (en) Activity based sampling of diagnostics data
CN102541661B (zh) 实现等待地址同步接口的方法和设备
Yan et al. Real-time android with RTDroid
CN113495780A (zh) 任务调度方法、装置、存储介质及电子设备
EP3779778A1 (en) Methods and apparatus to enable dynamic processing of a predefined workload
US10599444B2 (en) Extensible input stack for processing input device data
CN111831432B (zh) Io请求的调度方法、装置、存储介质及电子设备
CN115543551A (zh) 线程调度方法、装置及电子设备
CN113360290B (zh) 死锁检测方法和装置
CN116302558A (zh) 线程调度方法、装置及电子设备
US20190213015A1 (en) Extensible input stack for processing input device data
US9710315B2 (en) Notification of blocking tasks
US11347544B1 (en) Scheduling work items based on declarative constraints
WO2023202406A1 (zh) 显示方法及电子设备

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
GR01 Patent grant
GR01 Patent grant