具体实施方式
本发明实施例为应用系统中的各模块设置内存分配控制参数,使得不会一个模块出现内存泄漏或者受到攻击时,消耗掉整个应用系统的内存,引起整个系统崩溃。
下面结合附图对本发明实施例进行详细描述。
本实施例中,分别为应用系统中的各模块设置内存分配控制参数,内存分配控制参数用于对相应模块的内存分配控制。内存分配控制参数至少包括相应模块的内存使用上限max_mem_size,该参数可以byte(字节)为单位。
一个模块的max_mem_size的取值,可遵循以下原则之一或任意组合:
(1)一个模块的max_mem_size取值要大于该模块极端情况下的内存使用量最大值。
(2)max_mem_size的值可以根据分析来设置,比如某个模块的功能主要是保存数据,每条数据占用内存最大1K byte,系统规格保存10K条数据,再考虑到运行过程中的其他内存使用,这个模块的max_mem_size设为30M比较合适。
(3)对于内存占用比较多,但是分配不到内存不会引起系统异常的模块,可将该模块的max_mem_size设置比较大,或者不做限制。
(4)对于分配不到内存就会影响整个系统,而且可能会占用内存较多的模块,可在max_mem_size缺省值的基础上进行调整。比如,网络设备中,对于板间通信的模块,需要将max_mem_size设置得比缺省值大。
在具体实施时,可为各模块设置缺省max_mem_size,然后根据以上原则之一或组合,对缺省设置的max_mem_size进行调整。也可以根据实际应用过程中收集到的该模块已申请的内存的最大值进行设置,比如,可以先不限制模块的max_mem_size(即对该模块可申请的内存量不做限制),然后模拟该模块使用内存的极端情况,记录该模块内存使用量的最大值,然后将该内存使用量的最大值乘以一个系数作为该模块的max_mem_size值。
基于以上内存分配控制参数进行内存分配控制的操作可由应用系统中的内存管理系统执行。当某个模块(如模块1)需要申请内存时,模块1向内存管理系统请求申请内存;内存管理系统获取为该模块设置的max_mem_size,并将该max_mem_size与模块1当前的内存使用量current_mem_size进行比较,若current_mem_size>max_mem_size,则表明该模块可用的内存已经达到上限,此种情况下内存管理系统拒绝为该模块分配内存,并可进一步给出相应的提示信息,返回分配失败;若current_mem_size≤max_mem_size,内存管理系统为模块1分配内存,进一步的根据为模块1分配的内存大小,更新该模块当前的内存使用量current_mem_size。
通过以上描述可以看出,当某个模块受到攻击或者出现内存泄漏的时候,能够通过max_mem_size对该模块的内存分配进行限制,保证该模块不会将整个系统的内存耗尽,而影响系统其他模块的正常运行。当怀疑某个模块对内存不足的情况保护不足的时候,能够将该模块的max_mem_size设置较低,从而很快模拟内存不足的情况,还能通过逐个模块设置max_mem_size的方式,找出具体哪个模块有保护不足的情况。
在本发明的另一实施例中,为模块设置的内存控制参数中除了max_mem_size,还可包括系统内存高门限global_mem_gate_high,该参数可以byte为单位,当整个系统内存使用量超过global_mem_gate_high的时候,内存管理系统将不再为这个模块分配内存。
一个模块的global_mem_gate_high的取值,可遵循以下原则:根据该模块在系统中的重要程度进行设置,重要程度越高,这个值就越大。具体的,如果某个模块分配不到内存,仅仅是部分功能暂时不可用,这个值可以设的低一些;如果某个模块比较重要但内存占用不多(比如命令行模块),则可提高这个参数值来保证该模块内存分配的高优先级;如果分配不到内存会影响整个系统,而且可能会占用内存较多,则可将这个参数值设置得比缺省值大;如果某个模块分配不到内存会引起整个系统瘫痪,则可不对这个值进行限制。
模块1申请内存时,内存管理系统获取到模块1的current_mem_size和global_mem_gate_high之后,若判断current_mem_size>max_mem_size,或者global_current_mem_size>系统当前内存使用量global_mem_gate_high,则拒绝为模块1分配内存;否则,为模块1分配内存。
通过以上描述可以看出,在根据max_mem_size进行内存分配控制的基础上,进一步根据global_mem_gate_high进行内存分配控制,使得内存分配更为合理,并进一步降低内存泄露对应用系统的影响。
在本发明的另一实施例中,为模块设置的内存控制参数中除了max_mem_size、global_mem_gate_high,还可包括系统内存低门限global_mem_gate_low,该参数可以byte为单位,当整个系统内存达到过global_mem_gate_high限后,系统内存降到低于global_mem_gate_low之后,才继续为该模块分配内存。此外,内存管理系统还为该模块设置一变量over_high_gate,用来记录该模块的内存分配状态,例如,当系统使用的内存超过global_mem_gate_high的时候,且该模块试图申请过内存,将该变量置位(如将该变量赋值为1)。
一个模块的global_mem_gate_low的取值,可遵循以下原则:根据该模块在系统中的重要程度进行设置,重要程度越高,这个值就越大,而且global_mem_gate_high≥global_mem_gate_low。具体的,如果某个模块分配不到内存,仅仅是部分功能暂时不可用,这个值可以设的低一些;如果某个模块比较重要但内存占用不多(比如命令行模块),则可提高这个参数值来保证该模块内存分配的高优先级;如果分配不到内存会影响整个系统,而且可能会占用内存较多,则可将这个参数值设置得比缺省值大;如果某个模块分配不到内存会引起整个系统瘫痪,则需要不对这个值进行限制。
模块1申请内存时,内存管理系统获取到模块1的current_mem_size、global_mem_gate_high和global_mem_gate_low之后,若判断满足以下条件之一,则拒绝为模块1分配内存:
current_mem_size>max_mem_size;
global_current_mem_size>global_mem_gate_high;
over_high_gat=1且global_current_mem_size>global_mem_gate_low;
若判断满足以下条件,则为模块1分配内存:
current_mem_size≤max_mem_size;
global_current_mem_size≤global_mem_gate_high;
over_high_gat=0或global_current_mem_size≤global_mem_gate_low。
通过以上描述可以看出,当内存消耗较多的时候,某个模块受到攻击,可以通过global_mem_gate_low和global_mem_gate_high的差值减少系统内存的压力。
下面结合本发明的优选实施例,进一步对本发明进行描述。
在本发明的优选实施例中,为应用系统中的各模块进行如下定义:
struct tag_module_attr
{
unsigned long module_id;//定义模块的唯一标识module_id
unsigned long current_mem_size;//定义用于记录该模块当前使用的内存大小的变量current_mem_size
unsigned long over_high_gate;//定义用于记录该模块的内存分配状态的变量over_high_gate
unsigned long max_mem_size;//定义该模块允许使用的内存上限
unsigned long global_mem_gate_high;//定义该模块的系统内存高门限
unsigned long global_mem_gate_low;//定义该模块的系统内存低门限
……
};
上述参数的含义以及设置原则和设置方法,与前述实施例相同,比如:max_mem_size为系统可用内存的10%,global_mem_gate_high为系统可用内存的95%,global_mem_gate_low为系统可用内存的92%。例如,对于一个可用内存为512M的系统,max_mem_size缺省为50M,global_mem_gate_high为486M,global_mem_gate_low为471M。不做特殊调整的模块,内存参数按照缺省值进行设置。
再比如:
内存占用比较多,但是分不到内存不会引起系统异常的模块,将max_mem_size设置比较大,或者不做限制;比如对于网络设备中的路由模块,不修改缺省的global_mem_gate_high和global_mem_gate_low;
对于比较重要但内存占用不多的模块,比如命令行模块,通过提高内存门限来保证模块内存分配的高优先级,如将global_mem_gate_high设为100%,global_mem_gate_low设为99%,这样对于一个可用内存512M的系统,global_mem_gate_high实际为512M,global_mem_gate_low实际为507M,这样,当系统中内存所剩无几的时候,可以让其它模块停止申请内存,对于命令行这种重要的模块,还能继续分配内存,继续正常运转;
对于内存分配不到会影响整个系统,而且可能会占用内存较多的模块,这些内存参数需要在缺省值的基础上进行调整,比如网络设备中,对于实现板间通信的模块,将max_mem_size、global_mem_gate_high和global_mem_gate_low都设得比缺省值大。
当某个模块申请内存时,其流程可如图1所示,包括:
步骤101,根据申请内存的模块的module_id(即模块标识),找到系统中记录的为该模块设置的内存分配控制参数。
步骤102,读取max_mem_size,并比较current_mem_size和max_mem_size;若max_mem_size!=0,而且current_mem_size>max_mem_size,则表明该模块可用的内存已经达到上限,转入步骤103;否则转入步骤104。其中,若max_mem_size=0,则表明对该模块的内存使用上限不做限制。
步骤103,给出相应的提示信息,返回分配失败。
步骤104,读取global_mem_gate_high,并比较global_mem_gate_high和global_current_mem_size;若global_mem_gate_high!=0,而且global_current_mem_size>global_mem_gate_high,则系统已经没有内存给该模块使用,转入步骤105,否则转入步骤106。其中,若global_mem_gate_high=0,则表明对该参数不做限制。
步骤105,设置over_high_gate=1,给出相应的提示信息,返回分配失败。
步骤106,读取over_high_gate,并比较global_current_mem_size和global_mem_gate_low;若over_high_gate=1,而且global_current_mem_size>global_mem_gate_low,则表明系统还不能给该模块分配内存,转入步骤107,否则转入步骤108。
步骤107,给出相应的提示信息,返回分配失败。
步骤108,将over_high_gate设置为0,为该模块分配内存,将新分配的内存大小计入current_mem_size和global_current_mem_size,将分配的内存地址返回给该模块。
当某个模块释放内存时,其流程可如图2所示,包括:
步骤201,根据请求释放内存的模块的module_id,找到系统中记录的该模块的内存信息;
步骤202,根据内存信息头中记录的内存大小,将释放的内存大小从current_mem_size和global_current_mem_size中减掉;
步骤203,释放这部分内存;
步骤204~205,如果该模块的global_current_mem_size<=global_mem_gate_low,则将over_high_gate设置为0。
由于应用系统使用的环境和要求千变万化,用户可能需要根据实际情况修改内存参数的设置。本发明实施例允许用户根据需要对模块的内存分配控制参数进行修改或重新设置。在对模块的内存分配控制参数进行修护或重新设置的时候,需要保证global_mem_gate_low<=global_mem_gate_high。
下面分别分析一下修改max_mem_size、global_mem_gate_high和global_mem_gate_low三种参数的过程和影响。
(1)修改max_mem_size
修改max_mem_size后,若max_mem_size<current_mem_size,则下次为该模块分配内存的时候,图1所示流程中的第一个判断步骤的判断结果为否,直接返回分配失败。
修改后max_mem_size,若max_mem_size>=current_mem_size,则下次为该模块分配内存的时候,图1所示流程中的第一个判断步骤的判断结果为是,进入到后续流程。
释放内存的时候,max_mem_size不影响流程。
(2)修改global_mem_gate_high
修改global_mem_gate_high后,若global_mem_gate_high<global_current_mem_size,则下次为该模块分配内存的时候,图1所示流程中的第二个判断步骤的判断结果为否,会设置over_high_gate,并返回分配失败。
修改global_mem_gate_high后,若global_mem_gate_high>=global_current_mem_size,则下次为该模块分配内存的时候,图1所示流程中的第二个判断步骤的判断结果为是,会进入到后续流程。
释放内存的时候,global_mem_gate_high不影响流程。
(3)修改global_mem_gate_low
修改global_mem_gate_low后,若over_high_gate=0,则下次为该模块分配内存的时候,图1所示流程中的第三个判断步骤的判断结果为是,进入后续流程,分配内存。
修改global_mem_gate_low后,若global_mem_gate_low<global_current_mem_size,此时如果over_high_gate=1,则下次为该模块分配内存的时候,图1所示流程中的第三个判断步骤的判断结果为否,返回分配失败。
修改global_mem_gate_low后,若global_mem_gate_low>=global_current_mem_size,则下次为该模块分配内存的时候,图1所示流程中的第三个判断步骤的判断结果为是,进入到后续流程,分配内存。
下次释放内存的时候,会将over_high_gate设为0。
需要说明的是,本发明实施例所涉及的应用系统可包括软件方式实现的应用系统,也可包括软硬件结合方式实现的应用系统。
本发明实施例既可适用于嵌入式系统,也可适用于非嵌入式系统。当应用于嵌入式系统时,可将内存分配管理前移到为模块分配内存时,而不仅仅跟踪记录内存分配和使用情况;当应用于非嵌入式系统时,可避免复杂的对进程进行调度切换的过程,降低系统开销。
综上所述,本发明实施例当系统资源消耗较大,大部分模块申请不到内存的时候,能够保证重要的模块申请到内存,系统重要的功能还能运转。
基于相同的技术构思,本申请实施例还提供了一种内存管理系统。
参见图3,为本发明实施例提供的内存管理系统的结构示意图,该系统可包括参数设置单元301、内存分配单元302,还可进一步包括内存回收单元303,其中:参数设置单元301,用于根据应用系统中的各模块所需内存和重要程度,分别为应用系统中的各模块设置内存分配控制参数;内存分配单元302,用于当接收到模块申请内存的请求时,获取为所述模块设置的内存分配控制参数,并根据获取到的内存分配控制参数以及当前内存的使用情况,对所述模块进行内存分配控制;内存回收单元303用于在模块释放内存时回收模块释放的内存。
具体的,参数设置单元301所设置的内存分配控制参数包括内存使用上限。相应的,内存分配单元302在进行内存分配时,比较所述模块的内存使用上限与所述模块当前使用的内存大小,若前者小于后者,则拒绝为所述模块分配内存。进一步的,参数设置单元301在为模块设置内存使用上限时:对于内存占用多,但是分配不到内存不会引起应用系统异常的模块,将该模块的内存使用上限设置为高于缺省值;对于分配不到内存就会影响应用系统,而且占用内存多的模块,将该模块的内存使用上限设置为高于缺省值。
具体的,参数设置单元301所设置的内存分配控制参数包括该模块的内存使用上限和系统内存高门限。相应的,内存分配单元302在进行内存分配时,比较所述模块的内存使用上限与所述模块当前使用的内存大小,比较所述模块的系统内存高门限与应用系统当前使用的内存大小;若所述模块的内存使用上限小于所述模块当前使用的内存大小,或者所述模块的系统内存高门限小于应用系统当前使用的内存大小,则拒绝为所述模块分配内存。进一步的,参数设置单元301为模块设置系统内存高门限时:对于分配不到内存会导致部分功能不可用的模块,将该模块的系统内存高门限设置为低于缺省值;或者,对于内存占用不多但执行重要功能的模块,将该模块的系统内存高门限设置为高于缺省值;或者,对于分配不到内存会影响应用系统运行的模块,将该模块的系统内存高门限设置为高于缺省值。
具体的,参数设置单元301所设置的内存分配控制参数还包括系统内存低门限,一个模块的系统内存低门限不大于该模块的系统内存高门限。相应的,内存分配单元301还用于:当接收到模块申请内存的请求时,若因所述模块的系统内存使用上限小于应用系统当前使用的内存大小而被拒绝分配内存,则将该模块的内存分配状态标志置位;内存分配单元301在进行内存分配时,若所述模块的系统内存使用上限不小于应用系统当前使用的内存大小,则获取所述模块的内存分配状态标志,并比较所述模块的系统内存低门限与应用系统当前使用的内存大小,若所述内存分配状态标志被置位,并且所述模块的系统内存低门限小于应用系统当前使用的内存大小,则拒绝为所述模块分配内存。进一步的,参数设置单元301为模块设置系统内存低门限时:对于分配不到内存会导致部分功能不可用的模块,将该模块的系统内存低门限设置为低于缺省值;或者,对于内存占用不多但执行重要功能的模块,将该模块的系统内存低门限设置为高于缺省值;或者,对于分配不到内存会影响应用系统运行的模块,将该模块的系统内存低门限设置为高于缺省值。
具体的,当模块释放占用的内存时,内存回收单元303比较所述模块的系统内存低门限与应用系统当前使用的内存大小,若前者不小于后者,则取消对所述模块的内存分配状态标志的置位。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台终端设备(可以是手机,个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。