CN115344360A - 死锁检测方法、装置以及相关设备 - Google Patents

死锁检测方法、装置以及相关设备 Download PDF

Info

Publication number
CN115344360A
CN115344360A CN202110525149.1A CN202110525149A CN115344360A CN 115344360 A CN115344360 A CN 115344360A CN 202110525149 A CN202110525149 A CN 202110525149A CN 115344360 A CN115344360 A CN 115344360A
Authority
CN
China
Prior art keywords
entity
lock
execution entity
chain
execution
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
Application number
CN202110525149.1A
Other languages
English (en)
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 CN202110525149.1A priority Critical patent/CN115344360A/zh
Priority to PCT/CN2022/090114 priority patent/WO2022237570A1/zh
Publication of CN115344360A publication Critical patent/CN115344360A/zh
Pending legal-status Critical Current

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
    • 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/48Program initiating; Program switching, e.g. by interrupt
    • 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/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • 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

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)
  • Multi Processors (AREA)

Abstract

本申请实施例公开了一种死锁检测方法,应用于操作系统领域。方法包括:获取第一调度实体的第一RPC调用链。第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息。获取第一服务端进程的第一锁等待链。第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息。其中,执行实体A2为锁A的等待者,执行实体A1为锁A的持有者。若执行实体B1为执行实体A2,或执行实体B1和执行实体A2存在关联关系,则确定存在死锁。在本申请的中,通过使用锁等待链和RPC调用链进行死锁检测,可以提高死锁检测的准确性。

Description

死锁检测方法、装置以及相关设备
技术领域
本申请涉及操作系统领域,尤其涉及死锁检测方法、装置以及相关设备。
背景技术
在操作系统中,当多个线程并发执行时,会有一定几率导致两个或两个以上的线程之间出现互相等待而停滞不前的现象,这就是死锁。发生死锁会导致系统效率低下,甚至造成操作系统故障。
通过锁等待链检查,可以确定操作系统中是否存在死锁。具体地,当锁的持有者为锁的等待者,锁的持有者和锁的等待者之间成环时,则可以确定存在死锁。例如,线程A拥有锁A。线程A在等锁B。线程B拥有锁B。线程B在等锁A。此时,锁A的持有者线程A为锁B的等待者(简写为A-B),锁B的持有者线程B为锁A的等待者(简写为B-A)。并且,线程A和线程B之间成环(A-B-A)。
为了减小进程间通信(Inter-Process Communication,IPC)所带来的性能损失,可以采用执行和调度分离的机制。在执行和调度分离的场景中,线程被分为执行实体和调度实体两部分。执行实体位于服务端进程。调度实体通过向服务端进程发起远程过程调用(Remote Procedure Call,RPC)来运行执行实体。
在执行和调度分离的机制中,锁等待链检查的准确性不高。具体地,当锁的持有者不为锁的等待者,锁的持有者和锁的等待者之间不成环时,操作系统中仍可能存在死锁。
发明内容
本申请提供了一种死锁检测方法、装置以及相关设备。通过使用锁等待链和RPC调用链进行死锁检测,可以提高确定死锁的准确性。
本申请第一方面提供了一种死锁检测方法。死锁检测方法应用于操作系统。死锁检测方法包括:操作系统获取第一调度实体的第一RPC调用链。第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息(简写为A1-B1)。操作系统获取第一服务端进程的第一锁等待链。第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息(简写为A2-A1)。其中,执行实体A2为锁A的等待者,执行实体A1为锁A的持有者。若执行实体B1为执行实体A2,或执行实体B1和执行实体A2存在关联关系,则确定存在死锁。其中,关联关系包括调用关系;或关联关系包括等待关系;或关联关系包括调用关系和等待关系的集合。
在本申请的中,当执行实体B1和执行实体A2存在关联关系时,关联关系简写为B1-A2。此时,执行实体检查链A1-B1-A2-A1成环。在环中,不仅包括锁等待链,还包括RPC调用链。当缺少RPC调用链时,环无法成立,即通过锁等待链检查无法确定存在死锁。因此,本申请可以提高死锁检测的准确性。
为了方便描述,本申请中引入执行实体检查链的概念。执行实体检查链的起点为A1。当执行实体检查链包括第一RPC调用链时,执行实体检查链包括A1-B1。通过不断引入RPC调用链和锁等待链,执行实体检查链的长度可以不断增加。当执行实体检查链成环时,表征操作系统中存在死锁。
在第一方面的一种可选方式中,操作系统在第一调度实体中的内核态空间中获取第一RPC调用链。操作系统在第一服务端进程中的用户态空间中获取第一锁等待链。其中,通过将锁等待链存入用户态空间,可以减少内核态空间的数据,提高系统的安全性和可靠性。
在第一方面的一种可选方式中,在操作系统获取第一调度实体的第一RPC调用链之前,死锁检测方法还包括:操作系统获取第一调度实体的等锁时长。若第一调度实体的等锁时长大于第一阈值,则操作系统获取第一调度实体的第一RPC调用链。其中,当存在死锁时,调度实体会停止运行,进入等锁状态。等锁状态记录了调度实体等待锁的时长(简称为等锁时长)。在等锁时长大于第一阈值的情况下,操作系统进行死锁检测,获取第一调度实体的第一RPC调用链。因此,通过设置第一阈值,可以灵活控制操作系统进行死锁检测,合理利用系统资源。
在第一方面的一种可选方式中,执行实体B1是第一调度实体调用的最后一个执行实体。在操作系统获取第一调度实体的第一RPC调用链之后,死锁检测方法还包括:若第一RPC调用链表征第一调度实体中不存在死锁,则操作系统获取第二服务端进程的第二锁等待链。第二锁等待链包括体现执行实体B1等待执行实体B2的等待关系的信息(简写为B1-B2)。执行实体B1为锁B的等待者,执行实体B2为锁B的持有者。其中,当通过第一RPC调用链无法确定存在死锁时,表征当前的执行实体检查链不成环。此时,通过执行实体B1引入锁等待链,可以增加执行实体检查链的长度,提高确定死锁的准确性。
在第一方面的一种可选方式中,可以通过以下步骤获取第二锁等待链:操作系统根据执行实体B1对应的寄存器获取执行实体B1的基地址。操作系统根据执行实体B1的基地址和第一偏移量确定执行实体B1的lock-wait字段。操作系统获取执行实体B1的lock-wait字段中的锁B的基地址。当执行实体B1的lock-wait字段中有锁B的基地址时,表征执行实体B1为锁B的等待者。操作系统根据锁B的基地址和第二偏移量确定lock-owner字段。操作系统获取lock-owner字段中执行实体B2的标识。当lock-owner字段中有执行实体B2的标识时,表征执行实体B2为锁B的持有者。
在第一方面的一种可选方式中,执行实体B2的标识为执行实体B2的基地址。其中,若执行实体B2的标识为其它内容,例如字母B2。此时,系统需要存在字母B2和执行实体B2映射关系。然后在执行实体B2对应的寄存器上获取执行实体B1的基地址。因此,当执行实体B2的标识为执行实体B2的基地址时,可以提高获取锁等待链的效率。
在第一方面的一种可选方式中,在操作系统获取第二服务端进程的第二锁等待链之后,死锁检测方法还包括:操作系统确定正在运行执行实体B2的第二调度实体。操作系统获取第二调度实体的第二RPC调用链。第二RPC调用链包括体现执行实体B2调用执行实体A2的调用关系的信息(简写为B2-A2)。若存在执行实体B1等待执行实体B2的等待关系,以及执行实体B2调用执行实体A2的调用关系,则操作系统确定存在死锁。其中,当第一RPC调用链和第二锁等待链无法确实存在死锁时,表征当前的执行实体检查链不成环。通过执行实体B2引入第二RPC调用链,可以增加执行实体检查链的长度,提高确定死锁的准确性。在操作系统获取第二RPC调用链后,B1-A2可以表征为B1-B2,B2-A2。此时,执行实体检查链成环。具体地,执行实体检查链可以表示为A1-B1-B2-A2-A1。
在第一方面的一种可选方式中,在确定存在死锁后,死锁检测方法还包括:操作系统生成死锁告警。死锁告警包括第一RPC调用链,关联关系和第一锁等待链。关联关系包括第二锁等待链和第二RPC调用链。其中,死锁告警中携带了执行实体检查链的信息。在确定执行实体检查链中存在死锁后,操作系统可通过执行实体检查链进行后续的操作,例如消除异常,恢复业务等。
在第一方面的一种可选方式中,执行实体B1是第一调度实体调用的最后一个执行实体。在操作系统获取第一调度实体的第一RPC调用链之后,死锁检测方法还包括:若第一RPC调用链表征不存在死锁,则操作系统获取第二服务端进程的第二锁等待链。若第二锁等待链表征执行实体B1不是锁B的等待者,则开始第三调度实体的死锁检测。其中,执行实体B1不是锁B的等待者,表征执行实体检查链停止。此时,执行实体检查链A1-B1不成环。系统进行其他调度实体的死锁检测。
在第一方面的一种可选方式中,死锁检测方法还包括:操作系统生成告警。告警包括第一RPC调用链。告警表征第一RPC调用链处于死循环或阻塞状态。其中,在第一调度实体的等锁时长大于第一阈值的情况下,执行实体检查链不成环。此时,表征第一调度实体处于死循环或阻塞状态。操作系统可以根据第一RPC调用链定位死循环或阻塞的位置,进而消除死循环或阻塞。
本申请第二方面提供了一种死锁检测装置。死锁检测装置包括第一获取模块、第二获取模块和处理模块。其中,第一获取模块用于获取第一调度实体的第一RPC调用链。第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息。第二获取模块用于获取第一服务端进程的第一锁等待链。第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息。其中,执行实体A2为锁A的等待者,执行实体A1为锁A的持有者。处理模块用于若执行实体B1为执行实体A2,或执行实体B1和执行实体A2存在关联关系,则确定存在死锁。其中,关联关系包括调用关系、等待关系、或调用关系和等待关系的集合。
在第二方面的一种可选方式中,第一获取模块具体用于在第一调度实体中的内核态空间中获取第一RPC调用链。第二获取模块具体用于在第一服务端进程中的用户态空间中获取第一锁等待链。
在第二方面的一种可选方式中,第一获取模块还用于获取第一调度实体的等锁时长。若第一调度实体的等锁时长大于第一阈值,则获取第一调度实体的第一RPC调用链。
在第二方面的一种可选方式中,执行实体B1是第一调度实体调用的最后一个执行实体。第二获取模块还用于若第一RPC调用链表征第一调度实体中不存在死锁,则获取第二服务端进程的第二锁等待链。第二锁等待链包括体现执行实体B1等待执行实体B2的等待关系的信息。其中,执行实体B1为锁B的等待者,执行实体B2为锁B的持有者。
在第二方面的一种可选方式中,第二获取模块具体用于根据执行实体B1对应的寄存器获取执行实体B1的基地址。第二获取模块具体用于根据执行实体B1的基地址和第一偏移量确定执行实体B1的lock-wait字段。第二获取模块具体用于获取执行实体B1的lock-wait字段中的锁B的基地址。其中,锁B的基地址表征执行实体B1为锁B的等待者。第二获取模块具体用于根据锁B的基地址和第二偏移量确定lock-owner字段。第二获取模块具体用于获取lock-owner字段中执行实体B2的标识。其中,执行实体B2的标识表征执行实体B2为锁B的持有者。
在第二方面的一种可选方式中,执行实体B2的标识为执行实体B2的基地址。
在第二方面的一种可选方式中,处理模块还用于确定正在运行执行实体B2的第二调度实体。第一获取模块还用于获取第二调度实体的第二RPC调用链。第二RPC调用链包括体现执行实体B2调用执行实体A2的调用关系的信息。处理模块具体用于若存在执行实体B1等待执行实体B2的等待关系,以及执行实体B2调用执行实体A2的调用关系,则确定存在死锁。
在第二方面的一种可选方式中,装置还包括生成模块。生成模块用于生成死锁告警。死锁告警包括第一RPC调用链、关联关系和第一锁等待链。其中,关联关系包括第二锁等待链和第二RPC调用链。
在第二方面的一种可选方式中,执行实体B1是第一调度实体调用的最后一个执行实体。第二获取模块还用于若第一RPC调用链表征不存在死锁,则获取第二服务端进程的第二锁等待链。处理模块还用于若第二锁等待链表征执行实体B1不是锁B的等待者,则开始第三调度实体的死锁检测。
在第二方面的一种可选方式中,装置还包括生成模块。生成模块用于生成告警。告警包括第一RPC调用链。告警表征第一调度实体处于死循环或阻塞状态。
本申请第三方面提供了一种死锁检测设备。死锁检测设备包括处理器和存储器。存储器中存储有第一RPC调用链和第一锁等待链。第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息。第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息。其中,执行实体A2为锁A的等待者,执行实体A1为锁A的持有者。处理器用于获取第一RPC调用链和第一锁等待链,若执行实体B1为执行实体A2,或执行实体B1和执行实体A2存在关联关系,则确定存在死锁。其中,关联关系包括调用关系、等待关系、或调用关系和等待关系的集合。
在第三方面的一种可选方式中,存储器包括内核态空间和用户态空间。处理器具体用于在第一调度实体中的内核态空间中获取第一RPC调用链。处理器具体用于在第一服务端进程中的用户态空间中获取第一锁等待链。
在第三方面的一种可选方式中,存储器还存储有第一调度实体的等锁时长。处理器还用于获取第一调度实体的等锁时长。处理器具体用于若第一调度实体的等锁时长大于第一阈值,则获取第一调度实体的第一RPC调用链。
在第三方面的一种可选方式中,执行实体B1是第一调度实体调用的最后一个执行实体。处理器还用于若第一RPC调用链表征第一调度实体中不存在死锁,则获取第二服务端进程的第二锁等待链。第二锁等待链包括体现执行实体B1等待执行实体B2的等待关系的信息。其中,执行实体B1为锁B的等待者,执行实体B2为锁B的持有者。
在第三方面的一种可选方式中,处理器具体用于根据执行实体B1对应的寄存器获取执行实体B1的基地址。处理器具体用于根据执行实体B1的基地址和第一偏移量确定执行实体B1的lock-wait字段。处理器具体用于获取执行实体B1的lock-wait字段中的锁B的基地址。其中,锁B的基地址表征执行实体B1为锁B的等待者。处理器具体用于根据锁B的基地址和第二偏移量确定lock-owner字段。处理器具体用于获取lock-owner字段中执行实体B2的标识。其中,执行实体B2的标识表征执行实体B2为锁B的持有者。
在第三方面的一种可选方式中,执行实体B2的标识为执行实体B2的基地址。
在第三方面的一种可选方式中,处理器还用于确定正在运行执行实体B2的第二调度实体。处理器还用于获取第二调度实体的第二RPC调用链。第二RPC调用链包括体现执行实体B2调用执行实体A2的调用关系的信息。处理器具体用于若存在执行实体B1等待执行实体B2的等待关系,以及执行实体B2调用执行实体A2的调用关系,则确定存在死锁。
在第三方面的一种可选方式中,处理器还用于生成死锁告警。死锁告警包括第一RPC调用链、关联关系和第一锁等待链。其中,关联关系包括第二锁等待链和第二RPC调用链。
在第三方面的一种可选方式中,执行实体B1是第一调度实体调用的最后一个执行实体。处理器还用于若第一RPC调用链表征不存在死锁,则获取第二服务端进程的第二锁等待链。处理器还用于若第二锁等待链表征执行实体B1不是锁B的等待者,则开始第三调度实体的死锁检测。
在第三方面的一种可选方式中,处理器还用于生成告警,告警包括第一RPC调用链。告警表征第一调度实体处于死循环或阻塞状态。
本申请第四方面提供了一种计算机存储介质,其特征在于,所述计算机存储介质中存储有指令,所述指令在计算机上执行时,使得所述计算机执行如第一方面或第一方面任意一种实施方式所述的方法。
本申请第五方面提供了一种计算机程序产品,其特征在于,所述计算机程序产品在计算机上执行时,使得所述计算机执行如第一方面或第一方面任意一种实施方式所述的方法。
附图说明
图1为本申请中提供的死锁状态的结构示意图;
图2为本申请中提供的死锁检测方法的一个流程示意图;
图3为本申请中提供的操作系统的结构示意图;
图4为本申请中提供的RPC调用的一个流程示意图;
图5为本申请中提供的调度实体的一个结构示意图;
图6为本申请中提供的服务端进程的一个结构示意图;
图7为本申请中提供的lock-wait字段的地址的位置示意图;
图8为本申请中提供的lock-owner字段的地址的位置示意图;
图9为本申请中提供的获取锁的流程示意图;
图10为本申请中提供的释放锁的流程示意图;
图11为本申请中提供的死锁检测方法的另一个流程示意图;
图12为本申请中提供的执行实体检查链的结构示意图;
图13为本申请中提供的死锁检测装置的结构示意图;
图14为本申请中提供的死锁检测设备的结构示意图。
具体实施方式
本申请提供了一种死锁检测方法、装置以及相关设备。在本申请中,通过使用锁等待链和RPC调用链进行死锁检测,可以提高死锁检测的准确性。应理解,本申请中使用的“第一”、“第二”等仅用于区分描述的目的,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。为了方便理解本申请中的技术方案,下面对本申请中出现的一些专业术语进行描述。
操作系统是管理计算机硬件与软件资源的系统软件。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统可以提供一个让用户与系统交互的操作界面。操作系统可以包括1个或多个进程,同一进程可以包括1个或多个线程。
在执行和调度分离的机制中,执行实体(activation)和调度实体分别是线程的一部分。执行实体包含线程运行所需的寄存器信息,虚拟内存地址空间信息。调度实体包含线程运行所需的优先级等调度相关信息。其中,提供执行实体的进程也称为服务端进程。
进程间通信(Inter Process Communication,IPC)是在操作系统中,进程间的一类数据通信方法的统称。参与通信的双方或多方通过调用消息发送、接收等原语实现数据在进程之间的传递,从而完成数据通信。
远程过程调用(Remote Procedure Call,RPC)是一种进程间通信的模式,程序分布在不同的地址空间里。如果通信的两个进程在同一主机里,RPC可以通过不同的虚拟地址空间(即便使用相同的物理地址)进行通讯。如果通信的两个进程在不同的主机,则RPC可以通过不同的物理地址进行交互。
RPC调用链包括执行实体的调用关系。在调度实体中,通过RPC调用一个执行实体后,执行实体再次发起另一个RPC调用,形成RPC调用链。例如,执行实体A调用执行实体B,RPC调用链为A-B。
锁等待链包括执行实体的等待关系。一个线程在等待锁,持有该锁的线程在等待另外一个锁,由此形成锁等待链。例如,线程A等待线程B持有的锁,线程B等待线程C持有的锁。在执行和调度分离的机制中,锁等待链可以理解为一个执行实体在等待锁,持有该锁的执行实体在等待另外一个锁,由此形成锁等待链。例如,执行实体A等待执行实体B持有的锁,执行实体B等待执行实体C持有的锁。
宏内核架构是操作系统的一种内核架构方案。在宏内核架构下,操作系统将所有内核组件放在内核态空间中,如IPC模块、权限管理模块、文件系统和网络协议栈等。用户态空间负责运行应用代码。
微内核架构是操作系统的一种内核架构方案。在微内核架构下,操作系统在内核态空间中只保留核心的内核组件,如IPC模块、权限管理模块。操作系统将传统组件放入用户态空间,例如文件系统和网络协议栈等。
相比传统的宏内核架构,微内核架构将一些传统组件放到用户态空间中,从而增强系统的安全和可靠性。但是,在微内核架构下,一个应用程序获取系统服务的时候,需要通过IPC的方式。IPC会产生IPC处理开销。额外的IPC处理开销带来巨大的性能损失。为了尽可能减小IPC所带来的性能损失,在微内核架构中,可以采用执行和调度分离的机制。在执行和调度分离的机制中,线程分为执行实体和调度实体两部分。执行实体位于服务端进程。调度实体通过向服务端进程发起远程过程调用(Remote Procedure Call,RPC)来运行执行实体。
在执行和调度分离的机制中,锁等待链检查的准确性不高。例如,图1为本申请中提供的死锁状态的结构示意图。如图1所示,操作系统包括服务端进程101、调度实体102、服务端进程103和调度实体104。调度实体102也称为第一调度实体。调度实体104也称为第二调度实体。服务端进程101也称为第一服务端进程。服务端进程103也称为第二服务端进程。其中,服务端进程101包括执行实体A1和执行实体A2。服务端进程103包括执行实体B1和执行实体B2。调度实体102通过RPC调用执行实体A1。调度实体A通过RPC调用执行实体B1。执行实体B1在等待执行实体B2持有的锁B。执行实体B1为锁B的等待者,执行实体B2为锁B的拥有者。类似的,调度实体104通过RPC调用执行实体B2。执行实体B2通过RPC调用执行实体A2。执行实体A2在等待执行实体A1持有的锁A,执行实体A2为锁A的等待者,执行实体A1为锁A的拥有。因此,调度实体102在等待调度实体104释放锁B,调度实体104在等待调度实体102释放锁A。调度实体102和调度实体104互相等待,形成死锁。
但是,通过锁等待链检查无法确定存在死锁。如图1所示,执行实体A2等待执行实体A1拿的锁A(简写为A2-A1),执行实体B1等待执行实体B2拿的锁B(简写完B1-B2)。锁等待链包括A2-A1、B1-B2。锁等待链不成环,无法确定操作系统中存在死锁。
为此,本申请提供了一种死锁检测方法。在死锁检测方法中,不仅使用锁等待链,还使用RPC调用链,从而提高死锁检测的准确性。在本申请中,死锁检测方法的执行主体既可以是死锁检测设备,也可以是死锁检测设备中的操作系统,还可以是操作系统中的监控模块。在上下文中,将以执行主体是操作系统为例,对本申请的死锁检测方法进行描述。
图2为本申请中提供的死锁检测方法的一个流程示意图。如图2所示,死锁检测方法包括以下步骤。
在步骤201中,操作系统获取第一调度实体的第一RPC调用链。第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息(简写为A1-B1)。应理解,执行实体A1可以直接通过RPC调用执行实体B1,也可以间接通过RPC调用执行实体B1。当执行实体A1间接通过RPC调用执行实体B1时,执行实体A1先通过RPC调用其他执行实体,其他执行实体再通过RPC调用执行实体B1。例如,执行实体A1通过RPC调用执行实体C1,执行实体C1通过RPC调用执行实体B1。或者,执行实体A1通过RPC调用执行实体C1,执行实体C1通过RPC调用执行实体C2,执行实体C2通过RPC调用执行实体B1。
在步骤202中,操作系统获取第一服务端进程的第一锁等待链。第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息(简写为A2-A1)。其中,执行实体A2为锁A的等待者,执行实体A1为锁A的持有者。应理解,步骤201和步骤202之间没有严格限定的时序关系。
在步骤203中,若执行实体B1为执行实体A2,或执行实体B1和执行实体A2存在关联关系,则操作系统确定存在死锁。当执行实体B1为执行实体A2时,表示执行实体B1和执行实体A2为同一执行实体。此时,执行实体检查链包括A1-A2-A1。执行实体检查链成环。因此,可以确定操作系统中存在死锁。关联关系包括调用关系,等待关系,或调用关系和等待关系的集合。
当关联关系包括等待关系时,执行实体B1和执行实体A2存在等待关系(简写为B1-A2)。例如,执行实体B1为锁C的等待者,执行实体A2为锁C的拥有者。此时,执行实体检查链包括A1-B1-A2-A1。执行实体检查链成环。因此,可以确定操作系统中存在死锁。
当关联关系包括调用关系时,执行实体B1和执行实体A2存在调用关系(简写为B1-A2)。例如,执行实体B1通过RPC调用执行实体A2。此时,执行实体检查链包括A1-B1-A2-A1。执行实体检查链成环。因此,可以确定系统中存在死锁。
当关联关系包括调用关系和等待关系的集合时,执行实体B1和执行实体A2通过调用关系和等待关系的集合建立关联关系(简写为B1-X、X-A2)。例如,关联关系包括第二RPC调用链和第二锁等待链。第二锁等待链包括体现执行实体B1等待执行实体B2的等待关系的信息(简写为B1-B2)。其中,执行实体B1为锁B的等待者,执行实体B2为锁B的拥有者。第二RPC调用链包括体现执行实体B2调用执行实体A2的调用关系的信息(简写为B2-A2)。此时,执行实体检查链包括A1-B1-B2-A2-A1。执行实体检查链成环。因此,可以确定存在死锁。
并且,如图1所示,根据调度实体102可知,执行实体A1通过RPC调用执行实体B1(简写为A1-B1)。根据服务端进程103可知,执行实体B1等待执行实体B2持有的锁B(简写为B1-B2)。根据调度实体104可知,执行实体B2通过RPC调用执行实体A2(简写为B2-A2)。根据服务端进程101可知,执行实体A2等待执行实体A1持有的锁A(简写为A2-A1)。将前述RPC调用关系和锁等待关系串联,得到执行实体检查链A1-B1-B2-A2-A1。因此,图1中的死锁状态和本申请中的执行实体检查链契合。通过本申请中的死锁检测方法,采用执行实体检查链进行死锁检测,可以有效检测出死锁。
应理解,在实际应用中,当关联关系包括调用关系和等待关系的集合时,关联关系还可以包括更多的RPC调用链和锁等待链。例如,关联关系包括第二RPC调用链、第二锁等待链、第三RPC调用链和第三锁等待链。第二RPC调用链简写为B1-B2。第二锁等待链简写为B2-C1。第三RPC调用链简写为C1-C2。第三锁等待链简写为C2-A2。此时,执行实体检查链包括A1-B1-B2-C1-C2-A2-A1。执行实体检查链成环。因此,可以确定系统中存在死锁。
为了方便理解本申请中的死锁检测方法,下面对本申请中的操作系统进行示例性的描述。图3为本申请中提供的操作系统的结构示意图。如图3所示,操作系统包括微内核301,监控模块302,服务端进程303,调度实体304和服务端进程305。
监控模块302是操作系统的一个功能模块。监控模块302具有跨进程读取其他进程空间内存数据能力。微内核301用于为监控模块302提供系统调用接口。监控模块302用于通过系统调用接口获取调度实体的RPC调用链。具体地,监控模块302通过调度实体的执行实体调用栈获取RPC调用链。例如,在图3中,调度实体304用于向服务端进程303和服务端进程305发起RPC调用。服务端进程303和服务端305进程用于向调度实体304分配执行实体。微内核301为调度实体304维护了一个执行实体调用栈。执行实体调用栈位于内核态空间。在执行实体调用栈中,记录了调度实体304的调用关系,调用关系也称为RPC调用链。当调度实体304的base通过RPC调用执行实体A1时,微内核301从服务端进程305分配执行实体A1。微内核301将执行实体A1压入调度实体304的执行实体调用栈,以执行该RPC调用。类似的,当调度实体304的执行实体A1通过RPC调用执行实体B1时,微内核301从服务端进程303分配执行实体B1。微内核301将执行实体B1压入调度实体304的执行实体调用栈,以执行该RPC调用。在RPC调用结束返回后,微内核301将执行实体A1和执行实体B1从调度实体304的执行实体调用栈的弹出。微内核301可以为监控模块302提供相应的系统调用接口。监控模块302通过系统调用接口读取调度实体304的执行实体调用栈,获得RPC调用链。例如,在图3的示例中,监控模块302通过系统调用接口获得调度实体304的RPC调用链A1-B1。
在图3中,调度实体304向2个服务端进程发起RPC调用。在实际应用中,一个调度实体可以向1个或多个服务端进程发起RPC调用。下面以调度实体向1个服务端进程发起RPC调用为例进行说明。图4为本申请中提供的RPC调用的一个流程示意图。如图4所示,操作系统包括调度实体401和服务端进程402。服务端进程402包括执行实体A1、执行实体B2和执行实体B3。当调度实体401的base通过RPC调用执行实体A1时,操作系统的微内核从服务端进程402分配执行实体A1。微内核将执行实体A1压入调度实体401的执行实体调用栈,以执行该RPC调用。此时,调度实体401的RPC调用链包括A1。之后,调度实体401的执行实体A1通过RPC调用执行实体B2。在分配执行实体B2后,调度实体401的RPC调用链包括A1-B2。之后,调度实体401的执行实体B2通过RPC调用执行实体B3。在分配执行实体B3后,调度实体401的RPC调用链包括A1-B2-B3。
监控模块302定期(例如每1秒钟)通过系统调用接口读取操作系统中调度实体的等锁状态。具体地,监控模块302读取调度实体的lock-wait-state字段的内容。lock-wait-state字段位于专用内存(内核态空间)。监控模块302通过lock-wait-state字段可以获取调度实体的等锁时长。例如,图5为本申请中提供的调度实体的一个结构示意图。如图5所示,调度实体401包括一个对应lock-wait-state字段。lock-wait-state字段中记录了调度实体401的等锁时长或调度实体401进入等锁状态的时刻。具体地,在调度实体401通过RPC调用执行实体B3后,执行实体B3会尝试拿锁B。若锁B已经被其他执行实体持有,则调度实体401会被微内核挂起。此时,调度实体401进入等锁状态。若lock-wait-state字段中记录了调度实体401进入等锁状态的时刻,则lock-wait-state字段记录当前时刻。若lock-wait-state字段中记录了调度实体401的等锁时长,则lock-wait-state字段为一个计时器。计时器的开始时刻为当前时刻。为了方便描述,后续将以lock-wait-state字段中记录等锁时长为例,进行相应的描述。在执行实体B3成功拿到锁B后,操作系统清除lock-wait-state字段中的内容。
应理解,本申请中lock-wait-state字段的名称只是为了方便描述而举的示例。本申请不对字段的名称进行限定。例如,lock-wait-state字段也可以称为M字段。类似的,在后续的描述中,lock-wait字段和lock-owner字段也只是为了方便描述而举的示例。
监控模块302还用于获取服务端进程的锁等待链。具体地,监控模块302读取服务端进程的lock-owner字段和lock-wait字段。lock-owner字段和lock-wait字段位于服务端进程的专用内存(用户态空间)。lock-owner字段记录持有该锁的执行实体的标识。执行实体的标识可以执行实体标识Thread ID,或执行实体的基地址。lock-wait字段记录等待锁的执行实体所等待的锁的基地址。锁等待链包括锁的等待者-锁的持有者。例如,执行实体A1持有锁A,则锁A的lock-owner字段记录有执行实体A1的标识。执行实体A2为锁A的等待者,则执行实体A2的lock-wait字段记录有锁A的基地址。此时,锁等待链包括执行实体A2-执行实体A1(简写为A2-A1)。
下面结合具体示例对lock-owner字段和lock-wait字段进行描述。图6为本申请中提供的服务端进程的一个结构示意图。如图6所示,服务端进程402包括执行实体A1、执行实体B2、执行实体B3、锁A的lock-owner字段、锁B的lock-owner字段和3个lock-wait字段。3个lock-wait字段和3个执行实体一一对应。
每个执行实体存在对应的寄存器。寄存器中存储有执行实体的基地址。lock-wait字段的地址和执行实体的基地址相关。具体地,图7为本申请中提供的lock-wait字段的地址的位置示意图。如图7所示,执行实体A1的基地址和执行实体A1的lock-wait字段的地址存在第一偏移量。在第一偏移量已知的情况下,监控模块302可以通过第一偏移量和执行实体A1的基地址获取执行实体A1的lock-wait字段的地址。监控模块302可以通过执行实体A1的lock-wait字段的地址可以读取lock-wait字段中的数据。当监控模块302和执行实体A1处于不同的进程时,监控模块302可以跨进程读取lock-wait字段中的数据。
在其他实施例中,每个执行实体与对应的lock-wait字段的地址的偏移量相同。例如,执行实体A1的基地址和执行实体A1的lock-wait字段的地址存在第一偏移量。执行实体B2的基地址和执行实体B2的lock-wait字段的地址存在第一偏移量。此时,监控模块302可以通过第一偏移量获取执行实体B2的lock-wait字段的地址,以及执行实体A1的lock-wait字段的地址。因此,本实施例可以节约操作系统的存储资源,提高获取lock-wait字段的内容的效率。
锁的基地址与lock-owner字段的地址相关。具体地,图8为本申请中提供的lock-owner字段的地址的位置示意图。如图8所示,锁A的基地址和锁A的lock-owner字段的地址存在第二偏移量。在第二偏移量已知的情况下,监控模块302可以通过第二偏移量和锁A的基地址获取锁A的lock-owner字段的地址。监控模块302通过锁A的lock-owner字段的地址可以读取lock-owner字段中的数据。
在其他实施例中,第二偏移量和第一偏移量相同。此时,在第一偏移量已经的情况下,监控模块302可以通过第一偏移量、锁A的基地址、执行实体A1的基地址得到执行实体A1的lock-wait字段的地址,以及锁A的基地址。因此,本实施例可以节约操作系统的存储资源。
上面对lock-owner字段和lock-wait字段的地址的位置进行描述,下面对结合图6,对lock-owner字段和lock-wait字段的功能进行描述。图9为本申请中提供的获取锁的流程示意图。如图9所示,获取锁的过程包括以下步骤。
在步骤901中,操作系统将锁的基地址保存到当前执行实体的lock-wait字段。例如,在图6中,执行实体A1尝试拿锁A,则操作系统在执行实体A1的lock-wait字段添加锁A的基地址。
在步骤902中,若锁已经被其他调度实体持有,则操作系统通过系统调用接口将当前调度实体设置为等锁状态,并记录等锁时长,挂起当前调度实体。例如,在图6中,当执行实体B2拿到锁B时,锁B的lock-owner字段中记录执行实体B2的标识。在执行实体B2拿到锁B后,执行实体B3尝试拿锁B。但是,由于锁B已经被执行实体B2持有,执行实体B3进入等锁状态。执行实体B3的lock-wait字段记录锁B的基地址。并且,图5中的调度实体进入等锁状态。调度实体的lock-wait-state字段记录等锁时长。
在步骤903中,若锁并未被其他调度实体持有,则操作系统执行获取锁的操作,将当前执行实体的基地址保存到该锁的Lock-owner字段。例如,在图6中,在执行实体A1拿到锁A后,操作系统在锁A的Lock-owner字段中添加执行实体A1的标识。
在步骤904中,操作系统将当前执行实体的lock-wait字段清零。例如,在前述步骤901中,操作系统在执行实体A1的lock-wait字段中添加了锁A的基地址。在执行实体A1拿到锁A后,操作系统将执行实体A1的lock-wait字段清零。
图10为本申请中提供的释放锁的流程示意图。如图10所示,释放锁的过程包括以下步骤。
在步骤1001中,操作系统将锁的Lock-owner字段清零。例如,在图6中,当执行实体A1拿到锁A后,锁A的Lock-owner字段中记录有执行实体A1的标识。在释放锁时,操作系统将锁A的Lock-owner字段清零。
在步骤1002中,操作系统执行释放锁的操作。例如操作系统通过原子操作修改锁标记,通过调用系统调用接口唤醒等待锁的其他调度实体等。
上面结合图3至图10,对本申请中的操作系统进行了描述。应理解,前述对操作系统的描述只是一个或多个具体的示例。在实际应用中,本领域技术人员可以根据需求对操作系统进行适应性的改变。在适应性的改变后,若需要使用RPC调用链和锁等待链进行死锁检测,则仍属于本申请的保护范围。适应性的改变包括但不限于以下的一项或多向内容。
例如,在图3中,操作系统包括监控模块302。监控模块302用于获取RPC调用链,锁等待链和等锁状态。在实际应用中,监控模块可以是微内核的一部分。此时,由微内核负责执行监控模块所执行的全部操作。具体地,微内核读取RPC调用链,锁等待链和等锁状态。
例如,在图5和图6中,Lock-owner字段和lock-wait字段位于用户态空间。在实际应用中,Lock-owner字段和lock-wait字段可以位于内核态空间。
例如,在图7中,将执行实体A1的基地址加上第一偏移量后,可以得到lock-wait字段的地址。在实际应用中,操作系统可以存储有执行实体A1的基地址和lock-wait字段的地址的映射表。在确定执行实体A1的基地址后,通过查找映射表,操作系统可以得到lock-wait字段的地址。类似的,操作系统也可以存储有锁A的基地址和Lock-owner字段的地址的映射表。在确定锁A的基地址后,通过查找映射表,操作系统可以得到Lock-owner字段的地址。
例如,在图9中,在当前执行实体尝试拿锁时,操作系统会将锁的基地址保存到当前执行实体的lock-wait字段。在拿到锁后,操作系统再将当前执行实体的lock-wait字段清零。在实际应用中,在当前执行实体尝试拿锁时,操作系统并不会将锁的基地址保存到当前执行实体的lock-wait字段。只有在确定锁已经被其他执行实体持有时,操作系统才将锁的基地址保存到当前执行实体的lock-wait字段。此时,若确定锁并未被其他执行实体持有时,操作系统无需对lock-wait字段清零。
下面结合图3至图10对本申请中的死锁检测方法进行描述。图11为本申请中提供的死锁检测方法的另一个流程示意图。如图11所示,死锁检测方法包括以下步骤。
在步骤1101中,操作系统读取第一个等锁状态超时的调度实体。根据前述图5的描述可知,调度实体对应一个lock-wait-state字段。因此,通过读取N个lock-wait-state字段的内容,操作系统可以获取到N个调度实体的N个等锁时长。N为大于或等于1的整数。若调度实体的等锁时长大于第一阈值,则表征调度实体的等锁状态超时。操作系统确定最大的等锁时长作为目标等锁时长。目标等锁时长大于第一阈值。目标等锁时长对应的调度实体即为第一个等锁状态超时的调度实体。
在步骤1102中,操作系统将第一个等锁状态超时的调度实体设置为当前调度实体。根据前述图4的描述可知,操作系统为当前调度实体维护了一个执行实体调用栈。操作系统将当前调度实体对应的执行实体调用栈设置为当前执行实体调用栈。操作系统将当前执行实体调用栈上的第一个执行实体设置为当前执行实体。操作系统建立一个空的执行实体检查链。
在步骤1103中,操作系统将当前执行实体加入执行实体检查链。
在步骤1104中,操作系统确定执行实体检查链是否成环。若是,则执行步骤1105,若否,则执行步骤1106。
在步骤1105中,若执行实体检查链成环,则操作系统确定存在死锁。在确定存在死锁后,操作系统生成死锁告警。死锁告警包括执行实体检查链。执行实体检查链用于死锁的定位。在定位到死锁后,操作系统可以进一步对执行实体检查链上的执行实体采取恢复动作。为了消除异常,尽快恢复业务,恢复动作可以采用最少的恢复动作。例如,恢复动作包括杀死调度实体,调整调度实体优先级等。
在步骤1106中,若执行实体检查链不成环,则操作系统确定当前执行实体是否为当前执行实体调用栈上的最后一个调用实体。若当前执行实体是当前执行实体调用栈上的最后一个调用实体,则执行步骤1108。若当前执行实体不是当前执行实体调用栈上的最后一个调用实体,则执行步骤1107。
在步骤1107中,操作系统将当前执行实体调用的下一个执行实体设置为当前执行实体。执行步骤1103。
在步骤1108中,操作系统确定当前执行实体的lock-wait字段是否为空。根据前述图6的描述可知,当前执行实体存在对应的lock-wait字段。操作系统读取lock-wait字段中的内容,确定lock-wait字段是否为空。若当前执行实体的lock-wait字段为空,则表明当前执行实体不是锁的等待者,执行步骤1109。若当前执行实体的lock-wait字段不为空,则表明当前执行实体是锁的等待者,执行步骤1113。并且,在当前执行实体的lock-wait字段为空时,操作系统可以生成告警。告警表征当前调度实体处于死循环或阻塞状态。具体地,在当前调度实体被挂起的情况下,当前调度实体才会进入等锁状态。但是,通过步骤1104可知,执行实体检查链不成环,即挂起当前调度实体的原因并不是死锁。因此,可能存在其他原因使得当前调度实体被挂起,例如死循环或阻塞。告警包括执行实体检查链。操作系统可以根据执行实体检查链定位死循环或阻塞的位置,进而消除死循环或阻塞。
在步骤1109中,操作系统确定是否检查完所有等锁状态超时的调度实体。在前述步骤1101中,操作系统获取了N个等锁时长。在N个等锁时长中,若存在多个等锁时长大于第一阈值,则表征存在多个等锁状态超时的调度实体。若除了当前调度实体,还包括其它等锁状态超时的调度实体时,则操作系统确定未检查完所有等锁状态超时的调度实体,执行步骤1111。若除了当前调度实体,不包括其它等锁状态超时的调度实体时,则操作系统确定检查完所有等锁状态超时的调度实体,执行步骤1110。
在步骤1110中,操作系统结束死锁检测。
在步骤1111中,操作系统读取下一个等锁状态超时的调度实体。
在步骤1112中,操作系统初始化执行实体检查链。执行步骤1102。
在步骤1113中,操作系统读取当前执行实体的lock-wait字段中的锁的基地址。根据前述图9的描述可知,当执行实体处于等锁状态时,执行实体对应的lock-wait字段中会记录锁的基地址。因此,若当前执行实体的lock-wait字段不为空,则可以在当前执行实体的lock-wait字段中读取到锁的基地址。根据前述图8的描述可知,根据第二偏移量和锁的基地址,操作系统可以得到lock-owner字段的地址。lock-owner字段中记录了拿了锁的执行实体的标识。将执行实体的标识对应的执行实体设置为当前执行实体。
在步骤1114中,操作系统将当前执行实体加入执行实体检查链。
在步骤1115中,操作系统确定执行实体检查链是否成环。若是,则执行步骤1116,若否,则执行步骤1117。
在步骤1116中,若执行实体检查链成环,则操作系统确定存在死锁。
在步骤1117中,若执行实体检查链不成环,则操作系统确定当前执行实体的lock-wait字段是否为空。若当前执行实体的lock-wait字段不为空,则执行步骤1113。若当前执行实体的lock-wait字段为空,则执行步骤1118。
在步骤1118中,操作系统读取当前执行实体所在的调度实体。将该调度实体设置为当前调度实体。并将当前调度实体的执行实体调用栈设置为当前执行实体调用栈。
在步骤1119中,操作系统确定当前执行实体是否为当前执行实体调用栈上的最后一个调用实体。若当前执行实体是当前执行实体调用栈上的最后一个调用实体,则执行步骤1108。若当前执行实体不是当前执行实体调用栈上的最后一个调用实体,则执行步骤1107。
上面结合图3至图10对本申请图11中的死锁检测方法进行描述。下面以图1中的死锁状态为例,对图11中的死锁检测方法进行示例性的描述。具体地,当采用本申请中的死锁检测方法检测图1中的死锁状态时,死锁检测方法包括以下步骤。
在步骤1101,假设当前调度实体为图1中的调度实体102。
在步骤1102中,根据图1中的调度实体102可知,当前执行实体调用栈包括执行实体A1和执行实体B1(此处忽略执行实体A1和执行实体B1之间的执行实体)。因此,当前执行实体调用栈上的第一个执行实体为执行实体A1。
在步骤1103中,操作系统将执行实体A1加入执行实体检查链。此时,执行实体检查链为执行实体A1(简写为A1)。
在步骤1104中,操作系统确定执行实体检查链A1不成环,执行步骤1106。
在步骤1106中,操作系统确定当前执行实体不是当前执行实体调用栈上的最后一个调用实体,执行步骤1107。具体地,根据图1可知,当前执行实体调用栈还包括执行实体B1。因此,当前执行实体不是当前执行实体调用栈上的最后一个调用实体。
在步骤1107中,根据当前执行实体调用栈可知,执行实体A1调用的下一个执行实体为执行实体B1。操作系统将执行实体B1设置为当前执行实体。并返回执行步骤1103。
在步骤1103中,操作系统将执行实体B1加入执行实体检查链。此时,执行实体检查链为执行实体A1、执行实体B1(简写为A1-B1)。
在步骤1104中,操作系统确定执行实体检查链A1-B1不成环,执行步骤1106。
在步骤1106中,操作系统确定当前执行实体是当前执行实体调用栈上的最后一个调用实体,执行步骤1108。
在步骤1108中,操作系统确定当前执行实体的lock-wait字段不为空,执行步骤1113。具体地,根据图1中的服务端进程103可知,执行实体B1为锁B的等待者。此时,执行实体B1的lock-wait字段记录有锁B的基地址。因此,当前执行实体的lock-wait字段不为空。
若当前执行实体的lock-wait字段为空,则表征执行实体B1不是锁B的等待者,操作系统开始第三调度实体的死锁检测。第三调度实体是另一个等锁状态超时的调度实体。并且,操作系统可以生成告警。告警表征调度实体102处于死循环或阻塞状态。告警包括执行实体检查链A1-B1。操作系统根据实体检查链A1-B1对告警的位置进行定位。
在步骤1113中,操作系统读取lock-wait字段中的锁B的基地址。操作系统根据锁B的基地址和第二偏移量确定锁B的lock-owner字段。操作系统读取lock-owner字段中的内容。由于执行实体B2为锁B的拥有者,lock-owner字段中记录有执行实体B2的标识。操作系统将执行实体B2作为当前执行实体。
在步骤1114中,操作系统将执行实体B2加入执行实体检查链。此时,执行实体检查链为执行实体A1、执行实体B1、执行实体B2(简写为A1-B1-B2)。
在步骤1115中,操作系统确定执行实体检查链A1-B1-B2不成环,执行步骤1117。
在步骤1117中,操作系统确定当前执行实体的lock-wait字段为空,执行步骤1118。具体地,根据图1可知,执行实体B2不是锁的等待者。因此,执行实体B2的lock-wait字段为空。
在步骤1118中,操作系统读取执行实体B2所在的调度实体104。操作系统将调度实体104设置为当前调度实体。操作系统将调度实体104的执行实体调用栈设置为当前执行实体调用栈。当前执行实体调用栈包括执行实体B2和执行实体A2(此处忽略执行实体B2和执行实体A2之间的执行实体)。
在步骤1119中,操作系统确定当前执行实体不是当前执行实体调用栈上的最后一个调用实体,执行步骤1107。具体地,根据图1可知,除了执行实体B2,当前执行实体调用栈还包括执行实体A2。因此,当前执行实体不是当前执行实体调用栈上的最后一个调用实体。
在步骤1107中,根据当前执行实体调用栈可知,执行实体B2调用的下一个执行实体为执行实体A2。操作系统将执行实体A2设置为当前执行实体。并返回执行步骤1103。
在步骤1103中,操作系统将执行实体B1加入执行实体检查链。此时,执行实体检查链为执行实体A1、执行实体B1、执行实体B2、执行实体A2(简写为A1-B1-B2-A2)。
在步骤1104中,操作系统确定执行实体检查链A1-B1-B2-A2不成环,执行步骤1106。
在步骤1106中,操作系统确定当前执行实体是当前执行实体调用栈上的最后一个调用实体,执行步骤1108。
在步骤1108中,操作系统确定当前执行实体的lock-wait字段不为空,执行步骤1113。具体地,根据图1中的服务端进程101可知,执行实体A2为锁A的等待者。此时,执行实体A2的lock-wait字段记录有锁A的基地址。因此,当前执行实体的lock-wait字段不为空。
在步骤1113中,操作系统读取lock-wait字段中的锁A的基地址。根据锁A的基地址和第二偏移量确定锁B的lock-owner字段。读取lock-owner字段中的内容。由于执行实体A1为锁B的拥有者,lock-owner字段中记录有执行实体A1的标识。操作系统将执行实体A1作为当前执行实体。
在步骤1114中,操作系统将执行实体A1加入执行实体检查链。此时,执行实体检查链为执行实体A1、执行实体B1、执行实体B2、执行实体A2、执行实体A1(简写为A1-B1-B2-A2-A1)。
在步骤1115中,操作系统确定执行实体检查链A1-B1-B2-A2-A1成环,执行步骤1116。
在步骤1116中,操作系统确定存在是死锁。在确定存在死锁后,操作系统生成死锁告警。死锁告警包括执行实体检查链A1-B1-B2-A2-A1。执行实体检查链包括第一RPC调用链A1-B1,关联关系和第一锁等待链A2-A1。关联关系包括第二锁等待链B1-B2和第二RPC调用链B2-A2。在确定存在死锁后,操作系统可以对其他等锁状态超时的调度实体进行检查,即执行步骤1111。在通过步骤1111读取下一个等锁状态超时的调度实体后,通过步骤1112对执行实体检查链路进行初始化。初始化是指将执行实体检查链清零。在执行初始化后,执行实体检查链为空。
前述以图1所示的死锁状态为例,对本申请中的死锁检测方法进行了描述。应理解,图1只是死锁状态的一个场景示例。在实际应用中,本申请中的死锁检测方法可以应用于更多的死锁状态场景。例如,在图1中,执行实体A1和执行实体A2属于服务端进程102。执行实体B1和执行实体B2属于服务端进程103。服务端进程102和服务端进程103属于不同的进程。在实际应用中,执行实体A1、执行实体A2、执行实体B1和执行实体B2可以属于同一进程。
根据前述对图11的描述,以及死锁检测方法在图1中的应用可知,本申请中死锁检测方法既采用了RPC调用链,也采用了锁等待链。并且,RPC调用链和锁等待链在执行实体检查链中交替分布。图12为本申请中提供的执行实体检查链的结构示意图。执行实体检查链包括RPC调用链和锁等待链。操作系统从RPC调用链开始死锁检测。当检查到RPC调用链的最后一个执行实体,仍未发现死锁时,操作系统将最后一个执行实体作为锁等待链的起点,开始检查锁等待链。当见检查到锁等待链的最后一个执行实体,仍未发现死锁时,操作系统将最后一个执行实体作为RPC调用链的起点,开始检查RPC调用链。重复以上过程,直至执行实体检查链停止,或执行实体检查链成环。
应理解,在图11和图12中,操作系统从RPC调用链开始死锁检测。因此,执行实体检查链的开头为RPC调用链。在实际应用中,操作系统也可以从锁等待链开始死锁检测。此时,执行实体检查链的开头为锁等待链。
前面对本申请中的死锁检测方法进行描述,下面对本申请中的死锁检测装置进行描述。图13为本申请中提供的死锁检测装置的结构示意图。如图13所示,死锁检测装置包括第一获取模块1301、第二获取模块1302和处理模块1303。其中,第一获取模块1301用于获取第一调度实体的第一RPC调用链。第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息。第二获取模块1302用于获取第一服务端进程的第一锁等待链。第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息。其中,执行实体A2为锁A的等待者,执行实体A1为锁A的持有者。处理模块1303用于若执行实体B1为执行实体A2,或执行实体B1和执行实体A2存在关联关系,则确定存在死锁。其中,关联关系包括调用关系、等待关系、或调用关系和等待关系的集合。
在其他实施例中,死锁检测装置还可以包括生成模块等。死锁检测装置中的模块具体用于执行图2或图11对应的实施例中的操作系统可以执行的全部或部分操作。
上面对本申请中的死锁检测装置进行描述,下面对本申请实施例中的死锁检测设备进行描述。图14为本申请中提供的死锁检测设备的结构示意图。本申请中的死锁检测设备可以是台式电脑,笔记本,智能手机等。如图14所示,死锁检测设备包括:处理器1401和存储器1403。
其中,处理器1410可以是中央处理器(central processing unit,CPU),网络处理器(network processor,NP)或者CPU和NP的组合。处理器1410还可以进一步包括硬件芯片或其他通用处理器。上述硬件芯片可以是专用集成电路(application specificintegrated circuit,ASIC),可编程逻辑器件(programmable logic device,PLD)或其组合。上述PLD可以是复杂可编程逻辑器件(complex programmable logic device,CPLD),现场可编程逻辑门阵列(field-programmable gate array,FPGA),通用阵列逻辑(genericarray logic,GAL)及其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等或其任意组合。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
存储器1403可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(Read-Only Memory,ROM)、可编程只读存储器(Programmable ROM,PROM)、可擦除可编程只读存储器(Erasable PROM,EPROM)、电可擦除可编程只读存储器(Electrically EPROM,EEPROM)或闪存。易失性存储器可以是随机存取存储器(Random Access Memory,RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(Static RAM,SRAM)、动态随机存取存储器(Dynamic RAM,DRAM)、同步动态随机存取存储器(Synchronous DRAM,SDRAM)等。
存储器1403中存储有第一RPC调用链和第一锁等待链。第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息。第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息。其中,执行实体A2为锁A的等待者,执行实体A1为锁A的持有者。处理器1401用于获取第一RPC调用链和第一锁等待链,若执行实体B1为执行实体A2,或执行实体B1和执行实体A2存在关联关系,则确定存在死锁。其中,关联关系包括调用关系、等待关系、或调用关系和等待关系的集合。
在其他实施例中,死锁检测设备还包括收发器1402。收发器1402可以是光纤收发器,无线射频模块等。
在其他实施例中,存储器1403中存储有可供处理器1401执行的计算机程序。当处理器1401读取并执行计算机程序时,可以执行上述图2或图11中死锁检测方法的全部或部分操作。
本申请还提供一种数字处理芯片。该数字处理芯片中集成了用于实现上述处理器1401的功能的电路和一个或者多个接口。当该数字处理芯片中集成了存储器时,该数字处理芯片可以完成前述实施例中的任意一个或多个实施例的方法步骤。当该数字处理芯片中未集成存储器时,可以通过接口与外置的存储器连接。该数字处理芯片根据外置的存储器中存储的程序代码来实现上述图2或图11中的死锁检测方法。
以上,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。

Claims (21)

1.一种死锁检测方法,其特征在于,包括:
获取第一调度实体的第一RPC调用链,所述第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息;
获取第一服务端进程的第一锁等待链,所述第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息,其中,所述执行实体A2为锁A的等待者,所述执行实体A1为所述锁A的持有者;
若所述执行实体B1为所述执行实体A2,或所述执行实体B1和所述执行实体A2存在关联关系,则确定存在死锁;
其中,所述关联关系包括调用关系、等待关系、或调用关系和等待关系的集合。
2.根据权利要求1所述的方法,其特征在于,
所述获取第一调度实体的第一RPC调用链包括:
在所述第一调度实体中的内核态空间中获取所述第一RPC调用链;
所述获取第一服务端进程的第一锁等待链包括:
在所述第一服务端进程中的用户态空间中获取所述第一锁等待链。
3.根据权利要求1或2所述的方法,其特征在于,在获取第一调度实体的第一RPC调用链之前,所述方法还包括:
获取所述第一调度实体的等锁时长;
若所述第一调度实体的等锁时长大于第一阈值,则获取所述第一调度实体的所述第一RPC调用链。
4.根据权利要求1至3中任意一项所述的方法,其特征在于,所述执行实体B1是所述第一调度实体调用的最后一个执行实体,在获取第一调度实体的第一RPC调用链之后,所述方法还包括:
若所述第一RPC调用链表征所述第一调度实体中不存在死锁,则获取第二服务端进程的第二锁等待链,所述第二锁等待链包括体现所述执行实体B1等待执行实体B2的等待关系的信息,其中,所述执行实体B1为锁B的等待者,所述执行实体B2为所述锁B的持有者。
5.根据权利要求4中所述的方法,其特征在于,所述获取第二服务端进程的第二锁等待链包括:
根据所述执行实体B1对应的寄存器获取所述执行实体B1的基地址;
根据所述执行实体B1的基地址和第一偏移量确定所述执行实体B1的lock-wait字段;
获取所述执行实体B1的lock-wait字段中的锁B的基地址,其中,所述锁B的基地址表征所述执行实体B1为锁B的等待者;
根据所述锁B的基地址和第二偏移量确定lock-owner字段;
获取所述lock-owner字段中所述执行实体B2的标识,其中,所述执行实体B2的标识表征所述执行实体B2为锁B的持有者。
6.根据权利要求5中所述的方法,其特征在于,所述执行实体B2的标识为所述执行实体B2的基地址。
7.根据权利要求4至6中任意一项所述的方法,其特征在于,在获取第二服务端进程的第二锁等待链之后,所述方法还包括:
确定正在运行所述执行实体B2的第二调度实体;
获取所述第二调度实体的第二RPC调用链,所述第二RPC调用链包括体现所述执行实体B2调用所述执行实体A2的调用关系的信息;
若所述执行实体B1和所述执行实体A2存在关联关系,则确定存在死锁包括:
若存在所述执行实体B1等待所述执行实体B2的等待关系,以及所述执行实体B2调用所述执行实体A2的调用关系,则确定存在死锁。
8.根据权利要求1至7中任意一项所述的方法,其特征在于,在确定存在死锁后,所述方法还包括:
生成死锁告警,所述死锁告警包括所述第一RPC调用链,所述关联关系和所述第一锁等待链;
其中,所述关联关系包括所述第二锁等待链和所述第二RPC调用链。
9.根据权利要求1至3中任意一项所述的方法,其特征在于,所述执行实体B1是所述第一调度实体调用的最后一个执行实体,在获取第一调度实体的第一RPC调用链之后,所述方法还包括:
若所述第一RPC调用链表征不存在死锁,则获取第二服务端进程的第二锁等待链;
若所述第二锁等待链表征所述执行实体B1不是锁B的等待者,则开始第三调度实体的死锁检测。
10.根据权利要求9所述的方法,其特征在于,所述方法还包括:
生成告警,所述告警包括所述第一RPC调用链,所述告警表征所述第一调度实体处于死循环或阻塞状态。
11.一种死锁检测装置,其特征在于,包括:
第一获取模块,用于获取第一调度实体的第一RPC调用链,所述第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息;
第二获取模块,用于获取第一服务端进程的第一锁等待链,所述第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息,其中,所述执行实体A2为锁A的等待者,所述执行实体A1为所述锁A的持有者;
处理模块,用于若所述执行实体B1为所述执行实体A2,或所述执行实体B1和所述执行实体A2存在关联关系,则确定存在死锁;
其中,所述关联关系包括调用关系、等待关系、或调用关系和等待关系的集合。
12.根据权利要求11所述的装置,其特征在于,
所述第一获取模块具体用于在所述第一调度实体中的内核态空间中获取所述第一RPC调用链;
所述第二获取模块具体用于在所述第一服务端进程中的用户态空间中获取所述第一锁等待链。
13.根据权利要求11或12所述的装置,其特征在于,
所述第一获取模块还用于获取所述第一调度实体的等锁时长;
若所述第一调度实体的等锁时长大于第一阈值,则获取所述第一调度实体的所述第一RPC调用链。
14.根据权利要求11至13中任意一项所述的装置,其特征在于,所述执行实体B1是所述第一调度实体调用的最后一个执行实体;
所述第二获取模块还用于若所述第一RPC调用链表征所述第一调度实体中不存在死锁,则获取第二服务端进程的第二锁等待链,所述第二锁等待链包括体现所述执行实体B1等待执行实体B2的等待关系的信息,其中,所述执行实体B1为锁B的等待者,所述执行实体B2为所述锁B的持有者。
15.根据权利要求14中所述的装置,其特征在于,所述获取第二服务端进程的第二锁等待链包括:
所述第二获取模块具体用于根据所述执行实体B1对应的寄存器获取所述执行实体B1的基地址;
所述第二获取模块具体用于根据所述执行实体B1的基地址和第一偏移量确定所述执行实体B1的lock-wait字段;
所述第二获取模块具体用于获取所述执行实体B1的lock-wait字段中的锁B的基地址,其中,所述锁B的基地址表征所述执行实体B1为锁B的等待者;
所述第二获取模块具体用于根据所述锁B的基地址和第二偏移量确定lock-owner字段;
所述第二获取模块具体用于获取所述lock-owner字段中所述执行实体B2的标识,其中,所述执行实体B2的标识表征所述执行实体B2为锁B的持有者。
16.根据权利要求15中所述的装置,其特征在于,所述执行实体B2的标识为所述执行实体B2的基地址。
17.根据权利要求14至16中任意一项所述的装置,其特征在于,
所述处理模块还用于确定正在运行所述执行实体B2的第二调度实体;
所述第一获取模块还用于获取所述第二调度实体的第二RPC调用链,所述第二RPC调用链包括体现所述执行实体B2调用所述执行实体A2的调用关系的信息;
所述处理模块具体用于若存在所述执行实体B1等待所述执行实体B2的等待关系,以及所述执行实体B2调用所述执行实体A2的调用关系,则确定存在死锁。
18.根据权利要求11至17中任意一项所述的装置,其特征在于,所述装置还包括:
生成模块,用于生成死锁告警,所述死锁告警包括所述第一RPC调用链,所述关联关系和所述第一锁等待链;
其中,所述关联关系包括所述第二锁等待链和所述第二RPC调用链。
19.根据权利要求11至13中任意一项所述的装置,其特征在于,所述执行实体B1是所述第一调度实体调用的最后一个执行实体:
所述第二获取模块还用于若所述第一RPC调用链表征不存在死锁,则获取第二服务端进程的第二锁等待链;
所述处理模块还用于若所述第二锁等待链表征所述执行实体B1不是锁B的等待者,则开始第三调度实体的死锁检测。
20.根据权利要求19所述的装置,其特征在于,所述装置还包括:
生成模块,用于生成告警,所述告警包括所述第一RPC调用链,所述告警表征所述第一调度实体处于死循环或阻塞状态。
21.一种死锁检测设备,其特征在于,包括:处理器和存储器;
所述存储器中存储有第一RPC调用链和第一锁等待链,所述第一RPC调用链包括体现执行实体A1调用执行实体B1的调用关系的信息,所述第一锁等待链包括体现执行实体A2等待执行实体A1的等待关系的信息;
其中,所述执行实体A2为锁A的等待者,所述执行实体A1为所述锁A的持有者;
所述处理器用于获取所述第一RPC调用链和所述第一锁等待链;
所述处理器还用于若执行实体B1为执行实体A2,或所述执行实体B1和所述执行实体A2存在关联关系,则确定存在死锁;
其中,所述关联关系包括调用关系、等待关系、或调用关系和等待关系的集合。
CN202110525149.1A 2021-05-13 2021-05-13 死锁检测方法、装置以及相关设备 Pending CN115344360A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202110525149.1A CN115344360A (zh) 2021-05-13 2021-05-13 死锁检测方法、装置以及相关设备
PCT/CN2022/090114 WO2022237570A1 (zh) 2021-05-13 2022-04-29 死锁检测方法、装置以及相关设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110525149.1A CN115344360A (zh) 2021-05-13 2021-05-13 死锁检测方法、装置以及相关设备

Publications (1)

Publication Number Publication Date
CN115344360A true CN115344360A (zh) 2022-11-15

Family

ID=83946809

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110525149.1A Pending CN115344360A (zh) 2021-05-13 2021-05-13 死锁检测方法、装置以及相关设备

Country Status (2)

Country Link
CN (1) CN115344360A (zh)
WO (1) WO2022237570A1 (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103399818A (zh) * 2013-08-13 2013-11-20 中国科学技术大学苏州研究院 操作系统中的死锁检测方法
US20190114248A1 (en) * 2017-10-12 2019-04-18 The Board Of Regents Of The University Of Texas System Defeating deadlocks in production software
CN111159051A (zh) * 2019-12-31 2020-05-15 北京天融信网络安全技术有限公司 死锁检测方法、装置、电子设备及可读存储介质
CN111522730A (zh) * 2020-03-09 2020-08-11 平安科技(深圳)有限公司 程序测试方法及装置、计算机装置、计算机可读介质
CN112363846A (zh) * 2021-01-11 2021-02-12 北京金山云网络技术有限公司 数据库事务的死锁检测方法、装置及电子设备

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB0118294D0 (en) * 2001-07-27 2001-09-19 Ibm Method and system for deadlock detection and avoidance
US20070101338A1 (en) * 2005-10-31 2007-05-03 Microsoft Corporation Detection, diagnosis and resolution of deadlocks and hangs
CN103902356B (zh) * 2012-12-26 2018-07-31 上海斐讯数据通信技术有限公司 一种信号量死锁的检测方法
CN110442459A (zh) * 2019-07-04 2019-11-12 北京百度网讯科技有限公司 分布式死锁检测方法及装置、计算机设备及可读介质

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103399818A (zh) * 2013-08-13 2013-11-20 中国科学技术大学苏州研究院 操作系统中的死锁检测方法
US20190114248A1 (en) * 2017-10-12 2019-04-18 The Board Of Regents Of The University Of Texas System Defeating deadlocks in production software
CN111159051A (zh) * 2019-12-31 2020-05-15 北京天融信网络安全技术有限公司 死锁检测方法、装置、电子设备及可读存储介质
CN111522730A (zh) * 2020-03-09 2020-08-11 平安科技(深圳)有限公司 程序测试方法及装置、计算机装置、计算机可读介质
CN112363846A (zh) * 2021-01-11 2021-02-12 北京金山云网络技术有限公司 数据库事务的死锁检测方法、装置及电子设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
金庆: "避免RPC回调死锁", Retrieved from the Internet <URL:https://blog.csdn.net/jq0123/article/details/108680243> *

Also Published As

Publication number Publication date
WO2022237570A1 (zh) 2022-11-17

Similar Documents

Publication Publication Date Title
US10387228B2 (en) Symmetric bridge component for communications between kernel mode and user mode
CN110622478B (zh) 数据同步处理的方法和装置
AU2017434691B2 (en) Method and device for handling timeout of system service
EP0733971A2 (en) Method and apparatus for managing connections for communication among objects in a distributed object system
CN110688280B (zh) 一种告警事件的管理系统、方法、设备和存储介质
WO2020232875A1 (zh) 一种基于Actor模型的任务调度方法、装置及存储介质
CN112104572B (zh) 数据处理方法、装置、电子设备及存储介质
CN111427751A (zh) 基于异步处理机制对业务进行处理的方法及系统
CN113284586B (zh) 医疗业务处理方法、装置、设备及存储介质
CN114025018A (zh) 数据处理方法、装置、网络设备及计算机可读存储介质
CN112698959A (zh) 一种多核通信方法和装置
CN113220535A (zh) 程序异常的处理方法、装置、设备及存储介质
CN113364857A (zh) 业务数据的处理方法、装置和服务器
CN115344360A (zh) 死锁检测方法、装置以及相关设备
CN112257065A (zh) 一种进程事件处理方法和装置
CN112015563A (zh) 消息队列切换方法、装置、电子设备及存储介质
US8191076B2 (en) Method and apparatus for making inter-process procedure calls through shared memory
CN115695592A (zh) 一种at命令处理方法、装置及设备
CN114756356A (zh) 任务处理方法、工作节点设备、主节点设备及存储介质
CN116450386A (zh) 看门狗检测方法、设备及存储介质
CN116450390A (zh) 看门狗检测方法及电子设备
CN115002840A (zh) 设备数据传输方法、装置、电子设备及存储介质
CN116132623A (zh) 一种基于视频监控的智能分析方法、系统及设备
CN113157426A (zh) 一种任务调度方法、系统、设备及存储介质
CN113608892B (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