一种动态堆栈内存管理方法和装置与流程

文档序号:12464269阅读:239来源:国知局
一种动态堆栈内存管理方法和装置与流程

本发明涉及嵌入式系统技术领域,尤其涉及一种动态堆栈内存管理方法和装置。



背景技术:

堆栈是高级编程语言的基础设施,是函数运行的基础。

当今的CPU(Central Processing Unit,中央处理器)设计都提供了对堆栈的支持,比如,intel处理器就是通过sp(stack pointer,堆栈指针)寄存器来实现堆栈功能的。CPU一般可同时支持多个任务进程,每个任务进程各自独立运行,需提供相应的堆栈用于该任务进程存储数据。对于每个任务进程,在执行过程中,通常都会涉及到多个函数的调用关系。例如常见的APP客户端软件,主界面函数首先被启动运行,当用户操作进行某个子功能界面时就由主界面函数调用对应的子功能界面的函数运行。在用户退出子功能界面而返回主界面时,其对应函数也退出。

函数调用过程对堆栈的使用方式如下,如图5所示,以intel平台下,函数a调用函数b,函数b又调用函数c的情形,来说明堆栈的变化过程:函数a运行时堆栈指针sp处在位置a;函数a调用函数b之后,堆栈指针sp向下移动到了位置b;函数b调用函数c之后,堆栈指针sp向下移动到了位置c;函数c退出后,堆栈指针sp向上移动到了位置b;函数b退出后,堆栈指针sp向上移动到了位置a。

由图5可知,随着函数调用层次的加深,堆栈指针sp不断向下移动,即堆栈空间也随着增大;随着函数不断地退出,堆栈指针sp不断向上移动。虽然函数已经不再运行,但曾经分配给该函数的堆栈空间并没有释放。也就是说,堆栈空间只增不减,堆栈空间与堆栈指针并不同步,不能真实地反映程序实际使用的堆栈大小,这就导致在没有交换功能、不能把内存备份到硬盘的嵌入式系统中,堆栈空间中无效的内存被浪费。



技术实现要素:

为解决相关技术问题,本发明提供一种动态堆栈内存管理方法和装置,以及时释放被浪费的内存,提高嵌入式系统内存利用率。

为实现上述目的,本发明实施例采用如下技术方案:

第一方面,本发明实施例提供了一种动态堆栈内存管理方法,所述方法包括:

确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存;

如果所述空闲内存大于预置阈值,则释放所述堆栈指针位置至所述堆栈空间顶部位置之间的内存页;

将所述堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。

第二方面,本发明实施例还对应提供了一种动态堆栈内存管理装置,所述装置包括:

空闲内存确定模块,用于确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存;

内存页释放模块,用于如果所述空闲内存大于预置阈值,则释放所述堆栈指针位置至所述堆栈空间顶部位置之间的内存页;

重置模块,用于将所述堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。

本发明实施例提供的技术方案带来的有益效果:

本技术方案中,确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存;如果空闲内存大于预置阈值,则释放堆栈指针位置至堆栈空间顶部位置之间的内存页;将堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。本技术方案中,通过释放堆栈指针位置至堆栈空间顶部位置之间的内存页,来达到堆栈指针和堆栈空间的同步,可以及时释放浪费的内存,提高嵌入式系统内存的利用率。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对本发明实施例描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据本发明实施例的内容和这些附图获得其他的附图。

图1是本发明实施例一提供的一种动态堆栈内存管理方法的流程示意图;

图2A是本发明实施例二提供的一种动态堆栈内存管理方法的流程示意图;

图2B是图2A中S220的可选实施方式的流程示意图;

图3是本发明实施例三提供的一种动态堆栈内存管理装置的架构示意图;

图4A是本发明实施例四提供的一种动态堆栈内存管理装置的架构示意图;

图4B是图4A中空闲内存确定模块420的可选实施方式的架构示意图;

图5是现有技术中系统调用函数时,堆栈的变化示意图。

具体实施方式

为使本发明解决的技术问题、采用的技术方案和达到的技术效果更加清楚,下面将结合附图对本发明实施例的技术方案作进一步的详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一

请参考图1,其是本发明实施例一提供的一种动态堆栈内存管理方法的流程示意图。本实施例的方法可以由路由器、交换机等装有嵌入式操作系统的设备来执行,适用于系统为任务进程的分配堆栈进行内存管理的场景。

本实施例的动态堆栈内存管理方法,可以包括如下内容:

S110:确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存。

示例性的,堆栈是一个用户空间的内存区域,系统为各任务进程分配对应的堆栈空间进行数据的临时存储。随着任务程序的运行,堆栈指针是动态变化的。在某个检测时刻,获取当前正在运行的任务的堆栈空间的堆栈指针位置和堆栈空间顶部位置,根据这两个位置对应的地址值即可确定两个位置之间的空闲内存的大小。

S120:如果空闲内存大于预置阈值,则释放堆栈指针位置至堆栈空间顶部位置之间的内存页。

示例性的,为便于管理内存,系统是以内存页为单位对内存进行管理的,系统中单个内存页的大小是固定的,例如,一个内存页的大小可以为4kb。判断S110中确定的空闲内存的大小是否大于预置阈值,如果大于则认为堆栈指针位置至堆栈空间顶部位置之间的空闲内存过大,例如,取预置阈值为1个内存页的大小4kb,即堆栈指针位置至堆栈空间顶部位置之间的空闲内存超过一个内存页的大小,则将堆栈指针位置至堆栈空间顶部位置之间的内存页释放。

需要说明的是,由于系统是以内存页为单位来管理内存,因此不能实现将两个位置间的全部空闲内存释放,仅能释放两个位置之间的内存页。例如,如果确定两个位置之间的空闲内存的大小为7kb,则只能释放两个位置之间的1个内存页,即释放4kb的内存;再例如,如果确定两个位置之间的空闲内存的大小为15kb,则只能释放两个位置之间的3个内存页,即释放12kb的内存。当然,在其他实施例中,也可以将上述预置阈值设置为2个内存页的大小,或其他大小的值。

S130:将堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。

示例性的,在释放掉堆栈指针位置至堆栈空间顶部位置之间的内存页后,为使得堆栈指针与堆栈空间保持同步,需要将堆栈指针位置所处内存页的起始位置重置为堆栈空间顶部位置。

综上,在本技术方案中,确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存,如果空闲内存大于预置阈值,则释放堆栈指针位置至堆栈空间顶部位置之间的内存页,将堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。通过释放堆栈指针位置至堆栈空间顶部位置之间的内存页,来达到堆栈指针和堆栈空间的同步,可以及时释放浪费的内存,提高嵌入式系统内存的利用率。

实施例二

请参考图2A,其是本发明实施例二提供的一种动态堆栈内存管理方法的流程示意图。本实施例与实施例一的主要区别在于,增加了为正在运行的所有任务建立任务链表,并设置任务指针,指向至少一个任务,作为当前任务的内容,增加了S220确定的空闲内存不大于预置阈值时的内容,增加了循环遍历检测的内容,并进一步提供了图2A中S220的可选实施方式。

本实施例的动态堆栈内存管理方法,可以包括如下内容:

S210:为正在运行的所有任务建立任务链表,并设置任务指针,指向至少一个任务,作为当前任务。

示例性的,一般的,系统是在多个任务进程之间交替选择运行,因此有必要为多个正在运行的任务进程建立任务链表,并设置任务指针,通过指针指向链表中的任务,以此识别出当前需要运行的任务,即指定当前任务。

S220:确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存。

可选的,如图2B所示,S220可以包括S221和S222两个步骤,其中:

S221:每隔预置时长获取当前任务的堆栈空间的堆栈指针位置和堆栈空间顶部位置。

示例性的,随着系统不断地运行任务程序,堆栈空间也是动态变化,因此需要定时执行检测操作。由于系统自带有中断模块,例如,系统中每隔0.1秒执行中断操作,变更当前执行的任务程序。对于检测动态堆栈空间的空闲内存,无需像系统执行中断操作那么频繁,因此可以每隔合理的预置时长进行检测,例如,以中断周期的16倍也即1.6秒作为上述预置时长,即在当前任务结束之前,每隔1.6秒周期性地获取当前任务的堆栈空间的堆栈指针位置和堆栈空间顶部位置。

S222:计算堆栈指针位置至堆栈空间顶部位置之间的空闲内存。

示例性的,根据获得的栈指针位置和堆栈空间顶部位置所对应的两个地址值,即可计算出两个位置之间的空闲内存。

S230:判断空闲内存是否大于预置阈值。

示例性的,根据不同的判断结果,相应地跳转至下述S240a或S240b。

S240a:如果空闲内存大于预置阈值,则释放堆栈指针位置至堆栈空间顶部位置之间的内存页。

S250:将堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。

S260:将任务指针设置为任务链表中的下一个任务,以将下一个任务更新为当前任务。

示例性的,重置堆栈空间顶部位置表示系统对当前任务的检测已经暂时结束,接下来系统将针对其他要运行的任务程序进行检测。将任务指针设置为任务链表中的下一个任务,表示将下一个任务更新为当前任务,并跳转至S220,执行空闲内存的确定操作,如此可遍历检测任务链表中全部任务程序,保证系统中所有任务都会被执行堆栈指针和堆栈空间同步。

S240b:如果空闲内存不大于预置阈值,则将任务指针设置为任务链表中的下一个任务,以将下一个任务更新为当前任务。

示例性的,如果空闲内存不大于预置阈值,则说明当前任务的堆栈空间没有浪费内存,因此将任务指针指向任务链表中的下一个任务作为当前任务,系统针对更新后的当前任务进行检测,即再跳转至上S220,执行空闲内存的确定操作。

综上,在本技术方案中,通过建立任务链表,设置任务指针,以任务指针的指向来确定当前任务;通过释放堆栈指针位置至堆栈空间顶部位置之间的内存页,来达到当前任务的堆栈指针和堆栈空间的同步,可以及时释放浪费的内存,提高嵌入式系统内存的利用率;通过改变任务指针的指向,来更新需要检测的当前任务,实现对系统的全部任务进行遍历检测,尽可能地提高嵌入式系统内存的利用率。

以下是本发明实施例提供的一种动态堆栈内存管理装置的实施例,动态堆栈内存管理装置与上述动态堆栈内存管理方法属于同一个发明构思,在动态堆栈内存管理装置实施例中未详尽描述的细节内容,请参考上述动态堆栈内存管理方法的实施例。

实施例三

请参考图3,其是本发明实施例三提供的一种动态堆栈内存管理装置的架构示意图。

本实施例的,动态堆栈内存管理装置300,可以包括如下内容:

空闲内存确定模块310,用于确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存。

内存页释放模块320,用于如果空闲内存大于预置阈值,则释放堆栈指针位置至堆栈空间顶部位置之间的内存页。

重置模块330,用于将堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。

综上,在本技术方案中,确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存,如果空闲内存大于预置阈值,则释放堆栈指针位置至堆栈空间顶部位置之间的内存页,将堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。通过释放堆栈指针位置至堆栈空间顶部位置之间的内存页,来达到堆栈指针和堆栈空间的同步,可以及时释放浪费的内存,提高嵌入式系统内存的利用率。

实施例四

请参考图4A,其是本发明实施例四提供的一种动态堆栈内存管理装置的架构示意图。本实施例与实施例三的主要区别在于,增加了任务链表建立模块410、循环遍历模块430b和当前任务更新模块450。

本实施例的动态堆栈内存管理装置400,可以包括如下内容:

任务链表建立模块410,用于为正在运行的所有任务建立任务链表,并设置任务指针,指向至少一个任务,作为当前任务。

空闲内存确定模块420,用于确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存。

内存页释放模块430a,用于如果空闲内存大于预置阈值,则释放堆栈指针位置至堆栈空间顶部位置之间的内存页。

重置模块440,用于将堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。

当前任务更新模块450,用于将任务指针设置为任务链表中的下一个任务,以将下一个任务更新为当前任务,并返回空闲内存确定模块420。

循环遍历模块430b,用于如果空闲内存不大于预置阈值,则将任务指针设置为任务链表中的下一个任务,以将下一个任务更新为当前任务,并返回空闲内存确定模块420。

可选的,请参考图4B,其是图4A中空闲内存确定模块420的可选实施方式的架构示意图。空闲内存确定模块420可以包括位置获取单元421和空闲内存计算单元422,其中:

位置获取单元421,用于每隔预置时长获取当前任务的堆栈空间的堆栈指针位置和堆栈空间顶部位置。

空闲内存计算单元422,用于计算堆栈指针位置至堆栈空间顶部位置之间的空闲内存。

综上,在本技术方案中,通过建立任务链表,设置任务指针,以任务指针的指向来确定当前任务;通过释放堆栈指针位置至堆栈空间顶部位置之间的内存页,来达到当前任务的堆栈指针和堆栈空间的同步,可以及时释放浪费的内存,提高嵌入式系统内存的利用率;通过改变任务指针的指向,来更新需要检测的当前任务,实现对系统的全部任务进行遍历检测,尽可能地提高嵌入式系统内存的利用率。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1