一种动态堆栈内存管理方法和装置制造方法及图纸

技术编号:15541677 阅读:67 留言:0更新日期:2017-06-05 10:58
本发明专利技术实施例公开了一种动态堆栈内存管理方法和装置。动态堆栈内存管理方法,包括:确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存,如果空闲内存大于预置阈值,则释放堆栈指针位置至堆栈空间顶部位置之间的内存页,将堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。在本发明专利技术实施例的技术方案中,通过释放堆栈指针位置至堆栈空间顶部位置之间的内存页,来达到堆栈指针和堆栈空间的同步,可以及时释放浪费的内存,提高嵌入式系统内存的利用率。

Dynamic stack memory management method and device

The embodiment of the invention discloses a dynamic stack memory management method and device. The stack includes dynamic memory management method, determine the stack pointer to the stack space position between the top position of the current task stack space free memory, if free memory is greater than the preset threshold, the release between the stack pointer position to the top of the stack memory page, the stack pointer location starting position reset memory page for stack space top position. In the technical scheme of the embodiment of the invention, the stack pointer between the release position to the top position of the stack memory page, synchronization to achieve the stack pointer and the stack space, timely release the waste of memory, improve the utilization rate of the embedded system memory.

【技术实现步骤摘要】
一种动态堆栈内存管理方法和装置
本专利技术涉及嵌入式系统
,尤其涉及一种动态堆栈内存管理方法和装置。
技术介绍
堆栈是高级编程语言的基础设施,是函数运行的基础。当今的CPU(CentralProcessingUnit,中央处理器)设计都提供了对堆栈的支持,比如,intel处理器就是通过sp(stackpointer,堆栈指针)寄存器来实现堆栈功能的。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,其是本专利技术实施例二提供的一种动态堆栈内存管理方法的流程示意图。本实施例与实施例一的主要区别在于,增加了为正在运行的所有任务建立任务链表,并设置任务指针,指向至少一个任务,作为当前本文档来自技高网
...
一种动态堆栈内存管理方法和装置

【技术保护点】
一种动态堆栈内存管理方法,其特征在于,所述方法包括:确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存;如果所述空闲内存大于预置阈值,则释放所述堆栈指针位置至所述堆栈空间顶部位置之间的内存页;将所述堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。

【技术特征摘要】
1.一种动态堆栈内存管理方法,其特征在于,所述方法包括:确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存;如果所述空闲内存大于预置阈值,则释放所述堆栈指针位置至所述堆栈空间顶部位置之间的内存页;将所述堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置。2.如权利要求1所述的方法,其特征在于,所述确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存,包括:每隔预置时长获取所述当前任务的堆栈空间的堆栈指针位置和堆栈空间顶部位置;计算所述堆栈指针位置至所述堆栈空间顶部位置之间的空闲内存。3.如权利要求1或2所述的方法,其特征在于,所述确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存之前,还包括:为正在运行的所有任务建立任务链表,并设置任务指针,指向至少一个任务,作为当前任务。4.如权利要求3所述的方法,其特征在于,所述将所述堆栈指针位置所在内存页的起始位置重置为堆栈空间顶部位置之后,还包括:将所述任务指针设置为所述任务链表中的下一个任务,以将下一个任务更新为当前任务,并返回执行空闲内存的确定操作。5.如权利要求4所述的方法,其特征在于,所述确定当前任务的堆栈空间的堆栈指针位置至堆栈空间顶部位置之间的空闲内存之后,还包括:如果所述空闲内存不大于所述预置阈值,则将所述任务指针设置为所述任务链表中的下一个任务,以将下一个...

【专利技术属性】
技术研发人员:李小庆
申请(专利权)人:深圳创维数字技术有限公司
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1