[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=esr;tmp>vma_stack->vm_start;tmp-=4KB){
[0052] Free(tmp);/*释放浪费的内存页*/
[0053] }
[0054] }
[0055] 在进程数据结构中添加一个定时器,定时时间一秒,到期函数为堆栈收缩函数(stack_shrink)的代码为:
[0056] Struct task_struct{
[0057] Struct timer_list stack_check;
[0058] };
[0059] shrink_cache函数是缓存释放线程要调用的函数,在该函数中对所有进程调用stack_shrink函数代码为:
[0060] static void shrink_cache()
[0061] {
[0062] /*对系统中的每个进程的堆栈运行stack_shrink函数*/
[0063] For(遍历系统中的每个进程){
[0064] Stack_shrink();
[0065] }
[0066] }
[0067] 实施例二
[0068] 图2为本发明提高系统内存利用率的线程收缩技术实施例二的原理图,如图2所示,首先,缓存释放线程会调用shrink_cache函数,在该函数中增加对所有进程调用堆栈收缩函数的代码;在Linux进程数据结构中增加struct timer_list stack_check域,Linux内核创建进程时,通过add_timer函数在该域上添加一个定时器,到期函数设置为堆栈收缩函数,定时时间为1秒;内核代码分配内存,发现内存不足时,调用堆栈收缩函数;struct timer_list stack_check定时器到期,CPU执行堆栈收缩函数;CPU调度缓存释放线程,执行到shrink_cache函数时,CPU可以对所有进程的堆栈执行内存浪费情况检查;如果CPU支持堆栈收缩检查,在系统初始化函数trap_init中通过set_trap_gate函数设置堆栈收缩函数的封装函数为中断处理函数,当堆栈指针连续数次向上穿过页边界地址时,中断CPU,通知CPU执行堆栈收缩函数,从而释放当前运行进程堆栈浪费的内存。
[0069] 综上所述,本发明在进程数据结构中添加堆栈检查定时器,同时在释放堆栈中被浪费内存的堆栈收缩函数(stack shrink),即可以应对软件规模的增长、函数嵌套层次的加深而导致堆栈空间波动幅度增大,堆栈收缩技术也能及时释放堆栈中被浪费的内存,提高Linux系统内存利用率。
[0070] 通过说明和附图,给出了具体实施方式的特定结构的典型实施例,基于本发明精神,还可作其他的转换。尽管上述发明提出了现有的较佳实施例,然而,这些内容并不作为局限。
[0071] 对于本领域的技术人员而言,阅读上述说明后,各种变化和修正无疑将显而易见。因此,所附的权利要求书应看作是涵盖本发明的真实意图和范围的全部变化和修正。在权利要求书范围内任何和所有等价的范围与内容,都应认为仍属本发明的意图和范围内。