提高系统内存利用率的方法

文档序号:9597717阅读:3385来源:国知局
提高系统内存利用率的方法
【技术领域】
[0001]本发明涉及系统内存领域,尤其涉及一种提高系统内存利用率的方法。
【背景技术】
[0002]堆栈是内存的一个工作区,会随着程序运行的需要而增长或缩小,随着计算机水平的不断提高,软件规模越来越庞大,函数嵌套调用的层次越来越深,导致堆栈空间的波动幅度增大。如果没有启用Linux交换技术,堆栈空间中没有使用的内存就被浪费了。很多嵌入式设备使用Linux系统,而且没有启用Linux交换技术,堆栈空间中没有使用的内存就被浪费了,系统中的进程数量较多的时候,浪费的内存就更多了。

【发明内容】

[0003]针对现有技术中内存利用率较低等问题,本发明提供了一种提高系统内存利用率的方法,及时释放堆栈空间中没有使用的内存,提高Linux系统内存利用率。
[0004]本发明采用如下技术方案:
[0005]—种提高系统内存利用率的方法,应用于Linux系统中,所述方法包括:
[0006]步骤S1,缓存释放线程调用堆栈收缩函数;
[0007]步骤S2,创建新进程后,在所述新进程的数据结构中添加一定时器,并将所述定时器的到期函数设置为堆栈收缩函数;
[0008]步骤S3,当所述Linux系统的内存不足时,所述定时器开始计时;
[0009]步骤S4,在所述定时器计时期间,所述Linux系统中的所有用户进程调用所述堆栈收缩函数,以释放所有所述用户进程堆栈中的内存;
[0010]步骤S5,在所述定时器到期时,所述Linux系统的CPU执行所述堆栈收缩函数,以释放所述新进程堆栈中的内存;其中,
[0011]所述步骤S4中的所述所有用户进程不包括所述新进程。
[0012]优选的,所述方法中:
[0013]所述定时器的定时时间为1-10秒。
[0014]优选的,所述步骤S1具体包括:
[0015]步骤S11,在所述堆栈收缩函数中,增加对所述所有用户线程调用所述堆栈收缩函数的代码。
[0016]优选的,所述步骤S2具体包括:
[0017]步骤S21,在Linux进程数据结构中增加堆桟时间域,Linux内核创建所述新进程时,在所述堆栈时间域上添加所述定时器。
[0018]优选的,所述步骤S2具体包括:
[0019]步骤S22:通过add timer函数添加所述定时器。
[0020]优选的,所述方法还包括:
[0021]步骤S6:于所述步骤S5之后,所述缓存释放线程运行后,对所述所有用户进程的用户态堆栈内存情况进行检查并调用所述堆栈收缩函数,以释放所述用户态堆栈内存。
[0022]优选的,所述方法还包括:
[0023]步骤S7:于所述步骤S6之后,当堆栈指针连续N次向上穿过页边界地址时,所述CPU中断并执行所述堆栈收缩函数,以释放当前运行进程堆栈的内存;其中,
[0024]所述N为预设值,同时所述N为正整数并且大于1。
[0025]优选的,所述步骤S7具体包括:
[0026]步骤S71:在系统初始化函数trap init中,通过set trap gate函数设置所述堆栈收缩函数的封装函数为中断处理函数。
[0027]本发明的有益效果是:
[0028]本发明在进程数据结构中添加堆栈检查定时器,同时在释放堆栈中被浪费内存的堆栈收缩函数(stack shrink),即可以应对软件规模的增长、函数嵌套层次的加深而导致堆栈空间波动幅度增大,堆栈收缩技术也能及时释放堆栈中被浪费的内存,提高Linux系统内存利用率。
【附图说明】
[0029]图1为本发明提尚系统内存利用率实施例一的方法不意图;
[0030]图2为本发明提高系统内存利用率的线程收缩技术实施例二的原理图。
【具体实施方式】
[0031]需要说明的是,在不冲突的情况下,下述技术方案,技术特征之间可以相互组合。
[0032]下面结合附图对本发明的【具体实施方式】作进一步的说明:
[0033]实施例一
[0034]图1为本发明提尚系统内存利用率实施例一的方法不意图,如图1所不,本实施例为一种提高系统内存利用率的方法,涉及Linux进程用户态堆栈收缩技术,应用于Linux系统中,方法包括:
[0035]步骤S1:缓存释放线程调用堆栈收缩函数;
[0036]步骤S2:创建新进程,在新进程的数据结构中添加一定时器,定时器的到期函数设置为堆栈收缩函数;
[0037]步骤S3:当内存不足时,Linux系统中的所有用户进程调用收缩函数,以释放所有用户进程堆栈中的内存;
[0038]步骤S4:定时器到期,CPU执行堆栈收缩函数,以释放新进程堆栈中的内存;其中,
[0039]步骤S3中的所有用户进程不包括新进程。
[0040]本实施例中,在Linux系统的缓存释放线程中,增加对堆栈收缩函数的调用,在
Linux创建进程时,在进程数据结构中添加一个定时器,定时1秒,也可以是2s, 3s,......或者是10秒,此时的定时时间可以根据具体的情况进行设定,定时器到期函数设置为堆栈收缩函数,Linux内核分配内存,发现内存紧缺,对系统中所有用户进程调用堆栈收缩函数,释放所有进程堆栈中浪费的内存,这一步可以同步地释放被堆栈浪费的内存,进程定时器到期,CPU执行堆栈收缩函数,释放该进程堆栈中浪费的内存。
[0041]本发明一个较佳的实施例中,缓存释放线程开始运行,对所有进程的用户态堆栈内存浪费情况作检查,调用堆栈收缩函数,释放浪费的内存。
[0042]本发明一个较佳的实施例中,在硬件支持堆栈收缩检查的情况下,将堆栈收缩函数设置为中断处理函数,当堆栈指针连续数次向上穿过页边界地址时,中断CPU,通知CPU执行堆栈收缩函数,从而释放当前运行进程堆栈浪费的内存。
[0043]循环释放进程堆栈中被浪费的内存,堆栈收缩函数的伪代码如下所示:
[0044]Void stack_shrink (struct vm_area_struct*vma_stack)
[0045]{
[0046]Void*esp ;/*esp 堆桟指针 */
[0047]Void*tmp ;/* 用于循环 */
[0048]/*vma_stack->vm_start是堆桟空间的结束位置,
[0049]Esp是堆栈实际使用的堆栈空间的位置,
[0050]这两个位置之间的空隙就是被浪费的内存*/
[0051]For (tmp = es
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1