一种数据处理方法及装置与流程

文档序号:17475691发布日期:2019-04-20 06:06阅读:149来源:国知局
一种数据处理方法及装置与流程

本发明涉及计算机技术领域,尤其涉及一种数据处理方法及装置。



背景技术:

内存泄漏(memoryleak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,进而导致程序运行速度减慢甚至系统崩溃等严重后果。

随着计算机应用需求的日益增加,应用程序的设计与开发也相应的日趋复杂,开发人员在程序实现的过程中处理的变量也大量增加;此外,随着应用类型的日益增加,内存管理也越来越重要,如何有效进行内存分配和释放,防止内存泄漏的问题变得越来越突出。



技术实现要素:

本发明提供一种数据处理方法及装置,以解决现有内存管理技术容易出现内存泄漏的问题。

根据本发明的第一方面,提供一种数据处理方法,包括:

划分多个不同类型的内存区域;其中,不同类型的内存区域用于存储不同类型的数据,任一类型的内存区域包括预设数量的内存分片,同一类型的内存区域中各内存分片大小相同;

基于所述多个不同类型的内存区域响应针对不同类型的内存区域的内存分片申请请求和释放请求。

根据本发明的第二方面,提供一种数据处理装置,包括:

划分单元,用于划分多个不同类型的内存区域;其中,不同类型的内存区域用于存储不同类型的数据,任一类型的内存区域包括预设数量的内存分片,同一类型的内存区域中各内存分片大小相同;

处理单元,用于基于所述多个不同类型的内存区域响应针对不同类型的内存区域的内存分片申请请求和释放请求。

应用本发明公开的技术方案,通过划分多个不同类型的内存区域,各不同类型的内存区域用于存储不同类型的数据,任一类型的内存区域包括预设数量的相同大小的内存分片,当不同类型的数据需要进行内存申请和释放时,以内存分片作为最小内存单元进行内存空间的分配和释放,优化了内存空间管理,降低了内存泄漏的概率。

附图说明

图1是本发明实施例提供的一种数据处理方法的流程示意图;

图2是本发明实施例提供的一种内存区域划分的示意图;

图3a是本发明实施例提供的一种单个buf申请和释放的示意图;

图3b是本发明实施例提供的一种批量buf申请和释放的示意图;

图4是本发明实施例提供的一种数据处理装置的结构示意图;

图5是本发明实施例提供的另一种数据处理装置的结构示意图;

图6是本发明实施例提供的另一种数据处理装置的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明实施例中技术方案作进一步详细的说明。

请参见图1,为本发明实施例提供的一种数据处理方法的流程示意图,其中,该数据处理方法可以应用于以ssd(solidstatedisk,固态硬盘)为存储介质的网络设备,如图1所示,该数据处理方法可以包括以下步骤:

步骤101、划分多个不同类型的内存区域,其中,该多个不同类型的内存区域用于存储不同类型的数据,任一类型的内存区域包括预设数量的内存分片,同一类型的内存区域中各内存分片大小相同。

本发明实施例中,考虑到现有使用malloc、recalloc、calloc、free等函数直接对内存进行申请或释放操作的实现方式中,分配的内存的大小和位置随机性过大,且各种不同类型数据分配的内存空间相互混杂,不利于内存空间管理,容易导致内存泄漏的发生,因此,为了优化内存空间管理,减少内存泄漏的发生,可以在网络设备的内存空间划分多个不同类型的内存区域,该多个不同类型的内存区域可以用于存储不同类型的数据,任一类型的内存区域包括预设数量的内存分片,进而,可以以内存分片为最小内存单元进行内存申请和释放。

其中,同一类型内存区域中各内存分片大小相同;不同类型内存区域内存分片大小可以相同,也可以不同。

举例来说,可以预先配置需要使用的内存区域的类型、各类型内存区域下内存分片的大小、各类型内存区域下内存分片的数量等。在系统初始化时,可以根据上述配置对内存空间进行初始化,实现内存区域的划分。

其中,各类型内存区域下内存分片的数量可以根据对应类型数据的存储需求(可以由管理人员根据经验证确定)确定,以保证为各类型数据预留足够的内存空间。

可选地,上述多个不同类型的内存区域可以包括但不限于用于存储指令的内存区域、用于存储boot(引导)信息的内存区域、用于存储cpu(centerprocessunit,中央处理单元)运行信息的内存区域、用于存储指令状态的内存区域、用于存储系统中垃圾回收信息的内存区域、用于存储错误信息的内存区域、用于存储临时数据的内存区域、用于存储plane(平面)状态的内存区域、用于存储block(区块)状态的存储区域以及用于存储die(核心)状态的存储区域等。

在本发明其中一个实施例中,上述划分多个不同类型的内存区域,可以包括:

将一段连续的内存空间划分为多个不同类型的内存区域;

其中,上述多个不同类型的内存区域的首地址满足以下条件:

basetypei+1=basetypei+sizetypei

其中,1≤i≤n-1,n为不同类型的内存区域的数量,basetypei为多个不同类型的内存区域中第i个内存区域的首地址,sizetypei为该第i个内存区域所占的内存空间大小。

在该实施例中,为了便于内存空间管理,可以将一段连续的内存空间划分为多个不同类型的内存区域。

其中,多个不同类型的内存区域在该连续内存空间中的顺序可以随机或者按照其它策略确定,本发明实施例对此不做限定。

举例来说,请参见图2,多个类型的内存区域在内存空间中的分布可以如图2所示,各类型内存区域在内存中的位置由两个因素决定:其一为base(首地址),其二为size(大小)。二者的值可以根据需求设定。

其中,type1的base地址(basetype1)为startaddr,即可用于分配的内存空间首地址,大小(sizetype1)为该类型内存区域所占的内存空间大小,type2的base(basetype2)计算公式为:

basetype2=basetype1+sizetype1

同理,由type2的base和size可以算出type3的base:

basetype3=basetype2+sizetype2

以此类推,可以得到第n段内存区域(即typen)的base(basetypen)。

通过上述方式,将内存按照实际需求进行了批量的划分。

步骤102、基于所划分的多个不同类型的内存区域响应针对不同类型的内存区域的内存分片申请请求和释放请求。

本发明实施例中,划分了多个不同类型的内存区域之后,可以基于所划分的多个不同类型的内存区域响应针对不同类型的内存区域的内存分片申请请求和释放请求。

其中,可以通过封装申请接口和释放接口,用于以内存分片为最小内存单元进行内存申请和释放。

可见,在图1所示方法流程中,通过划分多个不同类型的内存区域,各不同类型的内存区域用于存储不同类型的数据,任一类型的内存区域包括预设数量的相同大小的内存分片,当不同类型的数据需要进行内存申请和释放时,以内存分片作为最小内存单元进行内存空间的分配和释放,优化了内存空间管理,降低了内存泄漏的概率。

在本发明其中一个实施例中,上述基于所划分的多个不同类型的内存区域响应针对不同类型的内存区域的内存分片申请请求,可以包括:

当接收到针对目标内存区域的指定数量的内存分片的申请请求时,将目标内存区域一端的连续指定数量的内存分片的分配给请求方,并更新目标内存区域该端的内存分片的信息;其中,目标内存区域一端为目标内存区域头部或尾部。

在该实施例中,目标内存区域为上述多个内存区域中的任一内存区域,本发明实施例后续不再复述。

为便于理解,下文中以目标区域的一端为目标内存区域尾部,即按照从内存区域的尾部到头部的顺序进行内存分片进行分配为例进行说明。

在该实施例中,当接收到针对目标内存区域的指定数量的内存分片的申请请求时,可以将目标内存区域尾部的连续指定数量的内存分片分配给请求方,并更新目标内存区域尾部的内存分片的信息,其具体实现将在下文中结合具体实例进行说明,本发明实施例在此不做赘述。

进一步地,在本发明实施例中,上述基于所划分的多个不同类型的内存区域响应针对不同类型的内存区域的内存分片释放请求,可以包括:

当接收到针对目标内存区域的指定数量的内存分片的释放请求时,将连续指定数量的内存分片加入到目标内存区域的另一端,并更新目标内存区域该另一端的内存分片的信息。

在该实施例中,当接收到针对目标区域的指定数量的内存分片的释放请求时,可以将该指定数量的内存分片加入到目标内存区域的头部,并更新目标内存区域头部的内存分片的信息,其具体实现将在下文中结合具体实例进行说明,本发明实施例在此不做赘述。

进一步地,在本发明其中一个实施例中,为了避免某个或某些内存区域的可用内存空间不足,还可以实时记录各内存区域的可用内存分片的数量,对于任一内存区域,当该内存区域的可用内存分片的数量小于预设阈值(本文中称为第一预设阈值,可以根据实际场景设定)时,可以发送告警消息(本文中称为第一告警消息)进行告警,以提示该内存区域可用内存空间不足。

进一步地,在本发明另一个实施例中,为了避免某个或某些内存区域的可用内存空间的浪费,对于任一内存区域,当该内存区域的可用内存分片的数量在预设时长内均大于预设阈值(本文中称为第二预设阈值,可以根据实际场景设定)时,可以发送告警消息(本文中称为第二告警消息)进行告警,以提示该内存区域内存空间使用率过低。

为了使本领域技术人员更好地理解本发明实施例提供的技术方案,下面结合具体实例对本发明实施例提供的技术方案进行说明。

在该实施例中,内存区域在内存空间中的分布可以如图2所示,对于任一类型的内存区域,在系统初始化时,可以对以下参数进行初始化:

1、headtypei

2、tailtypei

3、numtypei

4、nextbufj

5、idbufj

其中,headtypei为第i个类型的内存区域(本文中称为目标内存区域)的头部的内存分片的地址,tailtypei为目标内存区域的尾部的内存分片的地址、numtypei为目标内存区域中可用内存分片的数量(初始值即为目标内存区域的内存分片的总数),nextbufj为内存分片j(1≤j≤m,m为目标内存区域的内存分片的总数)在目标内存区域中的下一内存分片的id,idbufj为内存分片j的id。

需要说明的是,在该实施例中,与使用内存空间的首地址对内存空间进行标识的实现方式相比,使用id对buf进行标识,顺序排列使得每个buf都存在一个id号,id号最大只占用2字节,而使用首地址的方式一般需要占用4个或以上的字节,这对于容量较小且数量较多的内存片段,可以减少指令的长度,进而可以减少指令的资源占用。

在该实施例中,初始状态下,目标内存区域中各内存分片的id从头部到尾部依次递增,如依次为1~m,根据实际需求,m的值通常为几百~几千,其值均是比较小的,往往只需要一个8字节或者4字节的空间,因此在大量的数据操作时,和往常的通过地址或是其他方式标识内存分片相比(一般需要占据16字节),可以为系统内部节约大量空间。

上述步骤完成后,每个类型的内存区域被分为的多个内存分片(本文中称为buf),不同类型的内存区域下,有不同类型的buf,任一类型的内存区域下的多个buf组成了一个队列,这个队列中,一开始是顺序排放的,即实际物理位置(在内存空间中的实际位置)的第一个buf,为buf队列的第一个buf(id为1),实际物理位置的第二个buf,为buf队列的第二个buf(id为2),依次排列下去。但是随着时间的推移,有些先申请的buf不一定先被释放,后申请的buf也不一定后释放,因此队列中的buf排列顺序和初始化时可能不一样。

基于上述内存区域划分,当需要进行buf的申请和释放时,可以包括以下两种情况:

1、单个buf申请单个释放;

2、批量buf申请批量释放

在该实施例中,当调用内存申请接口时,可以通过cnt来标识申请的buf的数量,当调用申请单个buf的接口时,送入该申请接口时的buf个数为1,此时cnt的值为1;当调用申请多个buf的接口时,假设申请4个buf,送入该申请接口时的buf个数为4,此时cnt的值为4,以用于后续的连续操作:当cnt的值为1时,进行常规操作;当cnt的值为非1时,进行cnt次的循环操作。

下面分别对单个buf申请单个buf释放以及批量buf申请批量buf释放进行说明(以对目标内存区域进行操作为例)。

单个buf申请:

1、当接收到针对目标内存区域的单个buf申请请求时,先判断numtypei是否大于0,若是,则执行步骤2;否则,上报错误;

2、读取headtypei,以及对应的idbufj(目标内存区域头部的buf的id);

3、将idbufj返回给申请接口;

4、将所读取的buf的nextbufj指向的buf置为headtypei;

5、将numtypei的值减1。

单个buf释放:

1、当接收到针对目标内存区域的单个buf释放请求时,将释放的buf添加到buf队列的尾部,将tailtypei更新为该buf的地址,并将原tailtypei的nextbufj记录为该buf的id;

其中,tailtypei的nextbufj为空。

2、当numtypei的值加1。

其中,单个buf申请单个buf释放的buf操作示意图可以如图3a所示。

buf的批量申请和批量释放类似于上述单个buf申请和释放的情况,其目的在于加速申请和释放的过程,例如,连续申请4个或者8个buf的内存空间用于存放数据,然后将数据写入ssd中,在确定已经写入成功后,将这4个或者8个的buf释放。

批量buf申请

1、当接收到针对目标内存区域的cnt个buf申请请求时,先判断numtypei是否大于等于cnt,若是,则执行步骤2;否则,上报错误;

2、读取headtypei,以及对应的idbufj,并根据nextbufj再读取连续cnt-1个buf的id;

3、将读取的cnt个buf的id返回给申请接口;

4、将所读取的最后一个buf的nextbufj指向的buf(即从head到tail的顺序的第cnt+1个buf)置为headtypei;

5、将numtypei的值减cnt。

批量buf释放:

1、当接收到针对目标内存区域的cnt个buf释放请求时,将释放的buf添加到buf队列的尾部,将tailtypei更新为该cnt个buf中最后一个buf的地址,并将原tailtypei的nextbufj记录为该cnt个buf中第一个buf的id;

2、将numtypei的值加cnt。

其中,以cnt=3为例,批量buf申请批量buf释放的buf操作示意图可以如图3b所示。

其中,当将buf1~buf3分配给申请方之后,该连续3个buf的第一个buf为buf1,最后一个buf为buf3,buf1~buf3相邻的未分配的buf为buf4,即buf4成为新的head;当释放buf1~buf3时,buf1成为bufm的nextbuf,即nextbufm为buf1(id为1)。

需要说明的是,在本发明实施例中,也可以从尾部申请buf,并将释放的buf从头部加入buf队列,其具体实现与上述描述相类似,本发明实施例在此不做赘述。

其中,通过从一端(头部或尾部)申请buf,另一端(尾部或头部)释放buf,尽量远的分开了新使用的内存和刚使用完的内存,提高了内存使用安全性。

此外,对于批量buf申请,当从头部申请buf时,所分配的多个buf中最后一个buf为按从头部到尾部的顺序的最后一个buf,所分配的多个buf的相邻的未分配的buf为该最后一个buf的相邻的未分配的buf;例如,当所分配的多个buf分别为buf1~buf3时,最后一个buf为buf3,所分配的多个buf的相邻的未分配的buf为buf4。当进行buf释放时,该多个buf的最后一个buf为buf3。

当从尾部申请buf时所分配的多个buf中的第一个buf为该多个buf按从头部到尾部的顺序的第一个buf,所分配的多个buf的相邻未分配的buf为该第一个buf的相邻的未分配的buf,例如,当所分配的多个buf分别为bufm-2~bufm时,所分配的多个buf中的第一个buf为bufm-2,所分配的多个buf相邻的未分配的buf为bufm-3。

通过以上描述可以看出,在本发明实施例提供的技术方案中,通过划分多个不同类型的内存区域,各不同类型的内存区域用于存储不同类型的数据,任一类型的内存区域包括预设数量的相同大小的内存分片,当不同类型的数据需要进行内存申请和释放时,以内存分片作为最小内存单元进行内存空间的分配和释放,优化了内存空间管理,降低了内存泄漏的概率。

请参见图4,为本发明实施例提供一种数据处理装置的结构示意图,如图4所示,该数据处理装置可以包括:

划分单元410,用于划分多个不同类型的内存区域;其中,不同类型的内存区域用于存储不同类型的数据,任一类型的内存区域包括预设数量的内存分片,同一类型的内存区域中各内存分片大小相同;

处理单元420,用于基于所述多个不同类型的内存区域响应针对不同类型的内存区域的内存分片申请请求和释放请求。

在可选实施例中,所述划分单元410,具体用于将一段连续的内存空间划分为多个不同类型的内存区域;

其中,所述多个不同类型的内存区域的首地址满足以下条件:

basetypei+1=basetypei+sizetypei

其中,1≤i≤n-1,n为不同类型的内存区域的数量,basetypei为所述多个不同类型的内存区域中第i个内存区域的首地址,sizetypei为该第i个内存区域所占的内存空间大小。

在可选实施例中,所述处理单元420,具体用于当接收到针对目标内存区域的指定数量的内存分片的申请请求时,将所述目标内存区域一端的连续指定数量的内存分片分配给请求方,并更新所述目标内存区域该端的内存分片的信息;其中,所述目标内存区域一端为所述目标内存区域头部或尾部。

在可选实施例中,所述处理单元420,具体用于当接收到针对所述目标内存区域的所述指定数量的内存分片的释放请求时,将所述连续指定数量的内存分片加入到所述目标内存区域的另一端,并更新所述目标内存区域该另一端的内存分片的信息。

请一并参见图5,为本发明实施例提供的另一种数据处理装置的结构示意图,如图5所示,在图4所示装置的基础上,该数据处理装置还包括:

记录单元430,用于对于所述目标内存区域,记录所述目标内存区域对应的headtypei、tailtypei、nextbufj、idbufj;

其中,headtypei为所述目标内存区域的头部的内存分片的地址,tailtypei为所述目标内存区域的尾部的内存分片的地址、nextbufj为所述目标内存区域中第j个内存分片的下一个内存分片的标识id、idbufj为所述目标内存区域中第j个内存分片的id,1≤j≤m,m为该内存区域中内存分片的总数。

在可选实施例中,所述处理单元420,具体用于当所述指定数量为1个时,根据所记录的所述目标内存区域对应的headtypei或tailtypei,将所述目标内存区域的一端的第一目标内存分片的id分配给请求方,并根据所记录的所述目标内存区域对应的nextbufj将所述第一目标内存分片的相邻的未分配的内存分片的地址作为headtypei或tailtypei;

当所述指定数量为多个时,根据所记录的所述目标内存区域对应的headtypei或tailtypei、以及所述目标内存区域对应的nextbufj,将所述目标内存区域的一端的连续所述指定数量的第二目标内存分片的id分片给请求方,并将所述第二目标内存分片相邻的未分配的内存分片的地址作为headtypei或tailtypei。

在可选实施例中,所述处理单元420,具体用于当所述指定数量为1个时,将该内存分片加入到所述目标内存区域的另一端;

所述记录单元430,还用于将所记录的tailtypei或headtypei更新为该内存分片的地址;

所述处理单元420,具体用于当所述指定数量为多个时,将所述指定数量的内存分片加入到所述目标内存区域的另一端;

所述记录单元430,还用于将所记录的tailtypei更新为所述指定数量的内存分片中最后一个内存分片的地址,或将所记录的headtypei更新为所述指定数量的内存分片中第一个内存分片的地址。

请一并参见图6,为本发明实施例提供的另一种数据处理装置的结构示意图,如图6所示,在图4所示装置的基础上,该数据处理装置还包括:

发送单元440,用于对于任一类型的内存区域,当该内存区域的可用内存分片的数量小于第一预设阈值时,发送第一告警消息;

或/和,

对于任一类型的内存区域,当该内存区域的可用内存分片的数量在预设时长内均超过第二预设阈值时,发送第二告警消息。

上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。

对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

由上述实施例可见,通过划分多个不同类型的内存区域,各不同类型的内存区域用于存储不同类型的数据,任一类型的内存区域包括预设数量的相同大小的内存分片,当不同类型的数据需要进行内存申请和释放时,以内存分片作为最小内存单元进行内存空间的分配和释放,优化了内存空间管理,降低了内存泄漏的概率。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。

应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。

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