当前任务的运行状态获取方法、装置、设备及存储介质
文献发布时间:2023-06-19 10:57:17
技术领域
本发明属于计算机技术领域,尤其涉及一种多处理器系统中当前任务的运行状态获取方法、装置、设备及存储介质。
背景技术
随着芯片技术的发展,多处理器系统早已成为中高端应用领域的主流,广泛应用于消费电子、视像安防、智能硬件、工业控制等领域。其中应用最为广泛的是对称式多处理器(SMP),即在一个计算机上汇集了一组处理器(CPU),各CPU之间共享内存子系统和总线结构。多处理器往往需要运行复杂的应用,比如录像、人脸识别、播放视频等,这些应用场景通常有多个任务同时运行。操作系统用于协调和管理各个任务,给它们分配相应的硬件资源,让它们有条不紊地运行,这个行为称为任务调度。
多处理器系统中,通常有一些信息用于描述各CPU的运行状态,比如负载率反映了CPU的繁忙程度,就绪任务队列包含CPU上所有待运行的任务。这些信息通常用全局的结构体数组来描述,在系统初始化时被分配好,如图1所示。
多处理器系统中,通常每个CPU上都有一个任务处于运行状态或活动状态,叫做当前任务。在当前任务运行过程中,操作系统需要频繁地获取其运行状态,以此为依据,决定对当前任务的后续处理(挂起还是继续运行等),并为其他任务提供必要信息。因此,如何快速准确地获取当前任务的运行状态,对提升调度性能和系统整体运行性能,具有重要意义。现有技术的做法是,将当前任务的运行状态保存在CPU的运行状态信息中,并在当前任务运行时动态更新其状态信息。当新的任务被CPU调度运行时,该任务成为CPU新的当前任务,相应地,其运行状态信息被更新到CPU运行状态信息中,如图2所示。
按现有技术,获取CPU的当前任务信息,首先要获取CPU号,然后得到CPU的运行状态信息,再从中得到CPU的当前任务信息。这个过程中,在获得CPU号之后,当前任务不能被调度到其他CPU上运行,否则会出现CPU号错乱,导致获得的当前任务不对。为了禁止当前任务被调度到其他CPU,需要关闭当前CPU的本地中断。具体地,先备份当前CPU的本地中断状态,再关闭当前CPU的本地中断,再获取当前CPU的运行状态,并从中获得当前任务信息,最后恢复当前CPU的本地中断,当前任务的运行状态获取方法的实现流程如图3所示。但该方法存在以下问题:
1、需要在获取当前任务运行状态过程中,进行CPU本地中断的相关操作。先备份中断状态,再关闭中断,最后恢复中断状态。导致代码流程复杂,消耗较多的CPU资源。
2、获取当前CPU的运行状态内存的内存地址,这个过程需要执行指令和访问内存,占用了CPU和内存资源。
3、从当前CPU的运行状态内存中获取当前任务信息,这个过程需要执行指令和访问内存,占用了CPU和内存资源。
发明内容
本发明的目的在于提供一种多处理器系统中当前任务的运行状态获取方法、装置、设备及存储介质,旨在解决多处理器系统中在获取当前任务的运行状态时,由于CPU和内存资源占用较高导致的多处理器系统的整体运行效率低的问题。
一方面,本发明提供一种多处理器系统中当前任务的运行状态获取方法,多处理器系统中的每个任务在创建过程中所分配到的堆栈空间的起始地址为N字节的整数倍,大小为N字节,所述方法包括下述步骤:
获取当前堆栈指针的值;
根据当前堆栈指针的值得到当前任务的运行状态信息的内存地址,基于得到的内存地址获取当前任务的运行状态信息。
优选地,所述内存地址通过将当前堆栈指针的值减去由当前堆栈指针的值对N取余得到的余数得到。
优选地,N为2的整次幂,所述内存地址通过将当前堆栈指针的值按照二进制对低N-1位清零后得到。
优选地,所述方法还包括创建新任务,所述创建新任务包括:
为新任务分配堆栈空间;
将新任务的运行状态信息初始化,并保存在分配到的堆栈空间的起始区域;
将所述起始区域以后的堆栈空间设置为预设的固定值;
将分配到的堆栈空间的末尾地址设置给堆栈指针变量,并保存到所述新任务的运行状态信息中。
优选地,所述方法还包括:
在任务切换过程中,通过所述固定值检测是否存在越界风险。
优选地,所述方法还包括挂起当前任务,所述挂起当前任务包括:
备份当前任务现场,并更新堆栈指针;
将更新后的堆栈指针的值保存到当前任务的运行状态信息中;
挂起当前任务,调度运行下一任务。
优选地,所述方法还包括调度运行下一任务,所述调度运行下一任务包括:
从就绪任务队列中获取下一任务的运行状态信息;
从获取到的运行状态信息中获取已保存的堆栈指针地址;
将获取到的堆栈指针地址设置给堆栈指针;
使用堆栈指针恢复任务现场并运行任务。
另一方面,本发明提供了一种多处理器系统中当前任务的运行状态获取装置,多处理器系统中的每个任务在创建过程中所分配到的堆栈空间的起始地址为N字节的整数倍,大小为N字节,所述装置包括:
指针获取单元,用于获取当前堆栈指针的值;以及
信息获取单元,用于根据当前堆栈指针的值得到当前任务的运行状态信息的内存地址,基于得到的内存地址获取当前任务的运行状态信息。
另一方面,本发明还提供了一种电子设备,包括存储器、多个处理器以及存储在所述存储器中并可在至少一个所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上所述方法的步骤。
另一方面,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上所述方法的步骤。
本发明多处理器系统中的每个任务在创建过程中所分配到的堆栈空间的起始地址为N字节的整数倍,大小为N字节,在获取当前任务的运行状态时,获取当前堆栈指针的值,根据当前堆栈指针的值得到当前任务的运行状态信息的内存地址,基于得到的内存地址获取当前任务的运行状态信息,从而通过对堆栈空间进行布局,将任务的状态信息和堆栈指针值联系起来,根据获取到的CPU的堆栈指针寄存器的值获取当前任务的运行状态信息,无需进行CPU本地中断的处理,也无需先获取CPU的运行状态信息,从而降低了获取当前任务的运行状态时对CPU和内存资源的占用,进而提高了多处理器系统的整体运行效率。
附图说明
图1是本发明背景技术提供的现有技术中CPU的运行状态信息的描述方式;
图2是本发明背景技术提供的现有技术中当前任务的运行状态在CPU的运行状态信息中的描述方式;
图3是本发明背景技术提供的现有技术中多处理器系统中当前任务的运行状态获取方法的实现流程图;
图4是本发明实施例一提供的多处理器系统中当前任务的运行状态获取方法的实现流程图;
图5是本发明实施例一提供的堆栈空间布局的结构示意图;
图6是本发明实施例二提供的创建新任务的实现流程图;
图7是本发明实施例三提供的挂起当前任务的实现流程图;
图8是本发明实施例四提供的调度运行下一任务的实现流程图;
图9是本发明实施例五提供的多处理器系统中当前任务的运行状态获取装置的结构示意图;以及
图10是本发明实施例六提供的电子设备的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
以下结合具体实施例对本发明的具体实现进行详细描述:
图4示出了本发明实施例一提供的多处理器系统中当前任务的运行状态获取方法的实现流程,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在步骤S401中,获取当前堆栈指针的值。
本发明实施例适用于电子设备,该电子设备包含多处理器,该电子设备的多处理器系统中的每个任务在创建过程中所分配到的堆栈空间的起始地址为N字节的整数倍,大小为N字节。其中,N为正整数。具体地,将多处理器系统中的每个任务所分配到的堆栈空间起始地址为N字节的整数倍,堆栈空间的起始区域(区域1)用于存放任务的运行状态信息,其后的区域(区域2)用于存放任务运行时的局部变量、函数返回地址等,在压栈和出栈操作时用到,堆栈指针的初始位置指向堆栈空间的末尾,若堆栈空间的初始地址用Addr1(Addr1为N字节对齐的某地址)表示,则堆栈指针的初始位置Addr2=Addr1+N,堆栈空间布局如图5所示。
在获取当前堆栈指针的值时,基于多处理器系统中每个处理器通常包含一个堆栈指针寄存器,可获取该堆栈指针寄存器的值,获取到的该堆栈指针寄存器的值即为当前堆栈指针的值。
在步骤S402中,根据当前堆栈指针的值得到当前任务的运行状态信息的内存地址,基于得到的内存地址获取当前任务的运行状态信息。
在本发明实施例中,根据堆栈空间的布局可知,只要得到堆栈指针的值,就可以通过简单的换算,很方便地得到任务的运行状态信息,从而优选地,当前任务的运行状态信息的内存地址通过将当前堆栈指针的值减去由当前堆栈指针的值对N取余得到的余数得到,从而降低了获取当前任务运行状态时对CPU和内存资源的占用,进而提高了多处理器系统的整体运行效率。当前任务的运行状态信息的内存地址的计算方式用公式可表示为:
Task_Info_Addr=SP_Addr-(SP_Addr%N)
其中,SP_Addr表示当前堆栈指针的值,Task_Info_Addr表示当前任务的运行状态信息的内存地址,SP_Addr%N表示将当前堆栈指针的值对N取余后的余数。
为了进一步提高运算效率,进一步优选地,N为2的整数次幂,当前任务的运行状态信息的内存地址通过当前堆栈指针的值按照二进制对低N-1位清零后得到,从而进而进一步提高了多处理器系统的整体运行效率。当前任务的运行状态信息的内存地址的计算方式用公式可表示为:
Task_Info_Addr=SP_Addr&~((2^N)-1),其中,SP_Addr&~((2^N)-1)表示将当前堆栈指针的值按二进制,对低(N-1)位全部清0,即该方法无需取余运算,只需通过将当前堆栈指针的值按二进制,对低(N-1)位全部清0,即可得到当前任务的运行状态信息的内存地址。
在获取到当前任务的运行状态信息之后,若确定挂起当前任务,则可参考实施例三的描述挂起当前任务,若确定当前任务执行完毕需要调度运行下一任务,则可参考实施例四的描述调度运行下一任务。
在本发明实施例中,多处理器系统中的每个任务在创建过程中所分配到的堆栈空间的起始地址为N字节的整数倍,大小为N字节,在获取当前任务的运行状态时,获取当前堆栈指针的值,根据当前堆栈指针的值得到当前任务的运行状态信息的内存地址,基于得到的内存地址获取当前任务的运行状态信息,从而通过对堆栈空间进行布局,将任务的状态信息和堆栈指针值联系起来,程序运行过程中,只要获得CPU的堆栈指针寄存器的值,就可以方便地得到当前任务的运行状态信息,无需进行CPU本地中断的处理,也无需先获取CPU的运行状态信息,从而降低了获取当前任务的运行状态时对CPU和内存资源的占用,进而提高了多处理器系统的整体运行效率。
图6示出了本发明实施例二提供的多处理器系统中创建新任务的实现流程,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在步骤S601中,为新任务分配堆栈空间;
在步骤S602中,将新任务的运行状态信息初始化,并保存在分配到的堆栈空间的起始区域;
在步骤S603中,将起始区域以后的堆栈空间设置为预设的固定值;
在步骤S604中,将分配到的堆栈空间的末尾地址设置给堆栈指针变量,并保存到该新任务的运行状态信息中。
在本发明实施例中,为新任务分配的堆栈空间的大小为N字节,堆栈空间的起始地址为N字节对齐,即起始地址为N的整数倍。具体地,在分配堆栈空间时,若堆栈空间为静态内存,则可通过编辑分散加载文件(scatter file),从全局内存空间中,预留起始地址N字节对齐,大小为N字节的内存空间;若堆栈空间为动态分配,则可调用相应的内存分配接口,分配起始地址N字节对齐,大小为N字节的内存空间。预设的固定值可由用户预先定义,例如,固定值为0x5A。在新任务创建完成后,进入就绪任务队列,等待被调度运行。
根据任务的堆栈空间布局可知,初始时堆栈指针处于区域末尾位置,当任务被调度运行后,随着程序的执行和退出,堆栈指针会在任务的堆栈空间动态地变化。由于初始化时将任务的堆栈空间全部设置为固定值,从而进一步优选地,在任务切换过程中,通过设置的固定值检测是否存在越界风险。具体地,可以通过检查与任务的运行状态信息相邻的区域是否为该固定值,来判断是否有堆栈越界的风险。
在本发明实施例中,为新任务分配堆栈空间,将新任务的运行状态信息初始化,并保存在分配到的堆栈空间的起始区域,将起始区域以后的堆栈空间设置为预设的固定值,将分配到的堆栈空间的末尾地址设置给堆栈指针变量,并保存到新任务的运行状态信息中,从而在创建新任务时为新任务的运行状态信息以后的堆栈空间设置固定值,以便于后续任务切换时检查越界风险。
图7示出了本发明实施例三提供的多处理器系统中挂起当前任务的实现流程,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在步骤S701中,备份当前任务现场,并更新堆栈指针;
在步骤S702中,将更新后的堆栈指针的值保存到当前任务的运行状态信息中;
在步骤S703中,挂起当前任务,调度运行下一任务。
在本发明实施例中,首先备份当前任务现场,备份完成后,得到更新后的堆栈指针,然后将堆栈指针的值,保存到任务运行状态信息中,最后挂起当前任务,调度运行下一任务。调度运行下一任务的具体实现方式可参考实施例四的描述。
图8示出了本发明实施例四提供的多处理器系统中调度运行下一任务的实现流程,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在步骤S801中,从就绪任务队列中获取下一任务的运行状态信息;
在步骤S802中,从获取到的运行状态信息中获取已保存的堆栈指针地址;
在步骤S803中,将获取到的堆栈指针地址设置给堆栈指针;
在步骤S804中,使用堆栈指针恢复任务现场并运行任务。
在本发明实施例中,从就绪任务队列中获取下一任务的运行状态信息,从获取到的运行状态信息中获取已保存的堆栈指针地址,然后将获取到的堆栈指针地址设置给堆栈指针,最后使用堆栈指针恢复任务现场,从而运行任务。
图9示出了本发明实施例五提供的多处理器系统中当前任务的运行状态获取装置的结构,为了便于说明,仅示出了与本发明实施例相关的部分,其中,多处理器系统中的每个任务在创建过程中所分配到的堆栈空间的起始地址为N字节的整数倍,大小为N字节,该装置包括:
指针获取单元91,用于获取当前堆栈指针的值;以及
信息获取单元92,用于根据当前堆栈指针的值得到当前任务的运行状态信息的内存地址,基于得到的内存地址获取当前任务的运行状态信息。
优选地,当前任务的运行状态信息的内存地址通过将当前堆栈指针的值减去由当前堆栈指针的值对N取余得到的余数得到。
优选地,N为2的整次幂,当前任务的运行状态信息的内存地址通过将当前堆栈指针的值按照二进制对低N-1位清零后得到。
优选地,该装置还包括:
空间分配单元,用于为新任务分配堆栈空间;
初始化单元,用于将新任务的运行状态信息初始化,并保存在分配到的堆栈空间的起始区域;
固定值设置单元,用于将起始区域以后的堆栈空间设置为预设的固定值;以及
地址保存单元,用于将分配到的堆栈空间的末尾地址设置给堆栈指针变量,并保存到新任务的运行状态信息中。
优选地,该装置还包括:
越界检测单元,用于在任务切换过程中,通过该固定值检测是否存在越界风险。
优选地,该装置包括:
任务现场备份单元,用于备份当前任务现场,并更新堆栈指针;以及
堆栈指针保存单元,用于将更新后的堆栈指针的值保存到当前任务的运行状态信息中;以及
挂起当前任务,调度运行下一任务。
优选地,该装置还包括:
下一信息获取单元,用于从就绪任务队列中获取下一任务的运行状态信息;
指针地址获取单元,用于从获取到的运行状态信息中获取已保存的堆栈指针地址;
指针地址设置单元,用于将获取到的堆栈指针地址设置给堆栈指针;以及
任务恢复运行单元,用于使用堆栈指针恢复任务现场并运行任务。
在本发明实施例中,多处理器系统中当前任务的运行状态获取装置的各单元可由相应的硬件或软件单元实现,各单元可以为独立的软、硬件单元,也可以集成为一个软、硬件单元,在此不用以限制本发明。多处理器系统中当前任务的运行状态获取装置的各单元的具体实施方式可参考前述方法实施例的描述,在此不再赘述。
图10示出了本发明实施例六提供的电子设备的结构,为了便于说明,仅示出了与本发明实施例相关的部分。
本发明实施例的电子设备10包括多个处理器100、存储器101以及存储在存储器101中并可在处理器100上运行的计算机程序102。该处理器100执行计算机程序102时实现上述各方法实施例中的步骤,例如图4所示的步骤S401至S402。或者,处理器100执行计算机程序102时实现上述各装置实施例中各单元的功能,例如图9所示单元91至92的功能。
在本发明实施例中,多处理器系统中的每个任务在创建过程中所分配到的堆栈空间的起始地址为N字节的整数倍,大小为N字节,在获取当前任务的运行状态时,获取当前堆栈指针的值,根据当前堆栈指针的值得到当前任务的运行状态信息的内存地址,基于得到的内存地址获取当前任务的运行状态信息,从而通过对堆栈空间进行布局,将任务的状态信息和堆栈指针值联系起来,根据获取到的CPU的堆栈指针寄存器的值获取当前任务的运行状态信息,无需进行CPU本地中断的处理,也无需先获取CPU的运行状态信息,从而降低了获取当前任务的运行状态时对CPU和内存资源的占用,进而提高了多处理器系统的整体运行效率。
在本发明实施例中,提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时实现上述方法实施例中的步骤,例如,图4所示的步骤S401至S402。或者,该计算机程序被处理器执行时实现上述各装置实施例中各单元的功能,例如图9所示单元91至92的功能。
在本发明实施例中,多处理器系统中的每个任务在创建过程中所分配到的堆栈空间的起始地址为N字节的整数倍,大小为N字节,在获取当前任务的运行状态时,获取当前堆栈指针的值,根据当前堆栈指针的值得到当前任务的运行状态信息的内存地址,基于得到的内存地址获取当前任务的运行状态信息,从而通过对堆栈空间进行布局,将任务的状态信息和堆栈指针值联系起来,根据获取到的CPU的堆栈指针寄存器的值获取当前任务的运行状态信息,无需进行CPU本地中断的处理,也无需先获取CPU的运行状态信息,从而降低了获取当前任务的运行状态时对CPU和内存资源的占用,进而提高了多处理器系统的整体运行效率。
本发明实施例的计算机可读存储介质可以包括能够携带计算机程序代码的任何实体或装置、记录介质,例如,ROM/RAM、磁盘、光盘、闪存等存储器。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
- 当前任务的运行状态获取方法、装置、设备及存储介质
- 网络设备运行状态的获取方法、装置、设备及介质