一种内存分配方法及装置的制作方法

文档序号:6603671阅读:142来源:国知局
专利名称:一种内存分配方法及装置的制作方法
技术领域
本发明涉及内存管理技术领域,特别是涉及一种内存分配方法及装置。
背景技术
内存(Memory)也被称为内存储器,其作用是用于暂时存放 CPU(CentralProcessing Unit,中央处理单元)中的运算数据,以及与硬盘等外部存储器交 换的数据。内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有 程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。在程序运行过程中,会不断地进行内存的申请及释放。现有技术中,是由操作系统 采用一定的内存分配策略向各个程序分配内存。例如,常用的分配策略包括首次拟合法、最 佳拟合法以及最差拟合法等等。但是在实际应用中,多次地向操作系统申请或释放内存,会 严重地加重系统的负担,最终导致程序的运行效率下降。

发明内容
本发明提供一种内存分配方法及装置,能够减少向操作系统申请或释放内存的次 数,减轻系统的负担,以适当的空间冗余,提升程序的运行效率。本发明提供了如下方案一种内存分配方法,包括程序启动时,向操作系统请求预置大小的内存空间;将所述内存空间划分为多个内存块,并将每个内存块划分为多个内存槽;保存各内存槽的大小及未使用内存槽的起始地址信息;当进程请求内存时,根据请求的内存大小获取符合预置条件的内存槽,并分配给 该进程。优选的,还包括保存内存槽的数目和/或重用内存槽地址信息。优选的,一个内存块中各内存槽的大小相等。优选的,所述根据请求的内存大小获取符合预置条件的内存槽,并分配给该程序 包括搜索大于所述请求的内存大小的最小内存槽;确定所述最小内存槽所在的目标内存块;在所述目标内存块中搜索可用的内存槽,将所述可用的内存槽分配给该进程。优选的,所述进程请求内存的访问模式包括有名访问,所述进程请求内存时,请求 消息中还包括名称键值;所述获取到符合预置条件的内存槽之后还包括用所述请求消息中的名称键值对所述符合预置条件的内存槽进行命名;将所述名称键值与该内存槽的地址通过哈希方法建立映射关系。优选的,还包括
对所述请求的内存空间进行管理,提供内存使用、内存泄露和/或内存跟踪信息。一种内存分配装置,包括请求单元,用于程序启动时,向操作系统请求预置大小的内存空间;预分配单元,用于将所述内存空间划分为多个内存块,并将每个内存块划分为多 个内存槽;保存单元,用于保存各内存槽的大小及未使用内存槽的起始地址信息;分配单元,用于当进程请求内存时,根据请求的内存大小获取符合预置条件的内 存槽,并分配给该进程。优选的,所述保存单元还用于保存内存槽的数目和/或重用内存槽地址信息。优选的,一个内存块中各内存槽的大小相等。优选的,所述分配单元包括内存槽搜索子单元,用于搜索大于所述请求的内存大小的最小内存槽;内存块确定子单元,用于确定所述最小内存槽所在的目标内存块;内存槽分配子单元,用于在所述目标内存块中搜索可用的内存槽,将所述可用的 内存槽分配给该进程。优选的,所述进程请求内存的访问模式包括有名访问,所述进程请求内存时,请求 消息中还包括名称键值;还包括命名单元,用于所述获取到符合预置条件的内存槽之后,用所述请求消息中的名 称键值对所述符合预置条件的内存槽进行命名;映射单元,用于将所述名称键值与该内存槽的地址通过哈希方法建立映射关系。优选的,还包括内存管理单元,用于对所述请求的内存空间进行管理,提供内存使用、内存泄露和 /或内存跟踪信息。根据本发明提供的具体实施例,本发明公开了以下技术效果本发明在程序启动时,向操作系统申请大的内存空间;然后可以对该内存空间进 行预分配,即将所述内存空间划分为多个内存块,并将每个内存块划分为多个内存槽;保存 各内存槽的大小及未使用内存槽的起始地址信息;当有进程申请内存时,根据申请的内存 大小获取符合预置条件的内存槽,并分配给该程序。这样,相当于实现了进程对内存的自行 分配,即只需要在启动时向操作系统申请一块内存空间,在进行运行过程中,需要申请或释 放内存时,都可以不再需要向操作系统发起请求,而是直接由进程进行分配,因此,能够减 少向操作系统申请或释放内存的次数,减轻系统的负担。其次,由于对内存进行了预分配,以内存槽为单位向进程进行内存的分配,因此, 在向进程分配内存的过程中,不会产生内存碎片,可以提高处理效率,相当于以适当的空间 冗余,提升程序的运行效率。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所 需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施 例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1是本发明实施例提供的方法的流程图;图2是本发明实施例进行内存预分配的示意图;图3是本发明实施例提供的装置的示意图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的 范围。参见图1,本发明实施例提供的内存分配方法包括以下步骤S101 程序启动时,向操作系统申请预置大小的内存空间;需要说明的是,现有技术中,一个程序在开始运行之后,当前需要多大的内存就向 操作系统申请多大的内存,操作系统根据当前的内存占用情况,选择相应的内存空间给该 进程。但是,在本发明实施例中,在程序开始运行之后,首先会向操作系统申请一块大的 内存空间,该内存空间大于当前所需的内存。具体的,该足够大的内存空间可以是根据预先 根据具体的应用场景设定的阈值来确定的,在程序的初始化过程中,就可以将该阈值传递 进来,并按照该阈值向操作系统进行申请内存空间。S102 将所述内存空间划分为多个内存块,并将每个内存块划分为多个内存槽;本发明实施例相当于存在一个对内存进行预分配的过程,即在申请到相对较大的 内存空间之后,首先将其划分为多个内存块,然后再将每个内存块划分为多个内存槽。也就 是说,在程序进行具体的内存请求之前已经对申请到的内存空间进行了划分。其中,各个内存块的大小可以不同,但为了便于进行分配,一个内存块中划分的各 个内存槽的大小可以是相等的。例如,具体的划分可以如图2所示。这里需要说明的是,现有技术中可能也存在内存块的概念,但是与本发明实施例 中的内存块的形成过程是不同的,为避免造成混淆,同时,为了说明现有技术中内存碎片的 概念,这里进行简要地说明。由前文所述,本发明实施例中,内存块是在对内存空间进行预分配时产生的,与具 体的内存请求无关。但是,在现有技术中,并没有对内存进行预分配的过程,操作系统在接 收到某内存请求时,根据请求的内存大小以及内存的占用情况进行分配。假设进程A请求 的内存大小是10M,则操作系统会在内存中选择同样为10M的内存空间分配给该进程,此 时,操作系统选择的这10M的内存空间被称为一个内存块a,当进程A将这10M的内存释放 之后,该内存块a就成为空闲的内存空间,即该内存块a可以分配给其他的进程。例如某进 程B请求的内存大小为8M,此时根据内存分配策略,就可能会从该内存块a中选择8M的内 存分配给进程B。此时原内存块a中还有2M的内存空闲(假设该过程中原内存块a的相邻 内存空间均一直被占用),这些空闲的内存空间由于比较小,就可能会称为内存碎片,即无 法满足进程对内存大小的需求,使得这部分空间无法被任何进程利用。显然,如果不采用一 定的碎片处理策略,则随着不断地内存申请及释放,将会产生非常多的内存碎片;如果对内存碎片进行处理,则将会耗费系统的性能。总之,现有技术中,操作系统给进程分配的内存大小与进程请求的内存大小相同, 即进程请求多少内存,操作系统就给该进程分配多少内存,在多次的请求与释放过程中,就 可能产生很多的内存碎片;并且系统的内存也会被分为一个个的内存块,每个内存块的大 小及占用状态也可能在不断地变化,使得内存的分配过程显得非常繁琐。以首次拟合法为 例,操作系统每次为进程选择内存时,都需要从第一个内存块开始向后进行搜索,直到找到 大于当前请求大小的内存块,从该内存块中取出与请求大小相等的内存,分配给该进程。S103 保存各内存槽的大小及未使用内存槽的起始地址信息;当然,还可以保存内存槽的数目,和/或,当发生内存槽重用时,还可以保存重用 内存槽地址等信息。S104:当所述进程请求内存时,根据请求的内存大小获取符合预置条件的内存槽, 并分配给该进程。当一个进程请求内存时,会携带有需要的内存大小的信息,在本发明实施例中,并 不是为进程选择恰好与请求的大小相等的内存,而是根据请求的内存大小,选择符合预置 条件的内存槽。其中,具体的条件可以根据实际需要进行设置,这里不做限定。例如,可以 选择大于用户请求的内存大小的最小内存槽;换言之,当某进程请求内存时,意味着有数据 需要存放在内存中,因此,请求的内存大小取决于需要存放的数据的大小,从这个意义上而 言,本发明实施例在选择内存槽时,相当于是选择可以放下请求数据的最小内存槽,然后将 该内存槽分配给该进程即可。其中,如果一个内存块中划分的各个内存槽的大小相等,则具体在进行内存槽的 选择与分配时可以采用如下步骤进行步骤一搜索大于所述请求的内存大小的最小内存槽;由于每个内存块的大小不等,但是一个内存块中划分的各个内存槽的大小相等, 因此,可以首先根据内存槽的大小进行搜索。当然,也可能没有符合该条件的内存槽,此时,说明请求的内存大小超出了范围。步骤二 确定所述最小内存槽所在的目标内存块;搜索到大于所述请求的内存大小的最小内存槽之后,则可以找到这种大小的内存 槽所在的内存块,该内存块就可以作为目标内存块,即可以在该内存块中搜索尚未分配的、 可用的内存槽。步骤三在所述目标内存块中搜索可用的内存槽,将所述可用的内存槽分配给该 程序。当然,可能存在该内存块中的所有内存槽都已经被占用的情况,在搜索时将无法 找到可用的内存槽。此时,可以对该内存块进行扩展,然后将新扩展出的内存槽分配给进程 使用。也就是说,在本发明实施例中,内存槽是预先划分好的,在进行内存分配时也是按 内存槽进行分配,而进程请求的内存大小是不确定的,因此,在分配时,为了不过多地浪费 内存,可以选择一个大于进程请求的内存大小、又最接近该进程请求的内存大小的内存槽。从以上所述还可以看出,在本发明实施例中,为进程分配的内存大小,大于进程请 求的内存大小,也就是每次分配时允许有一定的冗余。这样做的好处在于,不会产生内存碎片,每次分配内存时,只需要根据请求的内存大小搜索符合条件的内存槽即可,因此可以提
高处理效率。需要说明的是,本发明实施例中,只有在程序启动时,向操作系统发起一次内存请 求,后续在进程运行过程中,都不需要再向操作系统请求内存,相当于实现了进程对内存的 自行分配与管理,因此,可以减少向操作系统请求或释放内存的次数,减轻操作系统的负 担。另外,在本发明实施例中,进程访问内存时,可以采用匿名或者有名的方式。其中, 在有名访问方式下,相当于给内存槽加了人类熟悉的名称,从而可以加强进程对内存的访 问及管理。具体实现时,如果需要以有名访问的方式访问内存,则可以在请求内存时,在请 求消息中携带名称键值(该名称可以是任意的);在找到符合条件的内存槽之后,可以用请 求消息中的名称键值对该符合预置条件的内存槽进行命名,并且将所述名称键值与该内存 槽的地址通过哈希方法建立映射关系,这样,通过内存槽的名称键值就可以搜索到内存槽, 直接进行访问即可。总之,通过以上所述可以看出,本发明实施例能够提高内存分配及管理的效率,并 减轻操作系统的负担。此外,由于实现了进程对内存的自行分配,因此还可以提供进程对内存进行管理 的接口,通过该接口,可以提供内存使用报考、内存泄露、内存跟踪等功能。与本发明实施例提供的内存分配方法相对应,本发明实施例还提供了一种内存分 配装置,参见图3,该装置包括请求单元301,用于程序启动时,向操作系统请求预置大小的内存空间;预分配单元302,用于将所述内存空间划分为多个内存块,并将每个内存块划分为 多个内存槽;保存单元303,用于保存各内存槽的大小及未使用内存槽的起始地址信息;分配单元304,用于当进程请求内存时,根据请求的内存大小获取符合预置条件的 内存槽,并分配给该进程。其中,保存单元303还可以用于保存内存槽的数目和/或重用内存槽地址信息。为了便于进行内存槽的分配,在进行预分配时,一个内存块中各内存槽的大小可 以是相等的。相应的,分配单元304可以包括以下子单元内存槽搜索子单元,用于搜索大于所述请求的内存大小的最小内存槽;内存块确定子单元,用于确定所述最小内存槽所在的目标内存块;内存槽分配子单元,用于在所述目标内存块中搜索可用的内存槽,将所述可用的 内存槽分配给该进程。其中,所述进程请求内存的访问模式包括有名访问,所述进程请求内存时,请求消 息中还包括名称键值;相应的,该装置还可以包括命名单元,用于所述获取到符合预置条件的内存槽之后,用所述请求消息中的名 称键值对所述符合预置条件的内存槽进行命名;映射单元,用于将所述名称键值与该内存槽的地址通过哈希方法建立映射关系。此外,由于实现了进程对内存的自行分配,因此,在此基础上,还可以实现进程对内存的管理,具体的,该装置还可以包括内存管理单元,用于对所述请求的内存空间进行管理,提供内存使用、内存泄露和 /或内存跟踪信息。总之,通过本发明实施例提供的内存分配装置,在程序启动时,向操作系统申请足 够大的内存空间;然后可以对该内存空间进行预分配,即将所述内存空间划分为多个内存 块,并将每个内存块划分为多个内存槽;保存各内存槽的大小及未使用内存槽的起始地址 信息;当有进程申请内存时,根据申请的内存大小获取符合预置条件的内存槽,并分配给该 程序。这样,相当于实现了进程对内存的自行分配,即只需要在启动时向操作系统申请一块 内存空间,在进行运行过程中,需要申请或释放内存时,都可以不再需要向操作系统发起请 求,而是直接由进程进行分配,因此,能够减少向操作系统申请或释放内存的次数,减轻系 统的负担,并且以适当的空间冗余,提升程序的运行效率。以上对本发明所提供的一种内存分配方法及装置,进行了详细介绍,本文中应用 了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解 本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具 体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明 的限制。
权利要求
一种内存分配方法,其特征在于,包括程序启动时,向操作系统请求预置大小的内存空间;将所述内存空间划分为多个内存块,并将每个内存块划分为多个内存槽;保存各内存槽的大小及未使用内存槽的起始地址信息;当进程请求内存时,根据请求的内存大小获取符合预置条件的内存槽,并分配给该进程。
2.根据权利要求1所述的方法,其特征在于,还包括 保存内存槽的数目和/或重用内存槽地址信息。
3.根据权利要求1所述的方法,其特征在于,一个内存块中各内存槽的大小相等。
4.根据权利要求3所述的方法,其特征在于,所述根据请求的内存大小获取符合预置 条件的内存槽,并分配给该程序包括搜索大于所述请求的内存大小的最小内存槽; 确定所述最小内存槽所在的目标内存块;在所述目标内存块中搜索可用的内存槽,将所述可用的内存槽分配给该进程。
5.根据权利要求1所述的方法,其特征在于,所述进程请求内存的访问模式包括有名 访问,所述进程请求内存时,请求消息中还包括名称键值;所述获取到符合预置条件的内存 槽之后还包括用所述请求消息中的名称键值对所述符合预置条件的内存槽进行命名; 将所述名称键值与该内存槽的地址通过哈希方法建立映射关系。
6.根据权利要求1所述的方法,其特征在于,还包括对所述请求的内存空间进行管理,提供内存使用、内存泄露和/或内存跟踪信息。
7.—种内存分配装置,其特征在于,包括请求单元,用于程序启动时,向操作系统请求预置大小的内存空间; 预分配单元,用于将所述内存空间划分为多个内存块,并将每个内存块划分为多个内 存槽;保存单元,用于保存各内存槽的大小及未使用内存槽的起始地址信息; 分配单元,用于当进程请求内存时,根据请求的内存大小获取符合预置条件的内存槽, 并分配给该进程。
8.根据权利要求7所述的装置,其特征在于,所述保存单元还用于保存内存槽的数目 和/或重用内存槽地址信息。
9.根据权利要求7所述的装置,其特征在于,一个内存块中各内存槽的大小相等。
10.根据权利要求9所述的装置,其特征在于,所述分配单元包括内存槽搜索子单元,用于搜索大于所述请求的内存大小的最小内存槽; 内存块确定子单元,用于确定所述最小内存槽所在的目标内存块; 内存槽分配子单元,用于在所述目标内存块中搜索可用的内存槽,将所述可用的内存 槽分配给该进程。
11.根据权利要求7所述的装置,其特征在于,所述进程请求内存的访问模式包括有名 访问,所述进程请求内存时,请求消息中还包括名称键值;还包括命名单元,用于所述获取到符合预置条件的内存槽之后,用所述请求消息中的名称键值对所述符合预置条件的内存槽进行命名;映射单元,用于将所述名称键值与该内存槽的地址通过哈希方法建立映射关系。
12.根据权利要求7所述的装置,其特征在于,还包括内存管理单元,用于对所述请求的内存空间进行管理,提供内存使用、内存泄露和/或 内存跟踪信息。
全文摘要
本发明公开了一种内存分配方法及装置,其中,所述方法包括程序启动时,向操作系统请求预置大小的内存空间;将所述内存空间划分为多个内存块,并将每个内存块划分为多个内存槽;保存各内存槽的大小及未使用内存槽的起始地址信息;当进程请求内存时,根据请求的内存大小获取符合预置条件的内存槽,并分配给该进程。通过本发明,能够减少向操作系统申请或释放内存的次数,减轻系统的负担,以适当的空间冗余,提升程序的运行效率。
文档编号G06F12/06GK101853215SQ20101019336
公开日2010年10月6日 申请日期2010年6月1日 优先权日2010年6月1日
发明者宋仁春, 田欢春 申请人:恒生电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1