CN110162395A - 一种内存分配的方法及装置 - Google Patents
一种内存分配的方法及装置 Download PDFInfo
- Publication number
- CN110162395A CN110162395A CN201810146149.9A CN201810146149A CN110162395A CN 110162395 A CN110162395 A CN 110162395A CN 201810146149 A CN201810146149 A CN 201810146149A CN 110162395 A CN110162395 A CN 110162395A
- Authority
- CN
- China
- Prior art keywords
- memory
- pool
- cpu
- memory pool
- page frame
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5011—Pool
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
Abstract
本申请提供一种内存分配的方法及装置,应用于网络设备,所述方法包括:为本设备的各个CPU分别创建不同的内存池;当接收到针对第一CPU的内存分配请求时,从所述第一CPU的内存池中找到满足所述内存分配请求的可用内存块,并返回所述可用内存块给发送所述内存分配请求的来源。本申请技术方案节省了大量的因加锁而产生的系统开销,提高了内存的利用率。
Description
技术领域
本申请涉及计算机技术领域,特别涉及一种内存分配的方法及装置。
背景技术
网络设备(包括计算机等智能设备)通常以内存池为基础来管理内存。
而对于内存池而言,由于多个CPU上的进程可以共用同一个内存池,会造成大量的加锁操作,从而产生系统开销,影响系统性能。其中,上述系统开销包括加锁本身产生的系统开销,以及等待使用内存池的进程在尝试访问内存池时产生的竞争开销。此外,不同进程可能创建多个包含大小相同的内存块的内存池,而上述内存池未经统一管理,可能造成大量空闲的内存块,使得内存利用率低。
发明内容
有鉴于此,本申请提供一种内存分配的方法及装置,用以解决现有技术管理内存因过多的加锁产生的系统开销,因未预留内存而导致业务无法正常运行,以及,内存利用率低的问题。
具体地,本申请是通过如下技术方案实现的:
一种内存分配的方法,所述方法应用于网络设备,所述方法包括:
为本设备的各个CPU分别创建不同的内存池;
当接收到针对第一CPU的内存分配请求时,从所述第一CPU的内存池中找到满足所述内存分配请求的可用内存块,并返回所述可用内存块给发送所述内存分配请求的来源。
在所述内存分配的方法中,各个CPU被创建的不同内存池包括:不同内存池组中的不同成员内存池;
其中,各个CPU被创建的成员内存池中的可用内存块不局限于同一页框;
属于同一内存池组的不同成员内存池中的可用内存块的大小相同。
在所述内存分配的方法中,所述为本设备的各个CPU分别创建不同的内存池,进一步包括:
为各个CPU被创建的成员内存池所在的内存池组创建对应的公共内存池;
若从所述第一CPU的内存池中未找到满足所述内存分配请求的可用内存块,该方法进一步包括:
从所述第一CPU的成员内存池对应的公共内存池找到满足所述内存分配请求的可用内存块;
将所述可用内存块加入到所述第一CPU的成员内存池,并返回所述可用内存块给发送所述内存分配请求的来源。
在所述内存分配的方法中,所述为本设备的各个CPU分别创建不同的内存池进一步包括:
创建公共页框内存池,并为本设备的各个CPU分别创建不同的页框内存池;
若从所述第一CPU的内存池中未找到满足所述内存分配请求的可用内存块,该方法进一步包括:
检测所述第一CPU的页框内存池中是否存在可用页框;
若存在,将所述可用页框加入到所述第一CPU的成员内存池,并从所述成员内存池中找到满足所述内存分配请求的可用内存块;返回所述可用内存块给发送所述内存分配请求的来源;
若不存在,从所述公共页框内存池中找到可用页框,并将所述可用页框加入到所述第一CPU的页框内存池;将所述可用页框加入到所述第一CPU的成员内存池,并从所述成员内存池中找到满足所述内存分配请求的可用内存块;返回所述可用内存块给发送所述内存分配请求的来源。
在所述内存分配的方法中,所述方法进一步包括:
当接收到针对所述第一CPU的内存释放请求,基于所述内存释放请求从所述第一CPU的多个成员内存池中找到需要释放内存块的成员内存池;
确定所述成员内存池中的可用内存块的数量是否达到预设的第一阈值;
如果未达到所述第一阈值,将所述内存释放请求中的内存块加入到所述成员内存池。
在所述内存分配的方法中,所述方法进一步包括:
如果所述成员内存池中的可用内存块的数量达到所述第一阈值,确定所述成员内存池对应的公共内存池中的可用内存块的数量是否达到预设的第二阈值;
如果未达到所述第二阈值,选择所述成员内存池中的预设数量的可用内存块加入到所述公共内存池,并将所述内存释放请求中的内存块加入到所述公共内存池;
如果达到所述第二阈值,确定所述第一CPU的页框内存池中的可用页框的数量是否达到预设的第三阈值;
如果未达到所述第三阈值,将所述公共内存池中隶属于同一页框的多个可用内存块加入到所述第一CPU的页框内存池;将所述成员内存池中的预设数量的可用内存块加入到所述公共内存池,并将所述内存释放请求中的内存块加入到所述公共内存池;
如果达到所述第三阈值,选择所述第一CPU的页框内存池中的预设数量的可用页框加入到所述公共页框内存池;将所述公共内存池中隶属于同一页框的多个可用内存块加入到所述第一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是本申请示出的一种页框内存池的结构示意图;
图7是本申请示出的一种内存分配的装置的实施例框图;
图8是本申请示出的一种内存分配的装置的硬件结构图。
具体实施方式
为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图对现有技术方案和本发明实施例中的技术方案作进一步详细的说明。
内核管理内存可以采用内存池来实现。任一CPU上的任一进程可以在需要内存块时,创建内存池,并向外部(比如伙伴算法)申请一定数量且大小相等的内存块至上述内存池中。需要说明的是,进程需调用n次函数来申请内存池中的n个内存块。在将内存块申请到内存池后,可以记录该内存池的管理信息(包括:记录内存块的地址和内存块的数量)。
参见图1,为现有技术的一种内存池的架构示意图,如图1所示,多个CPU可以共用一个内存池。图1的内存池中的“对象”即为内存块。需要指出的是,多个进程可能创建多个包含不同大小内存块的内存池(图1中仅以一个内存池作为示例),各内存池都可被多个CPU使用。
内存池创建完成后,创建该内存池的进程和其它进程都可以从该内存池中申请对象。
内存申请过程如下:
任一CPU上的进程向内存池管理模块发送内存分配请求。内存池管理模块接收到上述内存分配请求后,基于该内存分配请求所请求的内存块大小,确定满足要求的内存池,然后确定该内存池中是否存在可用内存块。其中,可用内存块指可以分配给进程使用的内存块。
一方面,如果内存池中存在可用内存块,可以直接获取一个可用内存块,并向发送上述内存分配请求的进程返回该可用内存块的地址。此外,还需更新上述内存池的管理信息(包括:移除上述可用内存块的地址,以及,将可用内存块的个数减一);
另一方面,如果内存池中不存在可用内存块,则需调用函数从内存池外部(比如:伙伴算法)申请内存块,然后更新上述内存池的管理信息(包括:添加新加入上述内存池的可用内存块的地址,以及,将可用内存块的个数增加申请到的内存块数量)。进一步地,从内存池获取一个可用内存块,并向发送上述内存分配请求的进程返回该可用内存块的地址。此外,更新上述管理信息。
内存释放过程如下:
任一CPU上的进程需要释放其占用的内存块,向内存池管理模块发送内存释放请求。内存池管理模块接收到上述内存释放请求后,基于该内存释放请求中的内存块大小,确定对应的内存池,然后确定该内存池中的可用内存块个数是否小于内存池的最大容量数。
一方面,如果内存池的对象个数小于内存池的最大容量数,将上述内存释放请求中的内存块释放到该内存池,并更新管理信息(包括:添加上述内存块的地址,以及,将可用内存块的个数加一);
另一方面,如果内存池的可用内存块的个数不小于内存池的最大容量数,说明内存池已满,此时,需调用函数向内存池外部释放内存块。
通过内存池管理内存,由于内存池中预先存在内存块,减少了进程从内存池申请对象失败的概率。
然而,由于内存池在各个CPU上共享,内存管理模块需对每个访问内存池的请求(包括:内存分配请求和内存释放请求)进行串行操作,因此,每次访问内存池都需要加锁操作,从而产生了大量竞争开销,影响系统性能。
具体地,任一CPU上的进程访问内存池,内存管理模块会将内存池加锁,此时可产生一定的开销;而其它CPU上的进程在等待过程中会尝试访问该内存池,此时可产生的竞争开销。对于IOPS(Input/Output Operations Per Second,每秒钟读写操作次数)达到一定数量级(比如:200万以上)的系统环境下,内存管理模块可能同时需要处理大量访问内存池的请求,随着访问内存池的进程的数量增大,产生的竞争开销增长迅速。
比如:若11个进程访问内存池,在第一个进程访问成功并加锁后,剩余的10个进程分别会产生1单元的开销、2单元的开销、3单元的开销、4单元的开销、5单元的开销、6单元的开销、7单元的开销、8单元的开销、9单元的开销和10单元的开销,累计产生了55单元的开销。由此可见,因内存管理模块串行操作,产生的竞争开销是巨大的,且随访问数量的增加会急剧增加。
系统的各进程分别创建内存池,其中可能存在大量内存块大小相同的内存池,由于没有统一管理,大量具有相同大小的内存块的内存池中可能存在大量的可用内存块,造成内存利用率低。
此外,向外部申请或释放内存块,每次调用函数只能申请或释放一个内存块,效率较低。
有鉴于此,在本申请技术方案中,通过为各个CPU分别创建不同的内存池,从而使得各CPU上的进程(或业务)申请内存时,内存池管理模块可以从该CPU的内存池中选择可用内存块返回至上述进程(或业务)。由于内存池不再是多个CPU共用,节省了大量的因加锁而产生的开销;此外,内存池管理模块在各CPU上的进程(或业务)需要申请内存前,统一为各CPU创建内存池,避免了因内存池未经统一管理而造成内存利用率低的问题。
参见图2,为本申请示出的一种内存分配的方法的流程图,该方法应用于网络设备,包括以下步骤:
步骤201:为本设备的各个CPU分别创建不同的内存池。
内存池管理模块可以在网络设备启动后,为网络设备的各个CPU分别创建不同的内存池,以满足后续分配内存的需要。
其中,各个CPU被创建的不同内存池包括:不同内存池组中的不同成员内存池。属于同一内存池组的不同成员内存池中的可用内存块的大小相等。
不同内存池组的成员内存池中的可用内存块的大小不同,内存池管理模块可以基于实际可能需要用到的内存块大小需要创建的内存池组。
比如,若后续进程(或业务)可能需要32字节、64字节和128字节的内存块,则需要创建内存块为32字节的内存池组、内存块为64字节的内存池组和内存块为128字节的内存池组。换而言之,需为各CPU分别创建内存块为32字节的成员内存池、内存块为64字节的成员内存池和内存块为128字节的成员内存池。
参见图3,为本申请示出的一种内存池的结构示意图,如图3所示,网络设备包括n(n代表不小于2的正整数)个CPU,各CPU存在对应的内存池。其中,图3内存池中的对象为内存块。需要指出的是,图3中仅示出一个内存池组的成员内存池,实际上,各CPU对应多个属于不同内存池组的成员内存池。
其中,各个CPU被创建的成员内存池中的可用内存块不局限于同一页框。因此,实际上各CPU的成员内存池中的可用内存块的数量可以非常大。
步骤202:当接收到针对第一CPU的内存分配请求时,从所述第一CPU的内存池中找到满足所述内存分配请求的可用内存块,并返回所述可用内存块给发送所述内存分配请求的来源。
其中,第一CPU泛指网络设备上的任一CPU,其只是为便于描述进行的命名,并不限定本申请。
内存管理模块可以基于上述内存分配请求所请求的内存块大小,从上述第一CPU对应的多个成员内存池中选择合适的成员内存池。
比如:若上述内存分配请求所请求的内存块大小为45字节,内存管理模块可以选择上述第一CPU对应的包含64字节的内存块的成员内存池。
进一步地,内存管理模块可以从选中的成员内存池中找到可用内存块,并返回上述可用内存块给发送上述内存分配请求的来源。
具体地,内存管理模块可以从选中的成员内存池的获取一个可用内存块的地址,然后向发送上述内存分配请求的来源返回上述可用内存块的地址。此外,还可以更新该成员内存池的管理信息(包括:移除上述可用内存块的地址,以及,将可用内存块的个数减一)。
由于各CPU分别被创建不同的成员内存池,各CPU上的业务申请内存块时,不会对同一个成员内存池产生并发操作,因此,不涉及加锁,节省了系统开销。此外,内存管理模块为各个CPU统一创建内存池,相比现有技术中不同CPU的各进程分别创建大量内存块大小相同的内存池,避免了内存利用率低的问题。
在本申请实施例中,内存管理模块除了为本设备的各个CPU分别创建不同的内存池以外,还可以为本设备的各个CPU被创建的成员内存池所在的内存池组创建对应的公共内存池。
参见图4,为本申请示出的一种内存池的结构示意图,如图4所示,各内存池组包括对应于多个CPU的多个成员内存池和公共内存池,其中,同一内存池组中的公共内存池中的可用内存块大小与成员内存池中的可用内存块大小相同。图4中的管理信息包括该内存池组的各成员内存池的管理信息和公共内存池的管理信息。
若从上述第一CPU的内存池中未找到满足上述内存分配请求的可用内存块,内存管理模块可以从选中的上述成员内存池对应的公共内存池找到满足上述内存分配请求的可用内存块。
进一步地,内存管理模块可以将上述可用内存块加入到上述第一CPU的成员内存池,并返回上述可用内存块给发送上述内存分配请求的来源。
具体地,内存管理模块可以从上述公共内存池找到若干可用内存块的地址,然后将上述可用内存块的地址转移至上述成员内存池,并选择一个可用内存块的地址返回至发送上述内存分配请求的来源。此外,还可以更新上述公共内存池的管理信息(包括:移除上述可用内存块的地址,以及,减去被转移的可用内存块的个数)和上述成员内存池的管理信息(包括:移入上述可用内存块的地址,增加被加入的可用内存块的个数,以及,移除一个可用内存块的地址,将可用内存块的个数减一)。
由于上述公共内存池可以为多个CPU上的成员内存池提供可用内存块,各成员内存池从上述公共内存池申请可用内存块时,涉及加锁操作。一次加锁,可以转移多个可用内存块到上述成员内存池,相比现有方案中每次加锁只能转移一个内存块,降低了加锁的概率,从而减少了加锁产生的系统开销。
当然,如果无法从上述公共内存池找到可用内存块,内存管理模块可以向内存池外部(比如:伙伴算法)申请可用内存块。具体可参照现有相关技术,在此不再赘述。
在本申请实施例中,内存管理模块除了为本申请的各个CPU分别创建不同的内存池以外,还可以创建公共页框内存池,并为本设备的各个CPU分别创建不同的页框内存池。
参见图5,为本申请示出的另一种内存池的架构图,如图5所示,同一个CPU被创建属于各内存池组的成员内存池外,还被创建页框内存池。页框内存池可以为对应于同一CPU的各成员内存池提供可用页框,以由各成员内存池基于新的可用页框拆分出新的可用内存块。
参见图6,为本申请示出的一种页框内存池的结构示意图,如图6所示,各CPU分别被创建对应的页框内存池,公共页框内存池可以为各CPU对应的页框内存池提供可用页框。图6中的管理信息包括各CPU对应的页框内存池的管理信息和公共页框内存池的管理信息。其中,管理信息包括可用页框的地址和数量。
若上述第一CPU的内存池中未找到满足上述内存分配请求的可用内存块,内存管理模块可以检测上述第一CPU的页框内存池中是否存在可用页框。
一方面,如果存在可用页框,内存管理模块可以将上述可用页框加入到上述第一CPU的成员内存池,形成可用内存块,然后从上述成员内存池中找到满足上述内存分配请求的可用内存块,并返回上述可用内存块给发送上述内部分配请求的来源。
比如:内存管理模块接收到针对CPU1的内存分配请求,该内存分配请求所请求的内存块大小为32字节,可以选择CPU1对应的包含32字节的内存块的成员内存池。内存管理模块检查后,确定该成员内存池中不存在可用内存块,进一步确定CPU1的页框内存池中是否存在可用页框。如果存在可用页框,可以将上述可用页框加入到上述成员内存池,形成多个32字节的可用内存块,然后选择一个可用内存块,将该可用内存块的地址返回至发送上述内存分配请求的来源。
此外,内存管理模块还可以更新上述第一CPU的页框内存池的管理信息(包括:移除上述可用页框的地址,将可用页框的个数减一),以及,上述第一CPU的成员内存池的管理信息(包括:移入上述可用页框拆分出的可用内存块的地址,增加上述可用页框拆分出的可用内存块的个数,以及,移除一个可用内存块的地址,将可用内存块的个数减一)。
作为一种实施例,内存管理模块将可用页框加入到成员内存池后,可以记录上述可用页框的地址和成员内存池所属的内存池组的标识的映射关系。其中,内存池组的标识可以是成员内存池中的可用内存块的大小。
另一方面,如果不存在可用页框,内存管理模块可以从上述公共页框内存池中找到可用页框,并将上述可用页框加入到上述第一CPU的页框内存池,进一步地,将上述可用页框加入到上述第一CPU的成员内存池(当然,若从上述公共页框内存池转移多个可用页框到上述第一CPU的页框内存池,可以从多个可用页框中选择一个可用页框加入到上述第一CPU的成员内存池),形成可用内存块,然后从上述成员内存池中找到满足上述内存分配请求的可用内存块,并返回上述可用内存块给发送上述内存分配请求的来源。
此外,内存管理模块还可以更新上述公共页框内存池的管理信息、上述第一CPU的页框内存池的管理信息和上述第一CPU的成员内存池的管理信息。
由于各CPU的页框内存池可以为对应于同一CPU的所有成员内存池提供可用页框,各成员内存池从页框内存池申请可用页框时,无需加锁操作,减少了大量系统开销。此外,页框内存池的存在提高了各CPU对应的内存池所能分配的内存大小,提升了系统性能。
需要指出的是,公共页框内存池为对应于多个CPU的页框内存池提供可用页框,因此,在可用页框转移的过程中涉及加锁操作。一次加锁,可以转移多个可用页框,降低了加锁的概率,实际产生的系统开销非常小,改进了系统性能。
当然,如果无法从上述公共页框内存池找到可用页框,内存管理模块可以向内存池外部申请可用页框。具体可参照现有相关技术,在此不再赘述。
在本申请实施例中,内存管理模块接收到针对上述第一CPU的内存释放请求,可以基于上述内存释放请求从上述第一CPU的多个成员内存池中找到需要释放内存块的成员内存池。
在示出的一种实施方式中,上述内存释放请求携带需要释放的内存块的大小,在这种情况下,内存管理模块可以基于需要释放的内存块的大小找到需要释放的内存块的成员内存池。
比如:内存管理模块接收到针对CPU1的内存释放请求,其中,该内存释放请求携带的需要释放的内存块的大小为64字节。内存管理模块可以从CPU1对应的包括32字节的内存块的成员内存池、包括64字节的内存块的成员内存池和包括128字节的内存块的成员内存池中,选择包括64字节的内存块的成员内存池。
在示出的另一种实施方式中,上述内存释放请求未携带需要释放的内存块的大小,在这种情况下,内存管理模块可以基于上述内存释放请求携带的需要释放的内存块的地址计算出该内存块所属的页框的地址(该计算过程可参照现有相关技术),然后基于页框的地址查找已记录的页框的地址和成员内存池所属的内存池组的标识的映射关系,进而根据内存池组的标识找到需要释放内存块的成员内存池。
比如:内存管理模块接收到针对CPU1的内存释放请求,其中,该内存释放请求携带的需要释放的内存块的地址为AA,经计算,确定该内存块所属的页框的地址为BB,并查找已记录的映射关系,找到成员内存池所属的内存池组的标识为32字节,选择包括32字节的内存块的成员内存池。
进一步地,内存管理模块可以确定上述成员内存池中的可用内存块的数量是否达到预设的第一阈值。其中,该第一阈值表示上述成员内存池最多可包含的可用内存块的数量,该第一阈值可基于实际应用环境配置。
如果上述成员内存池中的可用内存块的数量未达到上述第一阈值,则可以将上述内存释放请求中的内存块加入到上述成员内存池。
此外,还可以更新上述成员内存池的管理信息(包括:移入上述内存释放请求中的内存块的地址,将可用内存块的个数加一)。
需要指出的是,若针对上述第一CPU的成员内存池中的可用内存块始终能满足针对上述第一CPU的内存分配请求和内存释放请求,即针对上述第一CPU的成员内存池的内存分配请求和内存释放请求接近平衡,则无需从成员内存池外部申请新的可用内存块,也无需向成员内存池外部释放内存块。在这种情况下,无需任何加锁操作。
如果上述成员内存池中的可用内存块的数量达到上述第一阈值,说明上述成员内存池已满,无法向上述成员内存池释放内存块。在这种情况下,内存管理模块可以确定上述成员内存池对应的公共内存池中的可用内存块的数量是否达到预设的第二阈值。其中,该第二阈值表示上述公共内存池最多可包含的可用内存块的数量,该第二阈值可基于实际应用环境配置。
一方面,上述公共内存池中的可用内存块的数量未达到上述第二阈值,内存管理模块可以选择上述成员内存池中预设数量的可用内存块加入到上述公共内存池。进一步地,内存管理模块可以将上述内存释放请求中的内存块加入到上述公共内存池,或者,可以将上述内存释放请求中的内存块加入到上述成员内存池。
此外,内存管理模块还可以更新上述公共内存池和上述成员内存池的管理信息。
另一方面,上述公共内存池中的可用内存块的数量达到上述第二阈值,内存管理模块可以确定上述第一CPU的页框内存池中的可用页框的数量是否达到预设的第三阈值。其中,该第三阈值表示上述页框内存池最多可包含的可用页框的数量,该第三阈值可基于实际应用环境配置。
作为一种实施例,如果上述第一CPU的页框内存池中的可用页框的数量未达到上述第三阈值,可以将上述公共内存池中隶属于同一页框的多个可用内存块加入到上述第一CPU的页框内存池。此时,上述公共内存池可以加入新的可用内存块,因此,可以将上述成员内存池中的预设数量的可用内存块加入到上述公共内存池,进一步地,可以将上述内存释放请求中的内存块加入到上述公共内存池。当然,上述成员内存池中的预设数量的可用内存块被加入到上述公共内存池后,可以将上述内存释放请求中的内存块加入到上述成员内存池。
此外,内存管理模块还可以更新上述第一CPU的页框内存池、上述公共内存池和上述成员内存池的管理信息。
作为另一种实施例,如果上述第一CPU的页框内存池中的可用页框的数量达到上述第三阈值,则可以将上述页框内存池中的预设数量的可用页框加入到上述公共页框内存池。此时,上述页框内存池可以加入新的可用页框,因此,将上述公共内存池中隶属于同一页框的多个可用内存池加入到上述页框内存池。
进一步地,将上述成员内存池中的预设数量的可用内存块加入到上述公共内存池,然后将上述内存释放请求中的内存块加入到上述公共内存池。当然,上述成员内存池中的预设数量的可用内存块被加入到上述公共内存池后,可以将上述内存释放请求中的内存块加入到上述成员内存池。
此外,内存管理模块还可以更新上述公共页框内存池、上述第一CPU的页框内存池、上述公共内存池和上述成员内存池的管理信息。
需要指出的是,内存管理模块将上述公共内存池中隶属于同一页框的多个可用内存块加入到上述页框内存池时,是将多个可用内存块组成的完整页框加入到上述页框内存池。在实际应用中,当上述公共内存池中的可用内存池的数量达到上述第二阈值,上述公共内存池中的可用内存块可能无法组成完整页框。此时,内存管理模块可以选择隶属于同一页框的多个可用内存块组成不完整的页框,组成不完整的页框的可用内存块的地址和数量从上述公共内存池的管理信息中移除。后续当上述公共内存池中没有可用内存块时,内存管理模块优先从上述不完整的页框中获取可用内存块重新加入到上述公共内存池。
内存管理模块在向上述第一CPU的成员内存池释放内存块时,无需加锁操作;在向公共内存池释放内存块时,需要加锁操作;从公共内存池向页框内存池释放隶属于同一页框的多个可用内存块时,需要加锁操作;从页框内存池向公共页框内存池释放可用页框时,需要加锁操作。
由于成员内存池本身可包括的可用内存池的数量很大,多数情况下,无需加锁;而在加锁的环节中,由于一次加锁可以释放多个可用内存块或可用页框,因此,在本申请实施例中,释放内存的过程中产生的加锁开销非常小。
综上所述,在本申请实施例中,内存管理模块为本设备的各个CPU分别创建不同的内存池,当接收到针对第一CPU的内存分配请求时,可以从上述第一CPU的内存池找到满足上述内存分配请求的可用内存块,然后返回上述可用内存块给发送上述内存分配请求的来源;
由于各CPU分别被创建内存池,相比现有的内存池的机制,内存池不再是多个CPU共用,内存管理模块可以对针对不同CPU的内存池的访问请求进行并行操作,从而分散获取或释放同一大小的内存块的访问请求,进而节省了因大量竞争而产生的系统开销;而各CPU上的进程(业务)不再独立创建内存池,而是统一创建,避免了因内存池未经同一管理造成的内存利用率低的问题;
另外,本申请中,通过分层级地设置内存池,在公共页框内存池与页框内存池之间、页框内存池与成员内存池之间、页框内存池与公共内存池之间、公共内存池与成员内存池之间,加锁后可以转移多个可用内存块或可用页框,显著提高了内存分配的效率,减少了加锁产生的系统开销,提升了系统性能。
与前述内存分配的方法的实施例相对应,本申请还提供了内存分配的装置的实施例。需要指出的是,内存分配的装置即为上述内存管理模块。
参见图7,为本申请示出的一种内存分配的装置的实施例框图:
如图7所示,该内存分配的装置70,包括:
创建单元710,用于为本设备的各个CPU分别创建不同的内存池。
分配单元720,用于当接收到针对第一CPU的内存分配请求时,从所述第一CPU的内存池中找到满足所述内存分配请求的可用内存块,并返回所述可用内存块给发送所述内存分配请求的来源。
在本例中,所述创建单元710,进一步用于:
为各个CPU被创建的成员内存池所在的内存池组创建对应的公共内存池。
所述分配单元720,进一步用于:
若从所述第一CPU的内存池中未找到满足所述内存分配请求的可用内存块,从所述第一CPU的成员内存池对应的公共内存池找到满足所述内存分配请求的可用内存块;
将所述可用内存块加入到所述第一CPU的成员内存池,并返回所述可用内存块给发送所述内存分配请求的来源。
在本例中,所述创建单元710,进一步用于:
创建公共页框内存池,并为本设备的各个CPU分别创建不同的页框内存池。
所述分配单元720,进一步用于:
若从所述第一CPU的内存池中未找到满足所述内存分配请求的可用内存块,检测所述第一CPU的页框内存池中是否存在可用页框;
若存在,将所述可用页框加入到所述第一CPU的成员内存池,并从所述成员内存池中找到满足所述内存分配请求的可用内存块;返回所述可用内存块给发送所述内存分配请求的来源;
若不存在,从所述公共页框内存池中找到可用页框,并将所述可用页框加入到所述第一CPU的页框内存池;将所述可用页框加入到所述第一CPU的成员内存池,并从所述成员内存池中找到满足所述内存分配请求的可用内存块;返回所述可用内存块给发送所述内存分配请求的来源。
在本例中,所述装置还包括:
查找单元730(图中未示出),用于当接收到针对所述第一CPU的内存释放请求,基于所述内存释放请求从所述第一CPU的多个成员内存池中找到需要释放内存块的成员内存池。
确定单元740(图中未示出),用于确定所述成员内存池中的可用内存块的数量是否达到预设的第一阈值。
释放单元750(图中未示出),用于如果未达到所述第一阈值,将所述内存释放请求中的内存块加入到所述成员内存池。
在本例中,所述释放单元750(图中未示出),进一步用于:
如果所述成员内存池中的可用内存块的数量达到所述第一阈值,确定所述成员内存池对应的公共内存池中的可用内存块的数量是否达到预设的第二阈值;
如果未达到所述第二阈值,选择所述成员内存池中的预设数量的可用内存块加入到所述公共内存池,并将所述内存释放请求中的内存块加入到所述公共内存池;
如果达到所述第二阈值,确定所述第一CPU的页框内存池中的可用页框的数量是否达到预设的第三阈值;
如果未达到所述第三阈值,将所述公共内存池中隶属于同一页框的多个可用内存块加入到所述第一CPU的页框内存池;将所述成员内存池中的预设数量的可用内存块加入到所述公共内存池,并将所述内存释放请求中的内存块加入到所述公共内存池;
如果达到所述第三阈值,选择所述第一CPU的页框内存池中的预设数量的可用页框加入到所述公共页框内存池;将所述公共内存池中隶属于同一页框的多个可用内存块加入到所述第一CPU的页框内存池;将所述成员内存池中的预设数量的可用内存块加入到所述公共内存池,并将所述内存释放请求中的内存块加入到所述公共内存池。
本申请内存分配的装置的实施例可以应用在网络设备上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在网络设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图8所示,为本申请内存分配的装置所在网络设备的一种硬件结构图,除了图8所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的网络设备通常根据该内存分配的装置的实际功能,还可以包括其他硬件,对此不再赘述。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
Claims (10)
1.一种内存分配的方法,所述方法应用于网络设备,其特征在于,所述方法包括:
为本设备的各个CPU分别创建不同的内存池;
当接收到针对第一CPU的内存分配请求时,从所述第一CPU的内存池中找到满足所述内存分配请求的可用内存块,并返回所述可用内存块给发送所述内存分配请求的来源。
2.根据权利要求1所述的方法,其特征在于,各个CPU被创建的不同内存池包括:不同内存池组中的不同成员内存池;
其中,各个CPU被创建的成员内存池中的可用内存块不局限于同一页框;
属于同一内存池组的不同成员内存池中的可用内存块的大小相同。
3.根据权利要求2所述的方法,其特征在于,所述为本设备的各个CPU分别创建不同的内存池,进一步包括:
为各个CPU被创建的成员内存池所在的内存池组创建对应的公共内存池;
若从所述第一CPU的内存池中未找到满足所述内存分配请求的可用内存块,该方法进一步包括:
从所述第一CPU的成员内存池对应的公共内存池找到满足所述内存分配请求的可用内存块;
将所述可用内存块加入到所述第一CPU的成员内存池,并返回所述可用内存块给发送所述内存分配请求的来源。
4.根据权利要求1所述的方法,其特征在于,所述为本设备的各个CPU分别创建不同的内存池进一步包括:
创建公共页框内存池,并为本设备的各个CPU分别创建不同的页框内存池;
若从所述第一CPU的内存池中未找到满足所述内存分配请求的可用内存块,该方法进一步包括:
检测所述第一CPU的页框内存池中是否存在可用页框;
若存在,将所述可用页框加入到所述第一CPU的成员内存池,并从所述成员内存池中找到满足所述内存分配请求的可用内存块;返回所述可用内存块给发送所述内存分配请求的来源;
若不存在,从所述公共页框内存池中找到可用页框,并将所述可用页框加入到所述第一CPU的页框内存池;将所述可用页框加入到所述第一CPU的成员内存池,并从所述成员内存池中找到满足所述内存分配请求的可用内存块;返回所述可用内存块给发送所述内存分配请求的来源。
5.根据权利要求3或4所述的方法,其特征在于,所述方法进一步包括:
当接收到针对所述第一CPU的内存释放请求,基于所述内存释放请求从所述第一CPU的多个成员内存池中找到需要释放内存块的成员内存池;
确定所述成员内存池中的可用内存块的数量是否达到预设的第一阈值;
如果未达到所述第一阈值,将所述内存释放请求中的内存块加入到所述成员内存池。
6.根据权利要求5所述的方法,其特征在于,所述方法进一步包括:
如果所述成员内存池中的可用内存块的数量达到所述第一阈值,确定所述成员内存池对应的公共内存池中的可用内存块的数量是否达到预设的第二阈值;
如果未达到所述第二阈值,选择所述成员内存池中的预设数量的可用内存块加入到所述公共内存池,并将所述内存释放请求中的内存块加入到所述公共内存池;
如果达到所述第二阈值,确定所述第一CPU的页框内存池中的可用页框的数量是否达到预设的第三阈值;
如果未达到所述第三阈值,将所述公共内存池中隶属于同一页框的多个可用内存块加入到所述第一CPU的页框内存池;将所述成员内存池中的预设数量的可用内存块加入到所述公共内存池,并将所述内存释放请求中的内存块加入到所述公共内存池;
如果达到所述第三阈值,选择所述第一CPU的页框内存池中的预设数量的可用页框加入到所述公共页框内存池;将所述公共内存池中隶属于同一页框的多个可用内存块加入到所述第一CPU的页框内存池;将所述成员内存池中的预设数量的可用内存块加入到所述公共内存池,并将所述内存释放请求中的内存块加入到所述公共内存池。
7.一种内存分配的装置,所述方法应用于网络设备,其特征在于,所述方法包括:
创建单元,用于为本设备的各个CPU分别创建不同的内存池;
分配单元,用于当接收到针对第一CPU的内存分配请求时,从所述第一CPU的内存池中找到满足所述内存分配请求的可用内存块,并返回所述可用内存块给发送所述内存分配请求的来源。
8.根据权利要求7所述的装置,其特征在于,所述创建单元,进一步用于:
为各个CPU被创建的成员内存池所在的内存池组创建对应的公共内存池;
所述分配单元,进一步用于:
若从所述第一CPU的内存池中未找到满足所述内存分配请求的可用内存块,从所述第一CPU的成员内存池对应的公共内存池找到满足所述内存分配请求的可用内存块;
将所述可用内存块加入到所述第一CPU的成员内存池,并返回所述可用内存块给发送所述内存分配请求的来源。
9.根据权利要求7所述的装置,其特征在于,所述创建单元,进一步用于:
创建公共页框内存池,并为本设备的各个CPU分别创建不同的页框内存池;
所述分配单元,进一步用于:
若从所述第一CPU的内存池中未找到满足所述内存分配请求的可用内存块,检测所述第一CPU的页框内存池中是否存在可用页框;
若存在,将所述可用页框加入到所述第一CPU的成员内存池,并从所述成员内存池中找到满足所述内存分配请求的可用内存块;返回所述可用内存块给发送所述内存分配请求的来源;
若不存在,从所述公共页框内存池中找到可用页框,并将所述可用页框加入到所述第一CPU的页框内存池;将所述可用页框加入到所述第一CPU的成员内存池,并从所述成员内存池中找到满足所述内存分配请求的可用内存块;返回所述可用内存块给发送所述内存分配请求的来源。
10.根据权利要求8或9所述的装置,其特征在于,所述装置还包括:
查找单元,用于当接收到针对所述第一CPU的内存释放请求,基于所述内存释放请求从所述第一CPU的多个成员内存池中找到需要释放内存块的成员内存池;
确定单元,用于确定所述成员内存池中的可用内存块的数量是否达到预设的第一阈值;
释放单元,用于如果未达到所述第一阈值,将所述内存释放请求中的内存块加入到所述成员内存池。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810146149.9A CN110162395B (zh) | 2018-02-12 | 2018-02-12 | 一种内存分配的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810146149.9A CN110162395B (zh) | 2018-02-12 | 2018-02-12 | 一种内存分配的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110162395A true CN110162395A (zh) | 2019-08-23 |
CN110162395B CN110162395B (zh) | 2021-07-20 |
Family
ID=67634993
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810146149.9A Active CN110162395B (zh) | 2018-02-12 | 2018-02-12 | 一种内存分配的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110162395B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110874269A (zh) * | 2019-11-07 | 2020-03-10 | 北京云杉世纪网络科技有限公司 | 高性能Golang内存池的实现方法、装置与电子设备 |
CN113553195A (zh) * | 2021-09-22 | 2021-10-26 | 苏州浪潮智能科技有限公司 | 一种内存池资源共用的方法、装置、设备及可读介质 |
CN116450055A (zh) * | 2023-06-15 | 2023-07-18 | 支付宝(杭州)信息技术有限公司 | 一种多处理卡间的存储区域分配方法和系统 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1722106A (zh) * | 2004-07-13 | 2006-01-18 | 中兴通讯股份有限公司 | 一种嵌入式实时操作系统中内存分配的方法 |
CN101799773A (zh) * | 2010-04-07 | 2010-08-11 | 福州福昕软件开发有限公司 | 并行计算的内存访问方法 |
CN102096594A (zh) * | 2009-12-14 | 2011-06-15 | 联想(北京)有限公司 | 使用内存中系统资源的方法、虚拟机管理器及计算机 |
CN103810115A (zh) * | 2012-11-15 | 2014-05-21 | 深圳市腾讯计算机系统有限公司 | 一种内存池的管理方法和装置 |
CN105701019A (zh) * | 2014-11-25 | 2016-06-22 | 阿里巴巴集团控股有限公司 | 一种内存管理方法以及装置 |
US20170331759A1 (en) * | 2016-05-16 | 2017-11-16 | International Business Machines Corporation | Sla-based agile resource provisioning in disaggregated computing systems |
-
2018
- 2018-02-12 CN CN201810146149.9A patent/CN110162395B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1722106A (zh) * | 2004-07-13 | 2006-01-18 | 中兴通讯股份有限公司 | 一种嵌入式实时操作系统中内存分配的方法 |
CN102096594A (zh) * | 2009-12-14 | 2011-06-15 | 联想(北京)有限公司 | 使用内存中系统资源的方法、虚拟机管理器及计算机 |
CN101799773A (zh) * | 2010-04-07 | 2010-08-11 | 福州福昕软件开发有限公司 | 并行计算的内存访问方法 |
CN103810115A (zh) * | 2012-11-15 | 2014-05-21 | 深圳市腾讯计算机系统有限公司 | 一种内存池的管理方法和装置 |
CN105701019A (zh) * | 2014-11-25 | 2016-06-22 | 阿里巴巴集团控股有限公司 | 一种内存管理方法以及装置 |
US20170331759A1 (en) * | 2016-05-16 | 2017-11-16 | International Business Machines Corporation | Sla-based agile resource provisioning in disaggregated computing systems |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110874269A (zh) * | 2019-11-07 | 2020-03-10 | 北京云杉世纪网络科技有限公司 | 高性能Golang内存池的实现方法、装置与电子设备 |
CN113553195A (zh) * | 2021-09-22 | 2021-10-26 | 苏州浪潮智能科技有限公司 | 一种内存池资源共用的方法、装置、设备及可读介质 |
CN116450055A (zh) * | 2023-06-15 | 2023-07-18 | 支付宝(杭州)信息技术有限公司 | 一种多处理卡间的存储区域分配方法和系统 |
CN116450055B (zh) * | 2023-06-15 | 2023-10-27 | 支付宝(杭州)信息技术有限公司 | 一种多处理卡间的存储区域分配方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN110162395B (zh) | 2021-07-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5510556B2 (ja) | 仮想マシンのストレージスペースおよび物理ホストを管理するための方法およびシステム | |
KR101994021B1 (ko) | 파일 조작 방법 및 장치 | |
US9372880B2 (en) | Reclamation of empty pages in database tables | |
US8850156B2 (en) | Method and system for managing virtual machine storage space and physical host | |
US20130263117A1 (en) | Allocating resources to virtual machines via a weighted cost ratio | |
CN109241178A (zh) | 管理存储空间的方法和装置 | |
US10235047B2 (en) | Memory management method, apparatus, and system | |
CN110162395A (zh) | 一种内存分配的方法及装置 | |
JP6748653B2 (ja) | カラム・ストアにおける挿入およびポイント・クエリ・オペレーションの効率的パフォーマンス | |
CN103412822A (zh) | 操作非易失性内存和数据操作的方法和相关装置 | |
US12008402B2 (en) | Determining computer resource usage at multiple levels of a container orchestration system hierarchy | |
CN112148467A (zh) | 计算资源的动态分配 | |
CN116955219B (zh) | 一种数据镜像方法、装置、主机及存储介质 | |
CN108604231A (zh) | 镜像处理方法以及计算设备 | |
CN114327862B (zh) | 一种内存分配方法、装置、电子设备及存储介质 | |
US20220383219A1 (en) | Access processing method, device, storage medium and program product | |
CN110750221A (zh) | 卷克隆方法、装置、电子设备及机器可读存储介质 | |
CN115829826A (zh) | 模型存储优化方法及电子设备 | |
CN110019113B (zh) | 一种数据库的业务处理方法及数据库服务器 | |
CN113741787B (zh) | 一种数据存储方法、装置、设备、介质 | |
CN114168306B (zh) | 调度方法及调度装置 | |
US11334246B2 (en) | Nanoservices—a programming design pattern for managing the state of fine-grained object instances | |
CN115861513B (zh) | 数据渲染方法、装置、计算机及可读存储介质 | |
CN113918530B (zh) | 分布式锁的实现方法、装置、电子设备及介质 | |
CN110019057A (zh) | 请求处理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |