内存管理方法及装置与流程

文档序号:11829484阅读:195来源:国知局
内存管理方法及装置与流程

本发明涉及内存领域,具体而言,涉及内存管理方法及装置。



背景技术:

申请号为200910079057,发明名称为内存管理方法的专利,公开了一种内存管理方法,其方法是把内存区域划分为托干内存分区和若干单元内存块。

不足之处是:内存单元大小和数量在任务启动的时候就已经确定,在实际使用过程中不够灵活。实际表现为:当频繁申请了某一个固定长度内存超过之前预定义的最大值时,则会占用更大长度的内存单元,这就会造成浪费。如果申请的小长度内存的数量超过了其所有长度单元的内存数量的总和时,内存分配则会失败。

在现有技术中内存单元大小和数量固定而导致在分配内存时存在不足。



技术实现要素:

本发明提供了内存管理方法及装置,以至少解决现有技术中内存单元大小和数量固定而导致在分配内存时存在的不足。

根据本发明的一个方面,提供了一种内存管理方法,包括:接收内存申请,其中,所述内存申请用于申请第一容量的内存;从第一内存池中分配一片第一内存,其中,所述第一内存池管理预定单元长度的内存,所述预定单元长度大于所述第一容量;所述第一内存池是根据总内存的容量划分的至少一个内存池中的其中之一,不同的内存池管理不同单元长度的内存;从所述第一内存中切割出够所述内存申请使用的内存,将所述第一内存中剩余的内存加入到对应的内存池中。

进一步地,从所述第一内存中切割出够所述内存申请使用的内存包括:从所述第一内存分割出第二容量的内存供使用,并填写内存管理头信息,其中,第二容量为第一容量以及对应的所述内存管理头信息的容量和。

进一步地,所述内存管理头信息包括以下至少之一:记录该内存的长度、记录前一个切割节点内存的管理头指针、记录用于检验该内存节点的信息、前 一个相邻内存块头部信息地址指针。

进一步地,所述方法还包括:释放申请的所述内存,其中,释放申请的所述内存包括:从所述内存管理信息获取该段内存的长度以及该段内存相邻内存的管理头指针;设置该段内存的未使用标志位;获取相邻节点内存的管理头信息,如果该内存也是未使用的则与相邻的内存进行合并,更新内存管理头信息中的长度;如果相邻节点的内存为已使用,则不合并,直接将该段内存添加到所属的内存池未使用链表。

进一步地,根据总内存的容量划分内存池包括:内存池的划分以N的倍数为基数,其中,N为自然数。

根据本发明的另一个方面,还提供给了一种内存管理装置,包括:接收模块,用于接收内存申请,其中,所述内存申请用于申请第一容量的内存;分配模块,用于从第一内存池中分配一片第一内存,其中,所述第一内存池管理预定单元长度的内存,所述预定单元长度大于所述第一容量;所述第一内存池是根据总内存的容量划分的至少一个内存池中的其中之一,不同的内存池管理不同单元长度的内存;分割模块,用于从所述第一内存中切割出够所述内存申请使用的内存,将所述第一内存中剩余的内存加入到对应的内存池中。

进一步地,所述分割模块,用于从所述第一内存分割出第二容量的内存供使用,并填写内存管理头信息,其中,第二容量为第一容量以及对应的所述内存管理头信息的容量和。

进一步地,所述内存管理头信息包括以下至少之一:记录该内存的长度、记录前一个切割节点内存的管理头指针、记录用于检验该内存节点的信息、前一个相邻内存块头部信息地址指针。

进一步地,还包括:释放模块,其中,所述释放模块包括:获取单元,用于从所述内存管理信息获取该段内存的长度以及该段内存相邻内存的管理头指针;设置单元,用于设置该段内存的未使用标志位;处理单元,用于获取相邻节点内存的管理头信息,如果该内存也是未使用的则与相邻的内存进行合并,更新内存管理头信息中的长度;如果相邻节点的内存为已使用,则不合并,直接将该段内存添加到所属的内存池未使用链表。

进一步地,内存池的划分以N的倍数为基数,其中,N为自然数。

通过本发明,采用接收内存申请,其中,所述内存申请用于申请第一容量 的内存;从第一内存池中分配一片第一内存,其中,所述第一内存池管理预定单元长度的内存,所述预定单元长度大于所述第一容量;所述第一内存池是根据总内存的容量划分的至少一个内存池中的其中之一,不同的内存池管理不同单元长度的内存;从所述第一内存中切割出够所述内存申请使用的内存,将所述第一内存中剩余的内存加入到对应的内存池中,解决现有技术中内存单元大小和数量固定而导致在分配内存时存在的不足,从而提高了内存使用效率。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的内存管理方法的流程图;

图2是根据本发明实施例内存申请时内存切割示意图;

图3是根据本发明实施例的内存释放时内存块合并的示意图;

图4是根据本发明实施例的10M受管理内存分布示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例;需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

在本实施例中,提供了一种内存管理方法,图1是根据本发明实施例的内存管理方法的流程图,如图1所示,该方法包括如下步骤:

步骤S102,接收内存申请,其中,内存申请用于申请第一容量的内存;

步骤S104,从第一内存池中分配一片第一内存,其中,第一内存池管理预定单元长度的内存,预定单元长度大于第一容量;第一内存池是根据总内存的容量划分的至少一个内存池中的其中之一,不同的内存池管理不同单元长度的内存。内存池的划分可以有多种方式,例如,内存池的划分可以以N的倍数 为基数,其中,N为自然数。

步骤S106,从第一内存中切割出够内存申请使用的内存,将第一内存中剩余的内存加入到对应的内存池中。

通过上述步骤,内存基本长度可变,解决了现有技术中内存单元大小和数量固定而导致在分配内存时存在的不足,提高了内存资源利用率,减少了操作系统内存碎片的产生量。

在一个可选实施例中,还可以增加内存管理头信息,此时,从第一内存中切割出够内存申请使用的内存包括:从第一内存分割出第二容量的内存供使用,并填写内存管理头信息,其中,第二容量为第一容量以及对应的内存管理头信息的容量和。

可选地,内存管理头信息包括以下至少之一:记录该内存的长度、记录前一个切割节点内存的管理头指针、记录用于检验该内存节点的信息、前一个相邻内存块头部信息地址指针。内存管理头信息中的内容可以根据需要设置。

在一个可选实施例中,还可以释放申请的内存。例如,从内存管理信息获取该段内存的长度以及该段内存相邻内存的管理头指针;设置该段内存的未使用标志位;获取相邻节点内存的管理头信息,如果该内存也是未使用的则与相邻的内存进行合并,更新内存管理头信息中的长度;如果相邻节点的内存为已使用,则不合并,直接将该段内存添加到所属的内存池未使用链表。

在本实施例中还提供给了一种内存管理装置,包括:接收模块,用于接收内存申请,其中,内存申请用于申请第一容量的内存;分配模块,用于从第一内存池中分配一片第一内存,其中,第一内存池管理预定单元长度的内存,预定单元长度大于第一容量;第一内存池是根据总内存的容量划分的至少一个内存池中的其中之一,不同的内存池管理不同单元长度的内存;分割模块,用于从第一内存中切割出够内存申请使用的内存,将第一内存中剩余的内存加入到对应的内存池中。

在一个可选实施例中,分割模块用于从第一内存分割出第二容量的内存供使用,并填写内存管理头信息,其中,第二容量为第一容量以及对应的内存管理头信息的容量和。

在一个可选实施例中,内存管理头信息包括以下至少之一:记录该内存的长度、记录前一个切割节点内存的管理头指针、记录用于检验该内存节点的信 息、前一个相邻内存块头部信息地址指针。

在一个可选实施例中,该装置还包括:释放模块,其中,释放模块包括:获取单元,用于从内存管理信息获取该段内存的长度以及该段内存相邻内存的管理头指针;设置单元,用于设置该段内存的未使用标志位;处理单元,用于获取相邻节点内存的管理头信息,如果该内存也是未使用的则与相邻的内存进行合并,更新内存管理头信息中的长度;如果相邻节点的内存为已使用,则不合并,直接将该段内存添加到所属的内存池未使用链表。

下面结合优选实施例进行说明,在本优选实施例中,提供一种可跟踪调试的内存管理装置和方法。在本优选实施例中,在任务初始化时向操作系统申请一定容量的内存区域。当需要提供内存需求时,从该大容量的内存区域切割出来一片比所需内存需求稍大的内存供其使用。释放内存时,根据释放内存的标记信息,对内存进行释放,并合并相邻的未使用的内存块。下面对此进行说明。

1、在内存管理池初始化时,向操作系统申请一大片内存,并将该片内存的基本信息保存到内存管理信息头中。

(a)按照内存的长度,将内存划分为至少一个内存管理池。每个内存池的管理节点保存以下信息:当前池的内存长度,当前池的未分配链表

(b)内存池的划分以4的倍数为基数。如分配4个内存池,则第一个内存池的的单元长度为64,第二个内存池长度为64*4=256,第三个内存池长度为1024,第四个内存池长度为4096

(c)每个块内存的管理信息头保存以下基本信息:内存长度,分配内存地址,前一个相邻内存块头部信息地址指针。

2、申请内存时,根据申请内存长度,确定选择内存池。

(a)如果是申请长度为128的内存,根据计算得出从256的内存池中获取一块未分配的内存块,把这个内存块的管理信息从256的未使用内存链表中删除。

(b)把这个内存块切割为长度为102的内存块1和长度为154的内存块2。

(c)设置内存块1的内存管理头并加入到长度为64的内存池中未使用链表

(d)如果256的内存池的未使用链表没有可用内存块,则从1024的内存池中未使用链表获取,如果1024的内存池中的未使用链表中也没有,则从4096 的内存池中未使用链表获取;如果4096的内存池中的未使用链表中也没有,则需要从操作系统中申请一大块(长度为4096*4=16384)内存,初始化后加入到4096的内存池中未使用链表中。

(e)然后将这个内存块进行切割,切割成长度为16230和154的两块内存,把长度为16230的内存加入到4096的内存池中未使用的链表中。

3、填充分配好的内存的管理信息:

(a)记录该内存的长度

(b)记录前一个切割节点内存的管理头指针

(c)记录该内存节点用于校验的信息。

4、释放内存时,进行以下操作:

(a)从管理头获取以下信息:该段内存的长度、该段内存相邻节点内存的管理头指针。

(b)首先设置该段内存的未使用标志位

(c)获取相邻节点内存的管理头信息,如果该内存也是未使用的,则与相邻的内存进行合并。更新内存管理头信息中的长度。

(d)如果相邻节点的内存为已使用,则不合并,直接将该段内存添加的所属的内存池中未使用链表。

下面结合几个附图进行说明。

图2是根据本发明实施例内存申请时内存切割示意图,如图2所示,申请长度为64B的内存,从长度为1024的内存池中获取一个未分配的内存节点,可用长度为4072B(实际长度为4096B)的内存a。从长度为4072B的内存块尾部分离出一个长度为88B的内存b。设置内存b的管理头信息:设置其可用长度为64B;设置为已用的标志;设置前一个相邻节点的指针为内存a;将该内存b加入到长度为64的内存池已用链表中;设置内存b的尾部校验信息。更新内存a的管理头信息:设置可用长度为3984B;更新内存a的尾部校验信息。

图3是根据本发明实施例的内存释放时内存块合并的示意图,如图3所示,释放内存长度为512B的内存a。查询到其相邻节点的内存b为未使用状态,进行合并操作。更新内存b的管理头信息:设置可用长度为4520B;可用内存为4520B比其当前所在内存池的长度要大,所以把内存b从长度为1024内存 池的未使用链表中删除,添加到长度为4096内存池的未使用链表中。

图4是根据本发明实施例的10M受管理内存分布示意图,如图4所示,箭头的意思是地址连续相连的首尾相接。

上述优选实施例,内存基本长度可变、内存资源利用率高、减少了操作系统内存碎片的产生量,可以检测内存发生的错误和引起错误的代码行,统计了内存的使用状况。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1