一种线程堆栈的使用情况的实现方法和装置的制造方法

文档序号:8258328阅读:278来源:国知局
一种线程堆栈的使用情况的实现方法和装置的制造方法【
技术领域
】[0001]本申请涉及计算机操作系统
技术领域
,特别是涉及一种任务堆栈使用情况的实现方法和装置。【
背景技术
】[0002]在计算机操作系统中,正在计算机中执行的程序称为进程(Process),而线程(Thread)为进程中某个单一顺序的控制流,其为程序执行流的最小单元。一个标准的线程通常由线程标识(ID)、当前指令指针(PC)、寄存器集合和堆栈组成。一个进程可以由一个或多个线程组成,这些线程共享进程的地址空间。[0003]目前,每一个线程的堆栈容量由程序员在创建线程时进行配置。如果配置的堆栈容量偏小,而线程本身又进行了相关的递归操作,或者定义了比较大的局部变量,则容易导致线程实际使用的堆栈容量超过上述配置的堆栈容量,也就是堆栈溢出,由于产生堆栈溢出的线程与其它线程共享地址空间,因此,该线程的堆栈溢出容易破坏其它线程的数据,从而导致整个进程崩溃。而如果配置的堆栈容量偏大,堆栈的使用又将造成系统内存资源的浪费。因此,线程堆栈的检测是非常重要的技术。[0004]现有的可移植操作系统接口(POSIX,PortableOperatingSystemInterface)标准定义了嵌入式操作系统应该为应用程序提供的接口标准。POSix标准提供了一种堆栈溢出的检测手段,该检测手段为线程堆栈设置了一个满栈警戒区,该满栈警戒区处于线程堆栈底部,属于线程堆栈的一个扩展区域,当对线程堆栈末尾的警戒缓冲区进行访问时,嵌入式系统会发出错误信号,通常是发送段违例(SIGSEGV,Segmentat1nv1lat1n)信号给线程。然而,当发出错误信号时,嵌入式操作系统已经处于异常工作状态,一般都采用复位方式以尽快回到工作状态,既中止了正在执行的任务影响了任务的执行效率,又降低了用户体验。【
发明内容】[0005]本申请实施例所要解决的技术问题是提供一种线程堆栈的检测方法和装置,能够提尚任务的执彳丁效率和提升用户体验。[0006]相应的,本申请实施例还提供了一种任务堆栈使用情况的查询方法和装置,为用户提供线程堆栈的使用情况的查询接口,以方便用户对堆栈使用情况的实时检测。[0007]为了解决上述问题,本申请公开了一种线程堆栈的检测方法,包括:[0008]在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;[0009]在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;[0010]依据所述分界地址,计算得到所述线程堆栈的使用情况;[0011]在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。[0012]优选的,所述依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址的步骤,包括:[0013]在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址,或者,在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址。[0014]优选的,所述在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址的步骤,包括:[0015]按照从高地址到低地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个不为所述预定值的堆栈地址作为所述分界地址。[0016]优选的,所述在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址的步骤,包括:[0017]按照从低地址到高地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个为所述预定值的堆栈地址作为所述分界地址。[0018]优选的,所述依据所述分界地址,计算得到所述线程堆栈的使用情况的步骤,包括:[0019]以所述线程堆栈的栈顶地址与所述分界地址的差值确定所述线程堆栈的使用情况;或者,[0020]以所述线程堆栈的栈顶地址与所述分界地址的差值相对于所述线程堆栈的容量的比例,确定所述线程堆栈的使用情况。[0021]优选的,所述方法还包括:依据所述告警信息,通过堆栈解析得到所述线程堆栈的故障现场信息。[0022]另一方面,本申请还提供了一种线程堆栈的使用情况的查询方法,包括:[0023]接收查询请求;所述查询请求中携带有线程堆栈;[0024]依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况;所述线程堆栈的使用情况记录中记录有系统中线程堆栈的使用情况;[0025]将所获取的所述线程堆栈的使用情况作为查询结果返回;[0026]其中,通过如下步骤生成所述线程堆栈的使用情况记录:[0027]在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;[0028]在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;[0029]依据所述分界地址,计算得到所述线程堆栈的使用情况;[0030]将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录。[0031]优选的,所述线程堆栈的使用情况记录中还记录有所述线程堆栈的使用情况的记录时间;[0032]所述依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况的步骤,包括:依据线程堆栈的使用情况记录获取所述线程堆栈的、记录时间最新的使用情况。[0033]再一方面,本申请还公开了一种线程堆栈的检测装置,包括:[0034]初始化模块,用于在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;[0035]查询模块,用于在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;[0036]计算模块,用于依据所述分界地址,计算得到所述线程堆栈的使用情况;及[0037]告警模块,用于在所述线程堆栈的使用情况超过预设门限时,发出告警信息;其中,所述预设门限低于所述线程堆栈的容量。[0038]优选的,所述查询模块包括:[0039]第一查询子模块,用于在所述线程堆栈的地址空间中查询地址最低的、且不为所述预定值的堆栈地址;或者,[0040]第二查询子模块,用于在所述线程堆栈的地址空间中分界地址最高的、且为所述预定值的堆栈地址。[0041]优选的,所述第一查询子模块,具体用于按照从高地址到低地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个不为所述预定值的堆栈地址作为所述分界地址。[0042]优选的,所述第二查询子模块,具体用于按照从低地址到高地址的顺序查询所述线程堆栈的地址空间,并将查询得到的最后一个为所述预定值的堆栈地址作为所述分界地址。[0043]又一方面,本申请还公开了一种线程堆栈的使用情况的查询装置,包括:[0044]接口模块,用于接收查询请求;所述查询请求中携带有线程堆栈;[0045]查询模块,用于依据线程堆栈的使用情况记录获取所述线程堆栈的使用情况;所述线程堆栈的使用情况记录中记录有系统中线程堆栈的使用情况;[0046]返回模块,用于将所获取的所述线程堆栈的使用情况作为查询结果返回;及[0047]记录生成模块,用于生成所述线程堆栈的使用情况记录;[0048]其中,所述记录生成模块包括:[0049]初始化子模块,用于在创建线程后,将所述线程对应线程堆栈的地址空间初始化为预定值;[0050]查询子模块,用于在所述线程执行完任务后,依据所述预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址;[0051]计算子模块,用于依据所述分界地址,计算得到所述线程堆栈的使用情况;及[0052]记录子模块,用于将所述线程堆栈的使用情况添记录至线程堆栈的使用情况记录。[0053]优选的,所述线程堆栈的使用情况记录中还记录有所述线程堆栈的使用情况的记录时间;[0054]所述查询模块,具体用于依据线程堆栈的使用情况记录获取所述线程堆栈的、记录时间最新的使用情况。[0055]与现有技术相比,本申请实施例包括以下优点:[0056]现有技术在对线程堆栈末尾的警戒缓冲区进行访问时,嵌入式操作系统已经处于异常工作状态,只能采用复位方式以尽快回到工作状态,既中止了任务,又没有给故障诊断预留时间;而本申请实施例在所述线程执行完任务后,依据初始化时的预定值在所述线程堆栈的地址空间中查询已使用地址空间与未使用地址空间的分界地址,并在所述线程堆栈的使用情况超过预设门限时发出告警信息;[0057]第一,由于所述预设门限低于所述线程堆栈的容量,故能够在对线程堆栈末尾的警戒缓冲区进行访问前发出告警信息,因此能够避免出现对线程堆栈末尾的警戒缓冲区的访问导致的复位现象,从而能够避免任务的中止,故能够提高任务的当前第1页1 2 3 4 
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1