嵌入式linux系统用户态任务独占的监测定位方法

文档序号:6377764阅读:313来源:国知局
专利名称:嵌入式linux系统用户态任务独占的监测定位方法
技术领域
本发明涉及嵌入式系统,具体涉及嵌入式Iinux系统用户态任务独占的监测定位方法。
背景技术
嵌入式Iinux系统是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。它继承了 Linux的开放源代码资源的优点,又具有嵌入式操作系统的特性,因此,性能优异、软件移植容易、实时性能和稳定性、安全性好,使用嵌入式Iinux系统开发新产品周期短,如今已被广泛的应用于工业制造、过程控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等众多领域。Linux支持多任务(进程),通过进程调度进行调度管理。但是,如果某一个任务在 执行过程中进入死循环或者始终等待其他资源,则会长时间独占CPU,从而导致整个系统死锁,任何进程都无法运行。为此,嵌入式Iinux系统必须对用户态任务独占进行监测,以确保系统正常运行。目前,嵌入式系统针对任务独占监测定位主要有以下两种方法
第一种方法通过硬时钟中断实现。即在嵌入式软件中启动硬时钟定时器,并在定时器的中断服务例程中循环监控系统中各任务的消息处理时间是否超过预定阀值,从而判断是否有任务发生独占,之后直接打印信息通知开发人员任务独占或者向调试任务发送填充有独占的任务标识的消息,在调试任务中获取函数调用栈信息并输出。第二种方法通过插桩代码实现。即在系统中各任务循环体的入口处增加统计变量,每次系统调度时,该变量的值递增;然后创建一个高优先级的任务,循环遍历被监控的任务,当任务连续N次出现统计变量值不为零、统计变量值不变的时间超过规定的阀值、CPU占用率超过阀值且任务处于运行状态,则判定任务发生独占,之后输出独占的异常信肩、O第一种方法有如下主要弊端首先,要求嵌入式系统必须具有硬时钟中断功能,而嵌入式LINUX系统在用户态下不存在硬时钟中断功能;其次,对监测的任务具有局限性,只能监测到具有处理消息功能的任务。第二种方法有如下主要弊端首先,任务统计变量如果需要在每次调度的时候递增,则需要在系统调度时设置,而不是在任务循环体入口处设置,这就需要修改内核调度代码;其次,任务规格受限,需要循环遍历系统中所有任务,对这些任务排序并监测,当系统中任务较多时,该方法会占用较多资源,效率较低。由此可见,现有嵌入式系统针对任务独占监测定位的方法应用到嵌入式LINUX系统上时,存在较大的缺陷。

发明内容
为了解决上述技术问题,本发明所采用的技术方案是提供一种嵌入式Iinux系统用户态任务独占的监测定位方法,包括以下步骤
在任务切换时,记录正在运行的任务的ID和任务开始运行时的系统TICK ;
启动高优先级监测任务循环监测系统中正在运行的任务,计算任务运行时长,并根据任务的运行时长是否大于预先设定的阀值获得该任务是否为独占任务,如该任务为独占任务,则向该任务发送控制信号,启动独占任务定位处理函数,所述运行时长为任务当前时刻的系统TICK与任务开始运行时的系统TICK之间的差值;
根据所述控制信号启动独占任务定位处理函数获取所述独占任务的ID,并实时打印和保存所述独占任务的任务名、上下文以及函数调用关系。在上述方法中,根据正在运行任务的任务属性和连续两次高优先级监测的任务是否发生任务切换,判断该任务是抢占式任务还是非抢占式任务;如果该任务是抢占式任务,则执行抢占式任务的独占监测;否则进行当前连续运行任务的独占监测。
在上述方法中,独占任务定位处理函数和处理流程如下
根据所述独占任务的ID,读取/proc/目录下与所述独占任务对应的maps文件,获取所述独占任务对应的所有虚拟内存起始地址和终止地址;
根据Iinux内核封装的上下文信息,获取所述独占任务的当前指令地址和函数调用栈基值,根据当前指令地址和内存映射信息,获得当前指令所在静态或动态库的文件名和当前指令相对库文件的偏移地址;
根据函数调用时的入栈和出栈规律以及获取到的函数调用栈基值,逐级获取每一层函数调用栈信息,并实时打印和保存当前任务的任务名、上下文以及函数调用关系。本发明,克服了需要操作系统提供硬时钟中断功能的限制,且不需要修改操作系统内核代码,完全在用户态下实现了任务独占监测,并通过提供多级函数调用栈信息,为精确定位任务独占发生的位置提供多级调用函数名、源文件、行号等重要信息。


图I为本发明提供的嵌入式Iinux系统用户态任务独占的监测定位方法流程图; 图2为本发明中高优先级监测任务的一次处理流程。
具体实施例方式下面结合附图对本发明作出详细的说明。本发明提出的嵌入式Iinux系统用户态任务独占的监测定位方法,首先设定如下多个参数变量
(1)定义并初始化用于记录任务独占环境的数组变量,数组中每一个元素用于记录一次任务独占时的环境信息,包括独占任务的ID、任务名、任务开始TICK、任务总运行时长、堆栈中函数调用关系等;
(2)定义并初始化描述当前任务状态的结构变量,包括任务ID,任务开始TICK,任务运行时长;
(3)定义并初始化描述待监测的抢占式任务的结构变量,包括任务ID,任务开始TICK,任务运行时长,是否进行任务独占监测标识;
(4)定义任务独占的阀值,包括抢占式任务阀值Al和非抢占式任务阀值A2。
(5)定义可靠信号SIG_M0N0P0LY,用于启动独占任务的定位处理函数。请参见图1,本发明提供的嵌入式Iinux系统用户态任务独占的监测定位方法包括以下步骤
步骤I :在任务切换时,根据新切换任务的属性以及连续两次监测是否发生任务切换,判断该任务是抢占式任务还是非抢占式任务;当任务为非抢占式任务时,设置描述当前任务状态的结构变量的任务ID为该任务,并设置该任务的开始运行的TICK为当前系统TICK ;否则设置描述待监测的抢占式任务的结构变量的任务ID为该任务ID,任务开始运行TICK为当前系统TICK,并设置是否进行任务独占监测的标识为TRUE。步骤2 :创建并启动高优先级监测任务,循环监测系统中正在运行的任务,根据被监测任务当前时刻的系统TICK与任务开始运行时的系统TICK之间的差值,计算当前被监测的任务运行时长,并根据任务的运行时长是否大于预先设定的阀值获得该任务是否为独占任务,如该任务为独占任务,则调用pthread_kill接口向该任务发送控制信号SIG_MONOPOLY,启动独占任务定位处理函数。 步骤3 :通过独占任务定位处理函数,即信号SIG_M0N0P0LY的信号处理函数,在该函数内获取当前独占任务ID,并实时打印和保存所述独占任务的任务名、上下文以及函数调用关系,重置描述当前任务状态的结构变量中任务的开始运行TICK为当前TICK。在系统退出时,保存记录的系统任务独占环境信息到存储介质,可以方便离线查询和定位。本发明在步骤I中,首先根据任务的属性判断该任务是抢占式任务还是非抢占式任务,其目的在于(1)为抢占式任务和非抢占式任务分别设置不同的任务运行时长阀值;
(2)如果已经检测到有抢占式任务独占,则高优先级监测任务不会再循环监测系统中所有任务是否发生抢占式独占,提高系统监测效率。在步骤2中,高优先级监测任务的一次处理流程如图2所示,根据抢占式任务和非抢占式任务分为两部分当前连续运行的任务独占监测和抢占式任务独占监测。连续运行的任务独占监测的具体实现步骤如下
步骤S201 :根据当前任务在监测发生时的系统TICK与任务开始运行的系统TICK之间的差值,获得当前任务连续运行的运行时长。步骤S202 :判断运行时长是否大于预先设定的阀值A2。若大于预先设定的阀值A2,则表示发生了独占;否则,跳转至抢占式任务的独占监测。步骤S203 :从描述系统任务独占环境的数组变量中获取用于记录本次独占信息的数组索引,保存当前任务ID、任务名、任务开始运行TICK和任务总运行TICK。步骤S204 :向当前任务发送控制信号SIG_M0N0P0LY,启动独占任务定位处理函数。抢占式任务的独占监测的具体实现步骤如下
步骤S301 :根据待监测的抢占式任务的结构变量中是否进行任务独占监测标识,判断待监测的抢占式任务是否需要进行独占式监测,若需要,则执行步骤S302,否则,跳至步骤S304。步骤S302 :判断抢占式任务运行时长是否大于预先设定的阀值Al,若大于预先设定的阀值Al,则表示发生独占,执行步骤S303 ;否则,跳至步骤S305 ;步骤S303 :从描述系统任务独占环境的数组变量中获取用于记录本次独占任务的数组索引,保存当前任务ID、任务名、任务开始运行TICK和运行时长。步骤S304 :向当前任务发送控制信号SIG_M0N0P0LY,启动独占任务定位处理函数,并退出监测任务。步骤S305 :设置下一轮待监测的抢占式任务,重置待监测的抢占式任务的结构变量为下一次系统监测的任务。在步骤3中,独占任务定位处理函数和处理流程如下
根据独占任务的ID读取/proc/目录下与所述独占任务对应的maps文件,获取所述独占任务对应的所有虚拟内存起始地址和终止地址;
根据Iinux内核封装的上下文信息,获取所述独占任务的当前指令地址和函数调用栈 基值,根据当前指令地址和内存映射信息,获得当前指令所在静态或动态库的文件名和当前指令相对库文件的偏移地址;
根据函数调用时的入栈和出栈规律以及获取到的函数调用栈基值,逐级获取每一层函数调用栈信息,并实时打印和保存当前任务的任务名、上下文以及函数调用关系。本发明不局限于上述最佳实施方式,任何人应该得知在本发明的启示下作出的结构变化,凡是与本发明具有相同或相近的技术方案,均落入本发明的保护范围之内。
权利要求
1.嵌入式Iinux系统用户态任务独占的监测定位方法,其特征在于,包括以下步骤 在任务切换时,记录正在运行的任务的ID和任务开始运行时系统TICK ;启动高优先级监测任务循环监测当前系统中正在运行的任务,计算任务运行时长,并根据任务的运行时长是否大于预先设定的阀值判断该任务是否为独占任务,如该任务为独占任务,则向该独占任务发送控制信号,所述运行时长为任务当前时刻的系统TICK与任务开始运行时的系统TICK之间的差值;根据所述控制信号启动独占任务定位处理函数,获取所述独占任务的ID,并实时打印和保存所述独占任务的任务名、上下文以及函数调用关系。
2.如权利要求I所述的嵌入式Iinux系统用户态任务独占的监测定位方法,其特征在于,根据正在运行任务的任务属性和连续两次监测是否发生任务切换,判断该任务是抢占式任务还是非抢占式任务;如果该任务是抢占式任务,则执行抢占式任务的独占监测;否则进行当前连续运行任务的独占监测。
3.如权利要求I所述的嵌入式Iinux系统用户态任务独占的监测定位方法,其特征在于,独占任务定位处理函数和处理流程如下根据所述独占任务的ID读取/proc/目录下与所述独占任务对应的maps文件,获取所述独占任务对应的所有虚拟内存起始地址和终止地址;根据信号处理函数输入的上下文信息,获取所述独占任务的当前指令地址和函数调用栈基值,根据当前指令地址和内存映射信息,获得当前指令所在静态或动态库的文件名和当前指令相对库文件的偏移地址;根据函数调用时的入栈和出栈规律以及获取到的函数调用栈基值,逐级获取每一层函数调用栈信息,并实时打印和保存当前任务的任务名、上下文以及函数调用关系。
全文摘要
本发明公开了一种嵌入式linux系统用户态任务独占的监测定位方法,包括以下步骤在任务切换时,记录正在运行的任务的ID和任务开始运行时TICK;启动高优先级监测任务循环监测系统中正在运行的任务,并根据任务的运行时长是否大于预先设定的阀值获得该任务是否为独占任务,如该任务为独占任务,则向该任务发送控制信号,启动独占任务定位处理函数,获取所述独占任务的ID,并实时打印和保存所述独占任务的任务名、上下文以及函数调用关系。本发明,克服了需要操作系统提供硬时钟中断功能的限制,且不需要修改操作系统内核代码,完全在用户态下实现了任务独占监测和定位。
文档编号G06F11/34GK102929770SQ201210362848
公开日2013年2月13日 申请日期2012年9月25日 优先权日2012年9月25日
发明者徐鑫, 刘应江, 刘昊, 简楹, 杨红霞 申请人:烽火通信科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1