一种内存分配方法及装置与流程

文档序号:11250718阅读:375来源:国知局
一种内存分配方法及装置与流程

本发明涉及计算机技术领域,特别涉及一种内存分配方法及装置。



背景技术:

内存是计算机的重要组件之一,计算机中所有程序的运行都是在内存中进行的,因此计算机的性能严重依赖于内存性能的好坏。

目前,在linux系统中,通常我们习惯于使用malloc等api(applicationprogramminginterface,应用程序编程接口)函数来申请及分配运行进程所需要的内存。

但是,频繁使用api函数会造成大量的内存碎片,同时,通过api函数申请分配内存时还会存在跨cpu(centralprocessingunit,中央处理器)节点分配内存的情况,因此,通过上述技术方案分配运行进程所需要的内存时,会影响内存的访问速度。



技术实现要素:

本发明实施例提供了一种内存分配的方法及装置,能够提高内存访问速度。

第一方面,本发明实施例提供了一种内存分配的方法,包括:

确定运行进程所对应的cpu;

在确定的所述cpu所对应的本地内存中申请所述运行进程相对应的内存池;

当所述运行进程申请内存时,从所述运行进程相对应的所述内存池中分配对应的内存区域给所述运行进程。

优选地,进一步包括:

当所述运行进程释放内存时,将所述运行进程分配的内存区域释放回所述运行进程相对应的内存池中。

优选地,所述确定运行进程所对应的cpu,包括:

确定运行进程所需内存池的大小;

确定每一个待选择cpu所分别对应的本地内存的剩余空间;

根据每一个所述待选择cpu分别对应的本地内存的剩余空间,以及所述运行进程所需内存池的大小,从所述至少一个待选择cpu中确定一个所述运行进程所对应的cpu。

优选地,在所述在确定的所述cpu所对应的本地内存中申请所述运行进程相对应的内存池之后,在所述从所述运行进程相对应的所述内存池中分配对应的内存区域给所述运行进程之前,进一步包括:

预先将确定的所述内存池划分为预设数量个内存区域;

则,所述当所述运行进程申请内存时,从所述运行进程相对应的所述内存池中分配对应的内存区域给所述运行进程,包括:

当所述运行进程申请内存时,确定所述运行进程所需要申请的内存大小;

根据确定的内存大小,以及所述运行进程相对应的所述内存池中各个所述内存区域的大小,从所述预设数量个内存区域中选择一个内存区域,将选择的所述内存区域分配给所述运行进程。

优选地,还包括:

监测所述运行进程是否结束运行,在所述运行进程结束运行时,将所述运行进程相对应的所述内存池释放回所述运行进程所对应的cpu的本地内存中。

第二方面,本发明实施例提供了一种内存分配装置,包括:

确定单元、申请单元、分配单元;其中,

所述确定单元,用于确定运行进程所对应的cpu;

所述申请单元,用于在确定的所述cpu所对应的本地内存中申请所述运行进程相对应的内存池;

所述分配单元,用于当所述运行进程申请内存时,从所述申请单元申请的所述运行进程相对应的所述内存池中分配对应的内存区域给所述运行进程。

优选地,进一步包括:

释放单元,用于当所述运行进程释放内存时,将所述运行进程分配的内存区域释放回所述运行进程相对应的内存池中。

优选地,所述确定单元,包括:内存池大小确定子单元、剩余空间确定子单元和cpu确定子单元;其中,

内存池大小确定子单元,用于确定运行进程所需内存池的大小;

剩余空间确定子单元,用于确定每一个待选择cpu所分别对应的本地内存的剩余空间。

cpu确定子单元,用于根据每一个所述待选择cpu分别对应的本地内存的剩余空间,以及所述运行进程所需内存池的大小,从所述至少一个待选择cpu中确定一个所述运行进程所对应的cpu。

优选地,进一步包括:

划分单元,用于预先将所述申请单元申请的所述内存池划分为预设数量个内存区域;

所述分配单元,包括:

内存大小确定子单元,用于当所述运行进程申请内存时,确定所述运行进程所需要申请的内存大小;

分配子单元,用于根据获取的内存大小,以及所述运行进程相对应的所述内存池中各个所述内存区域的大小,从所述预设数量个内存区域中选择一个内存区域,将选择的所述内存区域分配给所述运行进程。

优选地,进一步包括:

内存池处理单元,用于监测所述运行进程是否结束运行,在所述运行进程结束运行时,将所述运行进程相对应的所述内存池释放回所述运行进程所对应的cpu的本地内存中。

本发明实施例提供了一种内存分配方法及装置,该方法通过预先给运行进程确定一个cpu,便于在该cpu的本地内存中给运行进程申请相对应的内存池;当运行进程申请内存时,从运行进程相对应的内存池中分配对应内存区域给运行进程;由于每个进程有确定的cpu和相对应的内存池,从而避免了运行进程跨cpu节点申请内存的情况,且在同一内存池中分配运行进程所需要的内存,也避免产生大量的内存碎片,从而利于提高内存访问速度。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明一实施例提供的一种内存分配方法流程图;

图2是本发明一实施例提供的另一种内存分配方法流程图;

图3是本发明一实施例提供的一种内存分配装置的结构示意图;

图4是本发明一实施例提供的另一种内存分配装置的结构示意图;

图5是本发明一实施例提供的又一种内存分配装置的结构示意图;

图6是本发明一实施例提供的再一种内存分配装置的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1所示,本发明实施例提供了一种内存分配方法,该方法可以包括以下步骤:

步骤101:确定运行进程所对应的cpu;

步骤102:在确定的所述cpu所对应的本地内存中申请所述运行进程相对应的内存池;

步骤103:当所述运行进程申请内存时,从所述运行进程相对应的所述内存池中分配对应的内存区域给所述运行进程。

本发明实施例提供了一种内存分配方法及装置,该方法通过预先给运行进程确定一个cpu,便于在该cpu的本地内存中给运行进程申请相对应的内存池;当运行进程申请内存时,从运行进程相对应的内存池中分配对应内存区域给运行进程;由于每个进程有确定的cpu和相对应的内存池,从而避免了运行进程跨cpu节点申请内存的情况,且在同一内存池中分配运行进程所需要的内存,也避免产生大量的内存碎片,从而利于提高内存访问速度。

举例来说,运行进程f对应cpu2,在cpu2的本地内存中申请内存池f。在内存池f中有内存区域a、内存区域b、内存区域c3个内存区域且对应的内存大小分别为:0.7gb、1.5gb、3gb,当运行进程f申请1.3gb的内存时,为了避免浪费内存,从内存池f中选择内存区域应大于运行进程f所申请的内存且与运行进程f所申请的内存的大小之差最小,从而选择内存区域b给运行进程f。

为了提高内存池的内存利用率,在本发明一实施例中,当所述运行进程释放内存时,将所述运行进程分配的内存区域释放回所述运行进程相对应的内存池中。

本发明实施例中,当运行进程不再使用内存时,会将分配给运行进程的内存区域释放回运行进程相对应的内存池中,便于该运行进程再次申请内存,从而提高了内存池的内存利用率。

为了提高本地内存利用率,所述步骤101的具体实现方式可以包括:

确定运行进程所需内存池的大小;

确定每一个待选择cpu所分别对应的本地内存的剩余空间;

根据每一个所述待选择cpu分别对应的本地内存的剩余空间,以及所述运行进程所需内存池的大小,从所述至少一个待选择cpu中确定一个所述运行进程所对应的cpu。

本发明实施例中,首先确定运行进程所需内存池的大小,再确定所有待选择cpu所分别对应的本地内存的剩余空间,便于与运行进程所需要的内存池的大小进行对比。通过将所有待选择cpu分别对应的本地内存的剩余空间逐个与运行进程所需内存池的大小对比,为了提高本地内存利用率,从所有待选择cpu中确定一个cpu,所确定cpu的本地内存剩余空间大于运行进程所需内存池的大小且与运行进程所需内存池的大小之差最小,从而避免了浪费cpu的本地内存空间。

举例来说:确定运行进程f需要内存大小为2gb的内存池,又确定出待选择cpu1、cpu2、cpu3所对应的本地内存剩余空间分别为:0.7gb、3gb、5gb。经过将2gb与0.7gb、3gb、5gb逐个对比后,为了提高内存池的内存利用率,确定cpu2的本地内存剩余空间刚好符合运行进程f所需内存池的大小。

为了避免浪费内存,本发明一实施例中,在所述在确定的所述cpu所对应的本地内存中申请所述运行进程相对应的内存池之后,在所述从所述运行进程相对应的所述内存池中分配对应的内存区域给所述运行进程之前,进一步包括:

预先将确定的所述内存池划分为预设数量个内存区域;

则,所述步骤103的具体实现方式可以包括:

当所述运行进程申请内存时,确定所述运行进程所需要申请的内存大小;

根据确定的内存大小,以及所述运行进程相对应的所述内存池中各个所述内存区域的大小,从所述预设数量个内存区域中选择一个内存区域,将选择的所述内存区域分配给所述运行进程。

本发明实施例中,在运行进程确定的cpu所对应的本地内存中申请运行进程对应的内存池之后,在从运行进程相对应的内存池中分配对应的内存区域给运行进程之前,根据内存池的大小将内存池划分为几个不同大小的内存区域。当运行进程申请内存时,先确定需要申请的内存大小,便于从内存池的所有待选择内存区域中选择一个既大于运行进程所申请的内存又与运行进程所申请的内存大小之差最小的内存区域,并将选择的内存区域分配给运行进程,从而避免了大量内存碎片的产生。

举例来说:根据运行进程f相对应的内存池f内存大小为6gb,将内存池f划分为a、b、c3个内存区域分别对应的内存大小依次为1gb、2gb、3gb。当运行进程f向内存池f申请1.5gb内存时,为了避免大量内存碎片的产生,内存池f会将内存区域b分配给运行进程f。

为了方便其他运行进程申请内存,本发明一实施例中,监测所述运行进程是否结束运行,在所述运行进程结束运行时,将所述运行进程相对应的所述内存池释放回所述运行进程所对应的cpu的本地内存中。

本发明实施例中,通过监测运行进程,可以及时得知运行进程是否已结束运行,当监测到运行进程已经结束运行时,会将运行进程相对应的内存池释放回运行进程所对应的cpu的本地内存中,从而避免了资源浪费。

举例来说:通过监控模块检测运行进程,当监测到运行进程f结束运行时,会将运行进程f的内存池f通过内存释放接口释放回运行进程f对应的本地内存中。

为了更加清楚的说明本发明的技术方案及优点,下面以系统中包括cpu1、2、3,各个cpu分别对应的本地内存依次为a、b、c,通过本发明的技术方案实现向运行进程f分配内存为例,如图2所示,具体可以包括以下步骤:

步骤201:确定运行进程f所需内存池的大小。

在本发明实施例中,确定运行进程所需内存池的大小,便于与所有待选择cpu的本地内存剩余空间对比。

举例来说,在linux系统中,运行进程f创建时调用绑定cpux并在cpux的本地内存z中分配内存池接口,通过内存池接口确定运行进程f所需内存池的大小为6gb。

步骤202,确定cpu1对应的本地内存a的剩余空间,确定cpu2对应的本地内存b的剩余空间,确定cpu3对应的本地内存c的剩余空间。

举例来说,通过内存池接口确定cpu1的本地内存a的剩余空间为3gb,cpu2的本地内存b的剩余空间为6gb,cpu3的本地内存c的剩余空间为7gb。

步骤203,根据cpu1、cpu2、cpu3分别对应的本地内存的剩余空间,以及运行进程f所需内存池的大小,从3个cpu中确定一个运行进程所对应的cpu。

举例来说,已知cpu1的本地内存a的剩余空间为3gb、cpu2的本地内存b的剩余空间为6gb、cpu3的本地内存c的剩余空间为7gb,将3个cpu的本地内存的剩余空间分别与运行进程f的所需内存池的大小为6gb进行对比,为了避免浪费内存,最后确定cpu2为运行进程f所对应的cpu。

步骤204:在cpu2的本地内存b中申请运行进程f的内存池f。

举例来说,在numa架构下,通过内存池接口在cpu2的本地内存b中申请运行进程f的内存池f。

步骤205:预先将内存池f划分为3个内存区域;

举例来说,根据内存池f的空间为6gb,将内存池f划分为内存区域f1、内存区域f2、内存区域f3,且f1、f2、f3相对应内存区域的空间大小依次为:1gb、2gb、3gb。

步骤206:当运行进程f申请内存时,确定运行进程f所申请的内存大小。

举例来说,当运行进程f申请内存时,通过内存申请接口确认运行进程f需要申请2gb的内存。

步骤207:根据确定的内存大小,以及内存池f所对应的f1、f2、f3三个内存区域相对应的内存区域大小,从3个内存区域中选择一个内存区域,并将选择的内存区域分配给运行进程f。

举例来说,运行进程f需要申请2gb的内存,内存池f所对应的f1、f2、f3三个内存区域相对应的内存区域大小依次为1gb、2gb、3gb,通过将需要申请的内存大小和3个内存区域的大小比对,将内存区域f2分配给运行进程f。

步骤208:当运行进程f释放内存时,将内存区域f2释放回内存池f中。

举例来说,当运行进程f释放内存时,通过内存释放接口将内存区域f2释放回内存池f中。

步骤209:监测运行进程f是否结束运行,在运行进程f结束运行时,将运行进程f相对应的内存池f释放回运行进程f所对应的cpu2的本地内存b中。

举例来说,通过检测模块监测运行进程,当运行进程f结束运行时,通过内存释放接口内存池f释放回本地内存b中。

在本发明实施例中,首先确定运行进程所需内存池的大小和每个待选择cpu所分别对应的本地内存的剩余空间,根据将运行进程所需内存池大小与每个待选择cpu分别对应的本地内存的剩余空间逐个对比,可以快速确定一个cpu,并可以实现在该cpu的本地内存中给运行进程申请一个内存池。在从运行进程相对应的内存池中分配对应的内存区域给运行进程之前,先将内存池划分为预设数量个内存区域,当运行进程申请内存时,从预设数量个内存区域中选择一个能满足运行进程需要申请的内存大小的内存区域并分配给运行进程。当运行进程释放内存时,将分配给运行进程的内存能区域释放回运行进程对应的内存池中,只有当运行进程结束运行时,才会将申请的内存池释放回本地内存中,便于其他进程从该cpu的本地内存中申请内存池。

如图3所示,本发明一实施例提供了一种内存分配装置,包括:确定单元301、申请单元302、分配单元303;其中,

确定单元301,用于确定运行进程所对应的cpu;

申请单元302,用于在确定单元确定的所述cpu所对应的本地内存中申请所述运行进程相对应的内存池;

分配单元303,用于当所述运行进程申请内存时,从所述申请单元申请的所述运行进程相对应的所述内存池中分配对应的内存区域给所述运行进程。

本发明实施例中,确定单元确定了运行进程所对应的cpu,通过申请单元在该cpu的本地内存中申请内存池,当运行进程申请内存时,分配单元从内存池中分配内存区域给运行进程,由于每个运行进程有固定的cpu和内存池,从而避免了运行进程跨cpu节点申请内存的情况,且在同一内存池中分配内存,也避免了内存碎片,从而利于提高内存访问速度。

基于图3所示的一种内存分配装置,本发明一实施例中,如图4所示,该装置中的所述确定单元301包括:内存池大小确定子单元3011、剩余空间确定子单元3012和cpu确定子单元3013;其中,

内存池大小确定子单元3011,用于确定运行进程所需内存池的大小;

剩余空间确定子单元3012,用于确定每一个待选择cpu所分别对应的本地内存的剩余空间。

cpu确定子单元3013,用于根据每一个所述待选择cpu分别对应的本地内存的剩余空间,以及所述运行进程所需内存池的大小,从所述至少一个待选择cpu中确定一个所述运行进程所对应的cpu。

基于图4所示的一种内存分配装置,本发明一实施例中,如图5所示,在所述在确定的所述cpu所对应的本地内存中申请所述运行进程相对应的内存池之后,在所述从所述运行进程相对应的所述内存池中分配对应的内存区域给所述运行进程之前,该装置进一步包括:

划分单元401:用于预先将所述申请单元申请的所述内存池划分为预设数量个内存区域;

所述分配单元303,包括:

内存大小确定子单元3031,用于当所述运行进程申请内存时,确定所述运行进程所需要申请的内存大小;

分配子单元3032,用于根据获取的内存大小,以及所述运行进程相对应的所述内存池中各个所述内存区域的大小,从所述预设数量个内存区域中选择一个内存区域,将选择的所述内存区域分配给所述运行进程。

基于图5所示的一种内存分配装置,本发明一实施例中,如图6所示,该装置进一步包括:

内存池处理单元501,用于监测所述运行进程是否结束运行,在所述运行进程结束运行时,将所述运行进程相对应的所述内存池释放回所述运行进程所对应的cpu的本地内存中。

本发明各个实施例至少具有如下有益效果:

1、本发明一实施例中,预先确定运行进程所对应的cpu,并在该cpu的本地内存中申请内存池,当运行进程申请内存时,从内存池中分配内存区域给运行进程,由于每个运行进程有固定的cpu和内存池,从而避免了运行进程跨cpu节点申请内存的情况,且在同一内存池中分配内存,也避免了内存碎片,从而利于提高内存访问速度。

2、本发明一实施例中,当运行进程不再使用内存时,会将分配给运行进程的内存区域释放回运行进程相对应的内存池中,便于该运行进程再次申请内存,从而提高了内存池的内存利用率。

3、本发明一实施例中,首先确定运行进程所需内存池的大小,再确定所有待选择cpu所分别对应的本地内存的剩余空间,便于与运行进程所需要的内存池的大小进行对比。通过将所有待选择cpu分别对应的本地内存的剩余空间逐个与运行进程所需内存池的大小对比,从所有待选择cpu中确定一个cpu,所确定cpu的本地内存剩余空间大于运行进程所需内存池的大小且与运行进程所需内存池的大小之差最小,从而避免了浪费cpu的本地内存空间。

4、本发明一实施例中,在运行进程确定的cpu所对应的本地内存中申请运行进程对应的内存池之后,在从运行进程相对应的内存池中分配对应的内存区域给运行进程之前,根据内存池的大小将内存池划分为几个不同大小的内存区域。当运行进程申请内存时,先确定需要申请的内存大小,便于从内存池的所有待选择内存区域中中选择一个既大于运行进程所申请的内存又与运行进程所申请的内存大小之差最小的内存区域,并将选择的内存区域分配给运行进程,从而避免了浪费内存。

5、本发明一实施例中,通过监测运行进程,可以及时得知运行进程是否已结束运行,当监测到运行进程已经结束运行时,会将运行进程相对应的内存池释放回运行进程所对应的cpu的本地内存中,从而避免了资源浪费。

需要说明的是,在本文中,诸如第一和第二之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个〃·····”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同因素。

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

最后需要说明的是:以上所述仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

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