专利名称:检测操作系统中任务死循环的方法及操作系统的制作方法
技术领域:
本发明涉及计算机操作系统,尤其涉及基于任务优先级抢占的操作系统中死循环 检测技术。
背景技术:
在基于任务优先级调度策略的操作系统中,当高优先级任务处于就绪状态时,低 优先级任务是肯定不能得到调度的。一股情况下,高优先级任务不会一直运行,任务的设计 者会通过主动或被动的方式放弃CPU的执行,以使得低优先级的任务能够得到执行。任务 主动放弃CPU的形式一股为延迟自身的执行,等待一段时间再恢复执行;或者因为等待某 个事件而阻塞自己。被动的形式主要是该任务被更高优先级任务抢占。当高优先级任务 由于设计或编码错误导致出现死循环,并且死循环中的代码都没有主动放弃CPU的行为, 那么低优先级任务将得不到执行,导致整个系统运行不正常。为了检测死循环,现有的方法是通过时钟中断检测任务连续运行时长来检测死循 环,并进行死循环的处理。如果时钟中断检测到任务连续运行时长超过设定的阈值,则认为 该任务出现死循环,然后产生中断以记录该任务的相关任务信息,并进行相应的处理。具体 步骤是,在时钟中断时,记录当前正在运行的任务的运行时长,如果任务发生切换则将该任 务的运行时长清零;如果时钟中断时检测发现任务连续运行时长超于预定的阈值,则认为 任务出现死循环。在检测出死循环任务后,获取死循环任务控制块信息、寄存器信息、堆栈 信息等,通过寄存器信息获取任务调用栈信息,然后进行记录以便进行问题定位。上述方法对死循环的检测不全面。当被检测任务不是连续运行,而是断断续续时, 虽然该任务可能已经处于死循环状态,但是因为其还是会暂时被动放弃CPU。如,某一任务 已经出现死循环,但因为有更高优先级任务存在,该死循环任务仍然会暂时停止,此时,现 有的死循环检测方法由于该死循环任务已暂时放弃CPU的控制,则该任务的运行时长被清 零,死循环漏检。
发明内容
本发明所要解决的技术问题是,提供一种更为全面的任务死循环的检测方法以及 实现该方法的操作系统。本发明为解决上述技术问题所提供的技术方案是,检测操作系统中任务死循环的 方法,其特征在于,包括以下步骤a、系统定期启动最高优先级的检测任务;b、检测任务检查每个任务的就绪状态累计时间,就绪状态累计时间大于阈值的任 务被判断出现死循环。不同于现有的死循环检测方法通过对任务连续运行时长与阈值比较来判断是否 出现死循环,本发明通过就绪状态累计时间长度与阈值比较来判断是否出现死循环。本发 明基于的原理是,优先级抢占式操作系统中,当有任务发生死循环而不会主动放弃CPU时,该任务在任何情况下都处于就绪状态。通过统计一个任务的就绪状态累计时间长度来进行 死循环判断可以避免因被动放弃CPU的死循环的漏检。优选的,系统发生任务切换时,更新放弃CPU控制权的任务的就绪状态累计时间。将对就绪状态累计时间的统计放在任务切换时,相对于在时钟中断时进行就绪状 态累计时间的统计更优。当然,如果在时钟中断时进行统计也是可行的,但是时钟终端的统 计未考虑到任务可能因为时钟中断之外的原因而发生切换的情况。所以,在任务切换时进 行就绪状态累计时间的统计,能使得死循环的检测更为全面,进一步避免漏检。任务的就绪状态累计时间的更新方式为对于放弃CPU控制权的任务,且该任务保持就绪状态,将该任务本次运行总时间 累加至就绪状态累计时间;对于放弃CPU控制权的任务,且该任务未处于就绪状态,将该任务的就绪状态累 计时间清零。就绪状态累计时间的计算方式为系统针对每一个任务,记录其就绪状态累计时间、本次开始运行时间;系统发生任务切换时,对于放弃CPU控制权的任务,且该任务保持就绪状态,则用 当前时间减去本次开始运行时间,得到本次运行总时间,并将本次运行总时间加至就绪状 态累计时间;对于获得CPU控制权的任务,将当前时间记录至该任务的本次开始运行时间。本发明所述检测出死循环的情况还包括类死循环。本发明将导致了系统运行不正 常的任务,不论其确为死循环或类死循环,都统称为死循环任务。所以,为了更有效地对这 些死循环任务进行分析,步骤b中,判断出死循环任务后,检测任务每隔一个TICK运行一 次,每次运行都对死循环任务进行分析,并获取该死循环任务寄存器的值。让死循环任务不 断运行,检测任务不断采样,得到尽量多的死循环任务在各个时间点上执行的寄存器值,便 于从中找到引起异常的直接原因。针对上述方法,本发明还提供一种实现该方法的操作系统,包括系统控制模块、检 测任务模块、任务控制模块、就绪状态累计时间计算模块;系统控制模块用于,定期启动最高优先级的检测任务模块,控制任务切换;检测任务模块用于,检测任务检查每个任务的任务控制模块中就绪状态累计时 间,就绪状态累计时间大于阈值的任务被判断出现死循环;任务控制模块用于,记录每个任务的就绪状态累计时间;就绪状态累计时间计算模块,用于计算任务的就绪状态累计时间并记录在任务控 制模块中。优选的,就绪状态累计时间计算模块在系统发生任务切换时,计算放弃CPU控制 权的任务的就绪状态累计时间。就绪状态累计时间计算模块对于放弃CPU控制权且保持就绪状态的任务,将该任 务本次运行总时间累加至就绪状态累计时间;对于放弃CPU控制权且未处于就绪状态的任 务,将该任务的就绪状态累计时间清零。任务控制模块还记录每个任务的本次开始运行时间;就绪状态累计时间计算模 块对于放弃CPU控制权且保持就绪状态的任务,用当前时间减去该任务的本次开始运行时 间,得到本次运行总时间,并将本次运行总时间加至就绪状态累计时间;对于获得CPU控制权的任务,将当前时间记录至该任务的本次开始运行时间。进一步的,检测任务模块还用于,检测任务模块判断出死循环任务后,每隔一个 TICK运行一次,每次运行都对死循环任务进行分析,并获取该死循环任务寄存器的值。本发明的有益效果是,能更为全面地、有效地检测操作系统中的死循环任务。
图1为操作系统示意图。图2为实施例中任务tl与任务t2的切换示意图。
具体实施例方式如图1所示,操作系统包括系统控制模块、检测任务模块、任务控制模块、就绪状 态累计时间计算模块;系统控制模块用于,定期启动最高优先级的检测任务模块,控制任务切换;检测任务模块用于,检测任务检查每个任务的任务控制模块中就绪状态累计时 间,就绪状态累计时间大于阈值的任务被判断出现死循环;检测任务模块判断出死循环任 务后,每隔一个TICK多次调用死循环任务,并获取该死循环任务寄存器的值;任务控制模块用于,记录每个任务的就绪状态累计时间。就绪状态累计时间计算模块用于,系统发生任务切换时,计算放弃CPU控制权的 任务的就绪状态累计时间并记录在任务控制模块中对于放弃CPU控制权且保持就绪状态 的任务,将该任务本次运行总时间累加至就绪状态累计时间;对于放弃CPU控制权且未处 于就绪状态的任务,将该任务的就绪状态累计时间清零。死循环检测方法流程如下在任务控制模块中记录两个任务状态一个是任务在就绪状态下总的运行时间 (就绪状态累计时间),另一个是任务本次开始运行时间。在系统中确定一个阙值,并间隔 启动一个最高优先级的检测任务;为了不对整个系统产生影响,该任务的执行间隔时间可 以设置的大一点,比如每隔5分钟运行一次;在操作系统发生的任务切换时,对于放弃CPU控制权的任务,如果该任务是就绪 状态,通过当前时间减去任务控制块中保存的本次开始运行时间,得到本次运行总时间,将 这个运行总时间加到任务控制块中的就绪态累计运行时间上。如果该任务不是就绪态,就 绪态累计运行时间清零,表明任务主动挂起了自己。如图2所示,如果任务tl切换到任务 t2时,任务tl是就绪状态,则累加任务tl的就绪累计运行时间。如果任务tl切换到任务 t2时,任务tl不是就绪状态,任务tl的就绪累计运行时间清零。获得CPU控制权的任务在任务控制模块中记录其本次开始运行时间。任务切换 时,增加的动作只是最简单的数字加减计算,引起的开销非常小。间隔时间到系统控制模块启动检测任务模块,检测任务比较系统中每个任务的就 绪态累计时间是否大于阈值。在没有出现大于阈值的任务之前,检测任务轮询每个任务做 简单的数字比较,因此任务执行的时间是非常短的,对整个系统的影响非常小。当检测任务 检测到某个任务的就绪状态累计时间大于阈值时,认为出现了死循环,可以自动进入任务 分析流程,也可以通过控制台报警,由用户确定是否需要分析。在进入分析流程后,检测任务模块每隔一个tick将死循环任务的所有寄存器值打印出来。由于检测任务有主动延迟, 死循环任务会被调度执行,寄存器值可能会发生变化,因此检测任务能够在死循环任务的 不同执行点上获得寄存器的值,就有足够多的数据用于分析反汇编的代码,找到引起死循 环的直接原因。
权利要求
检测操作系统中任务死循环的方法,其特征在于,包括以下步骤a、系统定期启动最高优先级的检测任务;b、检测任务检查每个任务的就绪状态累计时间,就绪状态累计时间大于阈值的任务被判断出现死循环。
2.如权利要求1所述检测操作系统中任务死循环的方法,其特征在于,系统发生任务 切换时,更新放弃CPU控制权的任务的就绪状态累计时间。
3.如权利要求2所述检测操作系统中任务死循环的方法,其特征在于,任务的就绪状 态累计时间的更新方式为对于放弃CPU控制权的任务,且该任务保持就绪状态,将该任务本次运行总时间累加 至就绪状态累计时间;对于放弃CPU控制权的任务,且该任务未处于就绪状态,将该任务的就绪状态累计时 间清零。
4.如权利要求3所述检测操作系统中任务死循环的方法,其特征在于,就绪状态累计 时间的计算方式为系统针对每一个任务,记录其就绪状态累计时间、本次开始运行时间;系统发生任务切换时,对于放弃CPU控制权的任务,且该任务保持就绪状态,则用当前 时间减去本次开始运行时间,得到本次运行总时间,并将本次运行总时间加至就绪状态累 计时间;对于获得CPU控制权的任务,将当前时间记录至该任务的本次开始运行时间。
5.如权利要求1、2、3或4所述检测操作系统中任务死循环的方法,其特征在于,步骤 b中,判断出死循环任务后,检测任务每隔一个TICK运行一次,每次运行都对死循环任务进 行分析,并获取该死循环任务寄存器的值。
6.操作系统,其特征在于,包括系统控制模块、检测任务模块、任务控制模块、就绪状态 累计时间计算模块;所述系统控制模块用于,定期启动最高优先级的检测任务模块,控制任务切换;所述检测任务模块用于,检测任务检查每个任务的任务控制模块中就绪状态累计时 间,就绪状态累计时间大于阈值的任务被判断出现死循环;所述任务控制模块用于,记录每个任务的就绪状态累计时间;所述就绪状态累计时间计算模块用于,计算就绪状态累计时间并记录在任务控制模块中。
7.如权利要求6所述操作系统,其特征在于,所述就绪状态累计时间计算模块在系统 发生任务切换时,计算放弃CPU控制权的任务的就绪状态累计时间。
8.如权利要求7所述操作系统,其特征在于,所述就绪状态累计时间计算模块对于放 弃CPU控制权且保持就绪状态的任务,将该任务本次运行总时间累加至就绪状态累计时 间;对于放弃CPU控制权且未处于就绪状态的任务,将该任务的就绪状态累计时间清零。
9.如权利要求8所述操作系统,其特征在于,所述任务控制模块还记录每个任务的本 次开始运行时间;就绪状态累计时间计算模块对于放弃CPU控制权且保持就绪状态的任务,用当前时间 减去该任务的本次开始运行时间,得到本次运行总时间,并将本次运行总时间加至就绪状 态累计时间;对于获得CPU控制权的任务,将当前时间记录至该任务的本次开始运行时间。
10.如权利要求6、7、8或9所述操作系统,其特征在于,所述检测任务模块还用于,检测 任务模块判断出死循环任务后,每隔一个TICK运行一次,每次运行都对死循环任务进行分 析,并获取该死循环任务寄存器的值。
全文摘要
本发明提供一种更为全面的任务死循环的检测方法以及实现该方法的操作系统。不同于现有的死循环检测方法通过对任务连续运行时长与阈值比较来判断是否出现死循环,本发明通过就绪状态累计时间长度与阈值比较来判断是否出现死循环。本发明基于的原理是,优先级抢占式操作系统中,当有任务发生死循环而不会主动放弃CPU时,该任务在任何情况下都处于就绪状态。通过统计一个任务的就绪状态累计时间长度来进行死循环判断可以避免因被动放弃CPU的死循环的漏检。
文档编号G06F11/00GK101853191SQ20101020717
公开日2010年10月6日 申请日期2010年6月23日 优先权日2010年6月23日
发明者曾健 申请人:迈普通信技术股份有限公司