一种内存分配方法及装置技术领域
本发明涉及计算机技术领域,特别涉及一种内存分配方法及装置。
背景技术
在实时操作系统中,如在vxWorks操作系统中,通常采用动态内存管理机
制,操作系统将内存分配给有内存需求的任务,任务完成后,再将内存释放,
以供操作系统继续将内存分配给有内存需求的其他任务。
现有技术中,所有任务的内存申请都是平等的,操作系统维护一个内存资
源池,只要接收到内存申请,即将内存资源池中与申请的大小一致的内存块分
配给相应的任务。
这种方法存在一定的问题,如果某个任务存在不正常的内存申请导致内存
耗尽时,操作系统无法再给有内存需求的其他任务分配内存,也就是说,在这
种情况下,所有有内存需求的任务都将受到波及,进而导致操作系统崩溃,影
响操作系统的安全性和可靠性。
发明内容
本发明实施例的目的在于提供一种内存分配方法及装置,以提高操作系统
的安全性和可靠性。技术方案如下:
一种内存分配方法,包括:
接收目标任务的内存申请,其中,所述内存申请中携带所述目标任务的申
请内存大小的信息;
根据所述申请内存大小,确定分配内存大小;
确定第一内存池中是否存在满足所述分配内存大小的空闲内存块;
如果存在,则在所述第一内存池中为所述目标任务分配所述分配内存大小
的内存块;
否则,在所述目标任务的优先级高于预设的优先级阈值的情况下,在预先
保留的第二内存池中为所述目标任务分配所述分配内存大小的内存块。
在本发明的一种具体实施方式中,所述在所述第一内存池中为所述目标任
务分配所述分配内存大小的内存块,包括:
在所述第一内存池中包含多个满足所述分配内存大小的空闲内存块的情况
下,确定满足所述分配内存大小的每个空闲内存块的大小与所述分配内存大小
的差值;
识别差值最小的空闲内存块;
在识别出的空闲内存块中,将所述分配内存大小的内存块分配给所述目标
任务。
在本发明的一种具体实施方式中,所述在预先保留的第二内存池中为所述
目标任务分配所述分配内存大小的内存块,包括:
在预先保留的第二内存池中包含多个满足所述分配内存大小的内存块的情
况下,确定满足所述分配内存大小的每个空闲内存块的大小与所述分配内存大
小的差值;
识别差值最小的空闲内存块;
在识别出的空闲内存块中,将所述分配内存大小的内存块分配给所述目标
任务。
在本发明的一种具体实施方式中,在所述为所述目标任务分配所述分配内
存大小的内存块之后,所述方法还包括:
记录分配给所述目标任务的内存块的地址信息及所述目标任务的标识信息。
在本发明的一种具体实施方式中,所述地址信息包含地址边界标识信息,
所述方法还包括:
在检测到有内存释放时,识别释放的内存块的地址边界标识信息及释放内
存的目标任务的标识信息;
判断释放的内存块的地址边界标识信息与记录的所述目标任务的地址边界
标识信息是否一致;
如果不一致,则确定所述目标任务被分配的内存被改写。
一种内存分配装置,包括:
内存申请接收模块,用于接收目标任务的内存申请,其中,所述内存申请
中携带所述目标任务的申请内存大小的信息;
分配内存大小确定模块,用于根据所述申请内存大小,确定分配内存大小;
空闲内存块确定模块,用于确定第一内存池中是否存在满足所述分配内存
大小的空闲内存块,如果存在,则触发第一分配模块,否则,触发第二分配模
块;
所述第一分配模块,用于在所述第一内存池中为所述目标任务分配所述分
配内存大小的内存块;
所述第二分配模块,用于在所述目标任务的优先级高于预设的优先级阈值
的情况下,在预先保留的第二内存池中为所述目标任务分配所述分配内存大小
的内存块。
在本发明的一种具体实施方式中,所述第一分配模块,具体用于:
在所述第一内存池中包含多个满足所述分配内存大小的空闲内存块的情况
下,确定满足所述分配内存大小的每个空闲内存块的大小与所述分配内存大小
的差值;
识别差值最小的空闲内存块;
在识别出的空闲内存块中,将所述分配内存大小的内存块分配给所述目标
任务。
在本发明的一种具体实施方式中,所述第二分配模块,具体用于:
在预先保留的第二内存池中包含多个满足所述分配内存大小的内存块的情
况下,确定满足所述分配内存大小的每个空闲内存块的大小与所述分配内存大
小的差值;
识别差值最小的空闲内存块;
在识别出的空闲内存块中,将所述分配内存大小的内存块分配给所述目标
任务。
在本发明的一种具体实施方式中,所述装置还包括:
记录模块,用于在所述为所述目标任务分配所述分配内存大小的内存块之
后,记录分配给所述目标任务的内存块的地址信息及所述目标任务的标识信息。
在本发明的一种具体实施方式中,所述地址信息包含地址边界标识信息,
所述装置还包括内存改写确定模块,用于:
在检测到有内存释放时,识别释放的内存块的地址边界标识信息及释放内
存的目标任务的标识信息;
判断释放的内存块的地址边界标识信息与记录的所述目标任务的地址边界
标识信息是否一致;
如果不一致,则确定所述目标任务被分配的内存被改写。
应用本发明实施例所提供的技术方案,系统接收到目标任务的内存申请后,
可以根据申请内存大小,确定分配内存大小,然后确定第一内存池中是否存在
满足分配内存大小的内存块,如果存在,则在第一内存池中进行内存分配,如
果不存在,则在目标任务的优先级大于预设优先级阈值时,在预先保留的第二
内存池中进行内存分配。这样,当第一内存池中内存耗尽时,系统可以将预先
保留的内存分配给优先级较高的关键任务,保证系统的基本管理能力以及诊断
能力,提高系统的安全性和可靠性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施
例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述
中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付
出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中一种内存分配方法的实施流程图;
图2为本发明实施例中一种内存分配装置的结构示意图。
具体实施方式
为了使本领域技术人员更好地理解本发明实施例中的技术方案,下面将结
合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描
述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。
基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所
获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例所提供的一种内存分配方法可以应用于实时操作系统中。在
本发明实施例的描述中,将实时操作系统称为系统。当某个任务有内存需求时,
可以向系统发出内存申请,系统通过本发明实施例所提供的技术方案为该任务
分配与其申请内存大小对应的分配内存大小的内存块。
参见图1所示,为本发明实施例所提供的一种内存分配方法的实施流程图,
该方法可以包括以下步骤:
S110:接收目标任务的内存申请。
其中,所述内存申请中携带所述目标任务的申请内存大小的信息。
在本发明实施例中,目标任务可以是系统中任意一个有内存需求的任务。
目标任务可以根据自身的任务需求,确定要申请多大的内存,并向系统发出内
存申请,在内存申请中携带申请内存大小的信息。系统接收到目标任务的内存
申请后,可以继续执行步骤S120的操作。
S120:根据所述申请内存大小,确定分配内存大小。
在实际应用中,系统接收到目标任务的内存申请后,可以根据申请内存大
小,确定分配内存大小。
具体的,系统可以直接将申请内存大小确定为分配内存大小,即目标任务
要申请多少内存就为其分配多少内存。
但是,因为系统在为目标任务分配内存时,需要在分配的内存块中添加一
些维护信息,比如目标任务信息、地址边界标识信息等,这些信息需要占用一
定大小的内存,所以,系统确定的分配内存大小可以为申请内存大小加上用于
存储维护信息的内存大小,该用于存储维护信息的内存大小及在内存块中的位
置可以根据实际情况进行设置和调整,本发明实施例对此不做限制。
S130:确定第一内存池中是否存在满足所述分配内存大小的空闲内存块,
如果存在,则执行步骤S140,否则,执行步骤S150。
在本发明实施例中,第一内存池为系统在进行常规内存分配时所使用的内
存池,该第一内存池中可以包含一个或多个空闲内存块,每个空闲内存块是一
段连续的内存地址范围,各个空闲内存块的大小可能不同。第一内存池中包含
的各空闲内存块的地址空间并不连续。当系统接收到目标任务的内存申请时,
优先在该第一内存池包含的空闲内存块中为目标任务分配相应的内存块。
可以理解的是,系统要分配给目标任务的内存块需要是一个具有连续内存
地址范围的内存块,所以,对于空闲内存块而言,需要其大小大于或等于分配
内存大小。即对于第一内存池中包含的每个空闲内存块而言,如果该空闲内存
块的大小大于或等于分配内存大小,则可以认为该空闲内存块为满足分配内存
大小的内存块,系统在为目标任务分配内存时可以加以考虑,如果该空闲内存
块的大小小于分配内存大小,则可以认为该空闲内存块不是满足分配内存大小
的内存块,系统在为目标任务分配内存时不加以考虑。
系统确定出分配内存大小后,根据该分配内存大小的信息及第一内存池中
包含的空闲内存块的大小的信息,可以确定第一内存池中是否存在满足该分配
内存大小的空闲内存块。
比如,第一内存池中包含空闲内存块A、空闲内存块B、空闲内存块C和空
闲内存块D。如果空闲内存块A和空闲内存块C的大小均大于或等于分配内存大
小,则可以确定空闲内存块A和空闲内存块C为满足分配内存大小的内存块,也
即第一内存池中存在满足分配内存大小的空闲内存块。如果空闲内存块A、空闲
内存块B、空闲内存块C和空闲内存块D的大小均小于分配内存大小,则可以确
定第一内存池中不存在满足分配内存大小的空闲内存块。
如果系统确认第一内存池中存在满足分配内存大小的空闲内存块,则可以
继续执行步骤S140的操作,否则,执行步骤S150的操作。
S140:在所述第一内存池中为所述目标任务分配所述分配内存大小的内存
块。
在步骤S130,如果系统确认第一内存池中存在满足分配内存大小的空闲内
存块,则系统可以直接在第一内存池中为目标任务分配该分配内存大小的内存
块。
在实际应用中,如果第一内存池中只包含一个满足分配内存大小的空闲内
存块,则系统可以直接在该空闲内存块中截取分配内存大小的内存块,并将该
内存块分配给目标任务;如果第一内存池中包含多个满足分配内存大小的空闲
内存块,则系统可以在这多个空闲内存块中,随机或者按照预设的选取规则选
择一个空闲内存块,在该空闲内存块中截取分配内存大小的内存块,并将该内
存块分配给目标任务。
在本发明的一种具体实施方式中,步骤S140可以包括以下步骤:
步骤一:在所述第一内存池中包含多个满足所述分配内存大小的空闲内存
块的情况下,确定满足所述分配内存大小的每个空闲内存块的大小与所述分配
内存大小的差值;
步骤二:识别差值最小的空闲内存块;
步骤三:在识别出的空闲内存块中,将所述分配内存大小的内存块分配给
所述目标任务。
为便于描述,将上述三个步骤结合起来进行说明。
在第一内存池中包含多个满足分配内存大小的空闲内存块的情况下,系统
可以先确定出满足分配内存大小的每个空闲内存块的大小与分配内存大小的差
值,然后识别出差值最小的空闲内存块,从该空闲内存块中截取分配内存大小
的内存块,将该内存块分配给目标任务。
比如,第一内存池中包含空闲内存块A、空闲内存块B、空闲内存块C和空
闲内存块D。其中,空闲内存块A和空闲内存块C的大小均大于或等于目标任务
的分配内存大小,即空闲内存块A和空闲内存块C为满足分配内存大小的内存块,
且空闲内存块A的大小与分配内存大小的差值小于空闲内存块C与分配内存大小
的差值,系统可以在空闲内存块A中截取分配内存大小的内存块,将该内存块分
配给目标任务。
在本发明实施例中,为了在接收到目标任务的内存申请时提高内存块的搜
索效率,系统可以采用二叉树结构保存第一内存池中包含的空闲内存块的信息,
这样,在不牺牲内存使用效率的情况下可以提高内存管理的时间性能。
在满足分配内存大小的空闲内存块中,选择大小与申请内存大小的差值最
小的空闲内存块,并从该空闲内存块中截取分配内存大小的内存块,将该内存
块分配给目标任务,可以减少内存碎片的发生,达到内存利用的最大化。
S150:在所述目标任务的优先级高于预设的优先级阈值的情况下,在预先
保留的第二内存池中为所述目标任务分配所述分配内存大小的内存块。
在实际应用中,如果系统将所有空闲内存块均放入同一内存池中进行内存
分配,当系统中某个任务存在不正常的内存申请导致内存耗尽时,所有有内存
需求的任务都将受到波及,导致系统崩溃。所以,在本发明实施例中,在系统
建立之初,可以将可分配的内存分为两部分,第一部分内存在常规内存申请时
使用,放入第一内存池中,第二部分内存预先保留起来,在常规内存申请失败
时可以使用,放入第二内存池中。在实际设置时,可以设置第一部分内存的大
小可以大于第二部分内存的大小。
为保障系统基本的管理能力以及诊断能力,第二内存池中的空闲内存块可
以只分配给一些能够保障系统基本的管理能力及诊断能力的任务,如远程终端
协议(Telnet)任务、控制台(Console)任务等。
在实际应用中,系统可以预先设置任务属性与优先级的对应关系,比如,
设置保障系统基本的管理能力的任务属性与高优先级对应,设置保障系统的诊
断能力的任务属性与中优先级对应,设置其他任务属性与低优先级对应。优先
级的等级不局限于上述例举的几种,可以有多种,本发明实施例对此不做限制。
当系统接收到目标任务的内存申请,确定第一内存池中不存在满足分配内
存大小的空闲内存块时,可以先根据目标任务的任务属性,确定目标任务的优
先级,并在目标任务的优先级高于预设的优先级阈值的情况下,在第二内存池
中为目标任务分配该分配内存大小的内存块。
优先级阈值可以根据实际情况进行设置和调整,比如设置为低优先级,本
发明实施例对此不做限制。以优先级阈值为低优先级为例,当目标任务的优先
级高于低优先级,即目标任务的优先级为高优先级或中优先级时,系统可以在
第二内存池中为目标任务分配该分配内存大小的内存块。
在实际应用中,如果第二内存池中只包含一个满足分配内存大小的空闲内
存块,则系统需要在该空闲内存块中截取分配内存大小的内存块,并将该内存
块分配给目标任务;如果第二内存池中包含多个满足分配内存大小的空闲内存
块,则系统可以在这多个空闲内存块中,随机或者按照预设的选取规则选择一
个空闲内存块,在该空闲内存块中截取分配内存大小的内存块,并将该内存块
分配给目标任务。
在本发明的一种具体实施方式中,步骤S150可以包括以下步骤:
第一个步骤:在预先保留的第二内存池中包含多个满足所述分配内存大小
的内存块的情况下,确定满足所述分配内存大小的每个空闲内存块的大小与所
述申请内存大小的差值;
第二个步骤:识别差值最小的空闲内存块;
第三个步骤:在识别出的空闲内存块中,将所述分配内存大小的内存块分
配给所述目标任务。
为便于描述,将上述三个步骤结合起来进行说明。
在第二内存池中包含多个满足分配内存大小的空闲内存块的情况下,系统
可以先确定出满足分配内存大小的每个空闲内存块的大小与分配内存大小的差
值,然后识别出差值最小的空闲内存块,从该空闲内存块中截取分配内存大小
的内存块,将该内存块分配给目标任务。
在本发明实施例中,为了在接收到目标任务的内存申请时提高内存块的搜
索效率,系统可以采用二叉树结构保存第二内存池中包含的空闲内存块的信息,
这样,在不牺牲内存使用效率的情况下可以提高内存管理的时间性能。
在满足分配内存大小的空闲内存块中,选择大小与分配内存大小的差值最
小的空闲内存块,并从该空闲内存块中截取分配内存大小的内存块,将该内存
块分配给目标任务,可以减少内存碎片的发生,达到内存利用的最大化。
应用本发明实施例所提供的技术方案,系统接收到目标任务的内存申请后,
可以根据申请内存大小,确定分配内存大小,然后确定第一内存池中是否存在
满足分配内存大小的内存块,如果存在,则在第一内存池中进行内存分配,如
果不存在,则在目标任务的优先级大于预设优先级阈值时,在预先保留的第二
内存池中进行内存分配。这样,当第一内存池中内存耗尽时,系统可以将预先
保留的内存分配给优先级较高的关键任务,保证系统的基本管理能力以及诊断
能力,提高系统的安全性和可靠性。
在本发明的一个实施例中,在步骤S140或步骤S150为目标任务分配该分配
内存大小的内存块之后,该方法还可以包括以下步骤:
记录分配给所述目标任务的内存块的地址信息及所述目标任务的标识信息。
目标任务的标识信息可以包括目标任务的名称信息、目标任务所在文件的
文件名称信息、目标任务所在文件的行号信息等,这些信息也可称为内存申请
者信息。
在将分配内存大小的内存块分配给目标任务之后,系统可以记录目标任务
的标识信息,并将不同时刻的这些信息做比对,可以直观、准确地定位到内存
泄露的源头。从而系统开发人员可以根据该内存泄露信息,分析内存泄露产生
过程,完善系统功能。
在将分配内存大小的内存块分配给目标任务之后,系统还可以记录分配给
目标任务的内存块的地址信息,内存块的地址信息可以是内存块的起始地址信
息、终止地址信息、内存块的大小信息等,还可以是地址边界标识信息。
在实际应用中,系统将分配内存大小的内存块分配给目标任务时,可以根
据该内存块的边界在其所在内存池中的存储位置,确定该内存块的地址边界标
识信息,并记录该地址边界标识信息。在这种情况下,系统分配给不同任务的
内存块的地址边界标识信息是不同的。
系统将分配内存大小的内存块分配给目标任务时,还可以将预设的地址边
界标识信息添加到用于存储维护信息的内存中,并记录该地址边界标识信息。
针对于每一个要分配出去的内存块,系统可以设置不同的地址边界标识信息,
还可以设置相同的地址边界标识信息。相对应的,记录的每个分配出去的内存
块的地址边界标识信息可以相同可以不同。
在本发明的一个实施例中,所述地址信息包含地址边界标识信息,该方法
还可以包括以下步骤:
步骤一:在检测到有内存释放时,识别释放的内存块的地址边界标识信息
及释放内存的目标任务的标识信息;
步骤二:判断释放的内存块的地址边界标识信息与记录的所述目标任务的
地址边界标识信息是否一致,如果不一致,则执行步骤三,否则,不做处理;
步骤三:确定所述目标任务被分配的内存与其他目标任务被分配的内存重
叠。
为便于描述,将上述三个步骤结合起来进行说明。
系统在为每个目标任务分配相应的内存块时,记录了每个目标任务的标识
信息和分配给每个目标任务的内存块的地址边界标识信息。记录的地址边界标
识信息可以相同可以不同。
如果记录的不同任务的内存块的地址边界标识信息相同,则当系统检测到
有内存释放时,可以直接判断释放的内存块的地址边界标识信息与记录的该地
址边界标识信息是否一致。
如果记录的不同任务的内存块的地址边界标识信息不同,则当系统检测到
有内存释放时,可以根据识别到的释放内存的目标任务的标识信息,在记录的
信息中查找该目标任务的地址边界标识信息,并判断该地址边界标识信息与释
放的内存块的地址边界标识信息是否一致。
无论在上述哪种情况下,如果释放的内存块的地址边界标识信息与记录的
目标任务的地址边界标识信息不一致,则可以确定该目标任务被分配的内存被
改写,系统开发人员可以针对该内存被改写问题,对系统进行进一步的维护和
调整。
通过在分配内存时记录分配给目标任务的内存块的地址边界标识信息,在
内存释放时检测该地址边界标识信息是否发生变化,可以以很小代价对系统中
的踩内存问题进行监测。
相应于上面的方法实施例,本发明实施例还提供了一种内存分配装置,参
见图2所示,该装置可以包括:
内存申请接收模块210,用于接收目标任务的内存申请,其中,所述内存申
请中携带所述目标任务的申请内存大小的信息;
分配内存大小确定模块220,用于根据所述申请内存大小,确定分配内存大
小;
空闲内存块确定模块230,用于确定第一内存池中是否存在满足所述分配内
存大小的空闲内存块,如果存在,则触发第一分配模块240,否则,触发第二分
配模块250;
所述第一分配模块240,用于在所述第一内存池中为所述目标任务分配所述
分配内存大小的内存块;
所述第二分配模块250,用于在所述目标任务的优先级高于预设的优先级阈
值的情况下,在预先保留的第二内存池中为所述目标任务分配所述分配内存大
小的内存块。
应用本发明实施例所提供的装置,系统接收到目标任务的内存申请后,可
以根据申请内存大小,确定分配内存大小,然后确定第一内存池中是否存在满
足分配内存大小的内存块,如果存在,则在第一内存池中进行内存分配,如果
不存在,则在目标任务的优先级大于预设优先级阈值时,在预先保留的第二内
存池中进行内存分配。这样,当第一内存池中内存耗尽时,系统可以将预先保
留的内存分配给优先级较高的关键任务,保证系统的基本管理能力以及诊断能
力,提高系统的安全性和可靠性。
在本发明的一种具体实施方式中,所述第一分配模块240,可以具体用于:
在所述第一内存池中包含多个满足所述分配内存大小的空闲内存块的情况
下,确定满足所述分配内存大小的每个空闲内存块的大小与所述分配内存大小
的差值;
识别差值最小的空闲内存块;
在识别出的空闲内存块中,将所述分配内存大小的内存块分配给所述目标
任务。
在本发明的一种具体实施方式中,所述第二分配模块250,可以具体用于:
在预先保留的第二内存池中包含多个满足所述分配内存大小的内存块的情
况下,确定满足所述分配内存大小的每个空闲内存块的大小与所述分配内存大
小的差值;
识别差值最小的空闲内存块;
在识别出的空闲内存块中,将所述分配内存大小的内存块分配给所述目标
任务。
在本发明的一种具体实施方式中,所述装置还可以包括:
记录模块,用于在所述为所述目标任务分配所述分配内存大小的内存块之
后,记录分配给所述目标任务的内存块的地址信息及所述目标任务的标识信息。
在本发明的一种具体实施方式中,所述地址信息包含地址边界标识信息,
所述装置还可以包括内存改写确定模块,用于:
在检测到有内存释放时,识别释放的内存块的地址边界标识信息及释放内
存的目标任务的标识信息;
判断释放的内存块的地址边界标识信息与记录的所述目标任务的地址边界
标识信息是否一致;
如果不一致,则确定所述目标任务被分配的内存被改写。
在本发明的一种具体实施方式中,采用二叉树结构保存所述第一内存池中
包含的空闲内存块的信息,和/或采用二叉树结构保存所述第二内存池中包含的
空闲内存块的信息。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将
一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些
实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包
含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素
的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的
其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在
没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包
括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相
似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。
尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较
简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述方法实施方式中的全部或部分步骤
是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读
取存储介质中,这里所称得的存储介质,如:ROM/RAM、磁碟、光盘等。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在
本发明的保护范围内。