CN111708638B - 内存分配方法、装置、设备及存储介质 - Google Patents
内存分配方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN111708638B CN111708638B CN202010562873.7A CN202010562873A CN111708638B CN 111708638 B CN111708638 B CN 111708638B CN 202010562873 A CN202010562873 A CN 202010562873A CN 111708638 B CN111708638 B CN 111708638B
- Authority
- CN
- China
- Prior art keywords
- memory
- virtual
- allocation function
- memory allocation
- space
- 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.)
- Active
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
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
本申请提供一种内存分配方法、装置、设备及存储介质,涉及内存分配技术领域。该方法包括:获取来自应用端的内存分配请求;若内存分配请求所申请的内存量满足预设条件,则从第一内存分配函数的虚拟内存空间中分配内存量的第一虚拟内存,第一内存分配函数为连续内存分配函数;根据第一虚拟内存,调用第一内存分配函数,以向内核申请第一虚拟内存对应的物理内存;若内存量不满足预设条件,则从红黑树的虚拟内存空间中分配内存量的第二虚拟内存;根据第二虚拟内存,调用第二内存分配函数,以向内核申请第二虚拟内存对应的物理内存;第二内存分配函数为不连续内存的分配函数。相对于现有技术,避免了执行效率不高,性能下降的问题。
Description
技术领域
本申请涉及内存分配技术领域,具体而言,涉及一种内存分配方法、装置、设备及存储介质。
背景技术
C函数库(Libc)是所有操作系统必备的应用端的函数库。核会提供内存分配函数,通过调用该内存分配函数可实现内存的分配。
现有技术中,大多操作系统的内存分配器可同时使用多个内存分配函数申请内存。无论是采用哪个内存分配函数申请内存,其均需基于整个内核的内存空间进行分配。由于是基于整个内核的内存空间进行分配,那么在一个内存分配函数进行内存申请时,需先对该内核的内存空间进行锁定,待内存申请结束,才能解锁。
但是这样的内存申请方式,基于内核的内存空间进行分配时,内核的内存空间的锁定,会使得内存申请的并行性受到影响,从而影响应用端的功能实现。
发明内容
本申请的目的在于,针对上述现有技术中的不足,提供一种内存分配方法、装置、设备及存储介质,以解决现有技术中执行效率不高,性能下降的问题。
为实现上述目的,本申请实施例采用的技术方案如下:
第一方面,本申请一实施例提供了一种内存分配方法,所述方法包括:
获取来自应用端的内存分配请求;
若所述内存分配请求所申请的内存量满足预设条件,则从第一内存分配函数的虚拟内存空间中分配所述内存量的第一虚拟内存;其中,所述第一内存分配函数为连续内存的分配函数;
根据所述第一虚拟内存,调用所述第一内存分配函数,以向内核申请所述第一虚拟内存对应的物理内存;
若所述内存量不满足所述预设条件,则从红黑树的虚拟内存空间中分配所述内存量的第二虚拟内存;
根据所述第二虚拟内存,调用第二内存分配函数,以向内核申请所述第二虚拟内存对应的物理内存;其中,所述第二内存分配函数为不连续内存的分配函数。
可选地,所述获取来自应用端的内存分配请求之后,所述方法还包括:
根据预设的内存阈值,确定所述内存量是否满足预设条件;
若所述内存量小于或等于所述内存阈值,则确定所述内存量满足所述预设条件;
若所述内存量大于所述内存阈值,则确定所述内存量不满足所述预设条件。
可选地,所述方法还包括:
对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定,所述弹性内存空间为所述应用端请求扩张或收缩的内存空间。
可选地,所述对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定,包括:
若所述应用端请求扩张或收缩的频率大于或等于预设频率,则对所述第一内存分配函数的内存空间中的弹性内存空间进行锁定。
可选地,所述对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定,包括:
采用所述第一内存分配函数对应的私有锁,对所述弹性内存空间进行锁定。
可选地,所述从红黑树的虚拟内存空间分配所述内存量的第二虚拟内存之前,所述方法还包括:
采用全局锁,对所述第二虚拟内存进行锁定。
可选地,所述第一内存分配函数的虚拟内存空间大于或等于预设虚拟内存空间。
第二方面,本申请另一实施例提供了一种内存分配装置,所述装置包括:获取模块、分配模块和调用模块,其中:
所述获取模块,用于获取来自应用端的内存分配请求;
所述分配模块,用于若所述内存分配请求所申请的内存量满足预设条件,则从第一内存分配函数的虚拟内存空间中分配所述内存量的第一虚拟内存,其中,所述第一内存分配函数为连续内存的分配函数;
所述调用模块,用于根据所述第一虚拟内存,调用所述第一内存分配函数,以向内核申请所述第一虚拟内存对应的物理内存;
所述分配模块,具体用于若所述内存量不满足所述预设条件,则从红黑树的虚拟内存空间分配所述内存量的第二虚拟内存;
所述调用模块,具体用于根据所述第二虚拟内存,调用第二内存分配函数,以向内核申请所述第二虚拟内存对应的物理内存,其中,所述第二内存分配函数为不连续内存的分配函数。
可选地,所述装置还包括:确定模块,用于根据预设的内存阈值,确定所述内存量是否满足预设条件;
所述确定模块,还用于若所述内存量小于或等于所述内存阈值,则确定所述内存量满足所述预设条件;
所述确定模块,还用于若所述内存量大于所述内存阈值,则确定所述内存量不满足所述预设条件。
可选地,所述装置还包括:锁定模块,用于对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定,所述弹性内存空间为所述应用端请求扩张或收缩的内存空间。
可选地,所述锁定模块,还用于若所述应用端请求扩张或收缩的频率大于或等于预设频率,则对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定。
可选地,所述锁定模块,还用于采用所述第一内存分配函数对应的私有锁,对所述弹性内存空间进行锁定。
可选地,所述锁定模块,还用于采用全局锁,对所述第二虚拟内存进行锁定。
第三方面,本申请另一实施例提供了一种内存分配设备,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当内存分配设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行如上述第一方面任一所述方法的步骤。
第四方面,本申请另一实施例提供了一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如上述第一方面任一所述方法的步骤。
本申请的有益效果是:采用本申请提供的内存分配方法,可在应用端的内存分配请求所申请的内存量满足预设条件时,则采用第一内存分配函数申请内存,并且,采用该第一内存分配函数申请内存时,可从第一内存分配函数的虚拟内存空间直接分配对应的虚拟内存,继而调用该第一内存分配函数,向内核申请对应的物理内存,实现内存的申请;内存分配请求所申请的内存量不满足预设条件时,则从红黑树的虚拟内存空间中申请第二虚拟内存,并根据第二虚拟内存调用第二内存分配函数,以向内核申请对应的物理内存。由于该内存分配方法中,可基于内存分配请求所申请的内存量确定采用的内存分配函数,继而基于该内存分配函数的内存空间申请内存,在内存分配请求所申请的内存量满足预设条件时,无需基于内核的内存空间进行分配,也无需对内核的内存空间进行锁定,有效保证内存申请的并行性,从而保证应用端的功能实现。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请一实施例提供的内存分配方法的流程示意图;
图2为本申请另一实施例提供的内存分配方法的流程示意图;
图3为本申请另一实施例提供的内存分配方法的流程示意图;
图4为本申请一实施例提供的内存分配装置的结构示意图;
图5为本申请另一实施例提供的内存分配装置的结构示意图;
图6为本申请另一实施例提供的内存分配装置的结构示意图;
图7为本申请一实施例提供的内存分配设备的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。
为方便对本申请的理解,首先对本申请中涉及的一些名词进行解释:
Linux:全称GNU/Linux,是一套类UNIX操作系统,可支持多用户、多任务、多线程和多处理器(CPU)的操作系统。
虚拟内存区域(Virtual Memory Areas,VMA):在操作系统的内核中,这样的虚拟内存区域就是一块连续的线性地址空间的抽象,又称线性区,表示一个线性区间,它拥有自身的权限(可读,可写,可执行等),每一个虚拟内存区域都由一个相关的虚拟内存结构(vm_area_struct)来描述。
红黑树(Red Black Tree):一种自平衡二叉查找树,为了提高查找速度,对VMA的管理在传统的双向链表的基础上,加入了红黑树,每个VMA是某个进程的一段连续虚拟空间,其中的单元具有相同的特征,所有的虚拟区域按照地址排序由指针链接为一个链表。当发生缺页中断时,搜索VMA到指定区域时,则需要频繁操作,所以在VMA的管理中加入了红黑树以减少查找时间。
内存空间:用于保存进程运行时的程序和数据,也称可执行存储器。在计算机中,内存空间一般是指主存储器空间(物理地址空间)或系统为一个用户程序分配内存空间。扩展内存空间的方法一般有增加内存大小和虚拟内存。
物理内存(Physical memory):是相对于虚拟内存而言实现的,是指通过物理内存条而获得的内存空间,是内核中物理内存,还可称为物理内存页。
本申请的一个方面涉及一种内存分配方法,该方法应用于为应用端的内存分配请求分配内存的过程中,其中,在本申请的一个实施例中,该方法应用于任一操作系统的内存管理的场景下,该方法可以对内存分配请求所申请的内存量进行判断,若申请的内存量满足预设条件,则从第一内存分配函数的内存空间中分配内存量的第一虚拟内存,并根据第一虚拟内存,调用第一内存分配函数,以向内核申请第一虚拟内存对应的物理内存。
值得注意的是,在本申请提出申请之前,预设操作系统如linux操作系统中内存大部分由堆内存提供。该预设操作系统中的内存分配器都会提供堆内存,内核会提供堆内存管理的接口,在处理内存分配请求时,通过该内存分配请求对应的访问接口,确定对应的分配函数,从而实现堆内存的分配。在该预设操作系统中,堆内存管理的接口可以为包括:连续内存分配函数如brk函数或不连续内存分配函数如mmap函数。但是这样的设置方式假设多个线程同时在调用内存分配函数,虽然理论上多个线程彼此之间是互不影响的,但实际上他们在内核中互斥的执行(即串行执行,每个请求需要依次执行)。
如下结合多个具体的应用示例,对本申请实施例所提供的内存分配方法进行解释说明。图1为本申请一实施例提供的一种内存分配方法的流程示意图,在本申请的一个实施例中,执行主体可以为服务器或终端设备,其中:终端设备可以为移动终端设备、平板电脑、可穿戴智能设备或笔记本电脑等,只需为具有预设操作系统的终端设备即可,下述方法均以执行主体为终端设备为例进行说明,如图1所示,该方法包括:
S101:获取来自应用端的内存分配请求。
在本申请的一个实施例中,内存分配请求可以为应用端在运行过程中,由该应用端的应用进程或线程所触发的内存分配请求。通过应用端发起的内存分配请求,向内核申请内存,用以基于分配得到的内存实现该应用端中该应用进程或线程的内存需求。该应用进程例或线程例如可以为应用端的页面加载、资源加载或者资源下载等涉及数据下载的进程或线程。
S102:若内存分配请求所申请的内存量满足预设条件,则从第一内存分配函数的虚拟内存空间中分配内存量的第一虚拟内存。
其中,第一内存分配函数为连续内存的分配函数;且不存在于红黑树中,因此第一内存分配函数可以基于内存分配请求所申请的内存量确定采用的内存分配函数,继而基于该内存非配函数的虚拟内存空间申请内存,无需基于红黑树的虚拟内存空间分配内存,也无需对红黑树的虚拟内存空间进行锁定,从而采用第一分配函数可以保证内存申请的并行执行,即可以同时处理多个内存分配请求。
可选地,在本申请的一个实施例中,预设条件可以为:若内存分配请求所申请的内存量小于预设阈值,则从第一内存分配函数的虚拟内存空间中分配内存量的第一虚拟内存。其中,预设阈值可以根据用户需要调整,可以通过将预设阈值调高的方式,使得大部分内存分配请求所申请的内存量均小于该预设阈值,即大部分内存分配请求均由第一内存分配函数执行。
示例地,在本申请的一个实施例中,可以将预设阈值设置为无限大,这样所有的内存分配请求均会由第一内存分配函数执行,但是具体预设阈值大小的设置可以根据用户需要设置,预设阈值设置的越大,越多内存分配请求会由第一内存分配函数执行,预设阈值设置的越小,由第一内存分配函数执行的内存分配请求就越少,所以为了执行效率更高,预设阈值设置的越大越好,但是具体预设阈值的大小设置可以根据用户的需要调整,并不以上述实施例给出的为限。
可选地,本申请的一个实施例中,若第一内存分配函数执行当前内存分配请求失败,可以再由其他内存分配函数执行;或第一内存分配函数执行当前内存分配请求失败,则重新发起请求,再次由第一内存分配函数执行,直至执行相同的内存分配请求失败的次数超过预设阈值时,将该请求移交至其他内存分配函数执行。具体预设条件的设置可以根据用户需要设计,并不以上述两个实施例给出的为限,只需使得大部分内存分配请求均可满足预设条件即可,即实现大部分内存分配请求均由第一内存分配函数执行。
S103:根据第一虚拟内存,调用第一内存分配函数,以向内核申请第一虚拟内存对应的物理内存。
其中,由于向内核申请到的内存是虚拟内存,所以在内存分配时,需要根据申请到的虚拟内存,为该虚拟内存分配对应的物理内存。第一内存分配函数由于虚拟内存的连续性,从而可以实现内存的复用。
在本申请的一个实施例中,若虚拟内存被重度使用或频繁申请释放时,则可以暂缓虚拟内存的释放,在申请时直接调整第一内存分配函数的可用空间的值即可,因为第一内存分配函数的内存空间中的虚拟内存地址和对应的虚拟内存已经存在,从而可以进一步提高内存分配的效率。
S104:若内存量不满足预设条件,则从红黑树的虚拟内存空间中分配内存量的第二虚拟内存。
可选地,仍以预设条件可以为内存分配请求所申请的内存量小于预设阈值为例进行说明,若内存量不满足预设条件,则从,则从红黑树的虚拟内存空间中分配内存量的第二虚拟内存。由于在本申请的实施例中,预设阈值设置的很高,所以大部分内存分配请求所申请的内存量均小于该预设阈值,即大部分内存分配请求均由第一内存分配函数执行。
S105:根据第二虚拟内存,调用第二内存分配函数,以向内核申请第二虚拟内存对应的物理内存。
其中,第二内存分配函数为不连续内存的分配函数。
第一内存分配函数是一块连续且单独存在的虚拟内存空间,其内存空间中的虚拟内存地址和对应的虚拟内存已经存在,可以在使用过程中直接获取,无需通过访问红黑树中的虚拟内存空间获取,而第二内存分配函数是的虚拟内存空间对应的虚拟内存地址和对应的虚拟内存均设置在红黑树中,使用过程中需要通过访问红黑树获取,因此第一内存分配函数的执行路径相对第二内存分配函数来说较短,执行效率较高。
并且由于本申请中大部分内存分配请求均通过第一内存分配函数执行,而第一内存分配函数的处理周期不会受到内存布局的复杂度的影响,因此采用本申请提供的内存分配方法,其执行效率高,执行路径相对较短。
第二内存分配函数仅能通过红黑树的虚拟内存空间分配内存量的第二虚拟内存,即需要通过操作红黑树才能完成虚拟内存空间的分配,相对于第一内存分配函数,无法保证内存申请的并行性,因此在本申请中,仅将不满足预设条件的内存分配请求通过第二内存分配函数进行内存分配,由于大多数内存分配请求通过第一内存分配函数进行分配,可以直接基于第一内存分配函数的虚拟内存空间申请内存,从而保证了内存申请的并行性。
采用本申请提供的内存分配方法,可在应用端的内存分配请求所申请的内存量满足预设条件时,则采用第一内存分配函数申请内存,并且,采用该第一内存分配函数申请内存时,可从第一内存分配函数的虚拟内存空间直接分配对应的虚拟内存,继而调用该第一内存分配函数,向内核申请对应的物理内存,实现内存的申请;内存分配请求所申请的内存量不满足预设条件时,则从红黑树的虚拟内存空间中申请第二虚拟内存,并根据第二虚拟内存调用第二内存分配函数,以向内核申请对应的物理内存。由于该内存分配方法中,可基于内存分配请求所申请的内存量确定采用的内存分配函数,继而基于该内存分配函数的内存空间申请内存,在内存分配请求所申请的内存量满足预设条件时,无需基于内核的内存空间进行分配,也无需对内核的内存空间进行锁定,有效保证内存申请的并行性,从而保证应用端的功能实现。
可选的,在上述实施例的基础上,本申请实施例还可提供一种内存分配方法,如下结合附图进行说明。图2为本申请另一实施例提供的内存分配方法的流程示意图,如图2所示,S101之后,该方法还包括:
S106:根据预设的内存阈值,确定内存量是否满足预设条件。
在可能的应用示例中,可对预设的内存阈值和内存分配请求所申请的内存量进行比较,根据比较结果确定内存量是否满足预设条件。其中:
若内存量小于或等于内存阈值,则确定内存量满足预设条件,并执行S102。
若内存量大于内存阈值,则确定内存量不满足预设条件,并执行S104。
其中,内存量满足预设条件的内存请求均由第一内存分配函数执行,不满足预设条件的则由其他内存分配函数执行。该预设的内存阈值可以为该第一内存分配函数支持分配的最大内存量。
由于本申请中预设的内存阈值设置的非常大,这样的设置方式使得大部分的内存请求均由第一内存分配函数执行,由于第一内存分配函数可以基于内存分配请求所申请的内存量确定采用的内存分配函数,继而基于该内存分配函数的内存空间申请内存,无需基于内核的内存空间进行分配,也无需对内核的内存空间进行锁定,所以可以保证内存申请的并行性,即可以同时执行多个内存分配请求,从而保证应用端的功能实现。
可选的,在上述实施例的基础上,本申请实施例还可提供一种内存分配方法,如下结合附图进行说明。图3为本申请另一实施例提供的内存分配方法的流程示意图,如图3所示,S102之后,该方法还包括:
S107:对第一内存分配函数的内存空间中的弹性内存空间进行锁定。
其中,弹性内存空间为应用端请求扩张或收缩的内存空间,可以在使用过程中,将用于扩张的那部分弹性内存空间进行锁定,并提供根据锁定的弹性内存空间,提供持续的物理内存。
可选地,可以根据预设弹性空间间隔弹性扩张或收缩内存空间,预设弹性空间间隔可以为预设值,其大小可以根据用户需要调整,举例说明:在本申请的一个实施例中,若第一内存分配函数的预设弹性空间间隔为64兆,当前第一内存分配函数的内存空间为75兆,其中已使用的内存空间仅为20兆,且当前没有新的内存分配请求,则需要对第一内存分配函数的内存空间进行收缩,对多余的内存空间进行释放,由于预设最小虚拟空间的设置,此时仅释放超过64兆的11兆,释放后的内存空间为64兆。或者当前第一内存分配函数的内存空间为64兆,但是当前内存分配请求所申请的内存量为89兆,则对第一内存分配函数的内存空间不足以执行内存分配请求,需要对第一内存分配函数的内存空间进行扩张,即根据预设弹性空间间隔,对第一内存分配函数的内存空间进行,扩张64兆的空间,扩张后的内存空间为168兆。
可选地,在本申请的一个实施例中,若应用端请求扩张或收缩的频率大于或等于预设频率,则对第一内存分配函数的内存空间中的弹性内存空间进行锁定。
在可能的实现方式中,可以通过对第一内存分配函数扩张或收缩的分析记录,来确定扩张或收缩的频率是否大于或等于预设阈值。若当前第一内存分配函数扩张收缩的次数小于预设阈值,则说明当前扩张收缩正常,则不需要对内存空间进行直接回收。由于第一内存分配函数扩张时,必定是因为其能分配的内存将不足够支撑内存分配请求所申请的内存量,也就是第一内存分配函数申请的内存大概率很快会用完。但是由于内存分配器的特性,使用和释放可能都是一个频率比较高的过程,这就会出现当前第一内存分配函数内的一段弹性内存区间被频繁扩张或收缩。
本申请在应用端请求扩张或收缩的频率大于或等于预设频率时,将这部分内存区间的弹性内存空间的内存页进行锁定,持续地提供对应的物理页。就能避免因为频繁扩张或收缩该弹性内存空间造成的延迟分配问题,加速执行过程。
可能的实现方式中,可以将第一内存分配函数的可用虚拟内存空间调大,让第一内存分配函数的可分配的连续线性地址空间更大,在本申请的一个实施例中,可以将第一内存分配函数的虚拟内存空间设置为大于或等于预设虚拟内存空间。其中,预设虚拟内存空间可以设置为700兆,但是具体预设虚拟内存空间的大小可以根据用户需要调整,并不以上述实施例给出的为限,本申请在此不做任何限制。
举例来说,在本申请的一个实施例中,采用第一内存分配函数对应的私有锁,对弹性内存空间进行锁定。
其中,对弹性内存空间进行锁定,可以持续地提供对应的物理内存,从而避免了反复提供或撤销物理内存造成的延迟分配问题,进一步提高了第一内存分配函数的处理效率。
其中,现有技术中各内存分配函数的内存空间一般均设置在红黑树中,在操作各内存分配函数时,均需要通过操作存储VMA的红黑树才能进行,而红黑树的使用需要释放掉红黑树的全局锁后,才可以进行红黑树的相关操作,从而进一步操作对应的内存分配函数,这样的设置方式使得在对内存分配函数进行操作时,大量的性能浪费在等待释放掉红黑树全局锁。
由于本申请中的第一内存分配函数是一块连续的内存空间,无需访问红黑树中的内核空间,所以本申请的第一内存分配函数为从红黑树中剥离出的分配函数,并设置其对应的私有锁。这样的设置方式使得进入第一内存分配函数的路径不需要进行内存全局锁的释放,无需浪费性能在等待释放掉红黑树全局锁,在第一内存分配函数的所有请求中,都只使用第一内存分配函数的私有锁。从而将第一内存分配函数的过程与的内存管理过程解耦合。互相不影响,即红黑树的性能不会影响到第一内存分配函数的性能表现。从而使得第一内存分配函数的性能保持一个常量,并且由于不需要操作红黑树就可以直接操作第一内存分配函数,使得本申请提供的方法中,第一内存分配函数的执行路径比原来的还要短,即执行速度更快。
在本申请的实施例中,若该预设操作系统为linux操作系统,第一内存分配函数例如可以为brk,通过该第一内存分配函数可实现内存的动态分配,用于改变数据段的空间分配。
该第一内分配函数可以为连续内存分配函数,该第一内存分配函数的内存空间可以包括预设的固定的连续。由于第一内存分配函数的定义是一个连续内存块的收缩和扩张。当需要更多的内存的时候,调用第一内存分配函数来扩张,当不需要的时候,调用第一内存分配函数来收缩,将收缩后的内存归还给内核。第一内存分配函数的执行路径短,且为连续内存分配函数,占用资源小,所以通过第一内存分配函数从第一内存分配函数的内存空间中分配内存量的第一虚拟内存,可以使得分配效率更高,执行速度更快。
在本申请的一个可能的实现实施例中,若预设操作系统为linux操作系统,则第二内存分配函数可以为mmap函数。由于本申请所有满足预设条件的内存分配请求均会由第一内存分配函数执行,对于不满足预设条件的内存分配请求,或第一内存分配函数执行失败的请求才由第二内存分配函数执行,由于第一内存分配函数的性能相对第二内存分配函数来说较高,所以采用本申请提出的内存分配方法进行内存分配时,分配效率更高。
可选地,在本申请的一个实施例中,根据第二虚拟内存,调用第二内存分配函数,以向内核申请第二虚拟内存对应的物理内存。其中,第二虚拟内存为采用全局锁进行锁定的内存。
可选地,在本申请的实施例中,第二内存分配函数的内存地址和对应的虚拟内存需要通过访问红黑树获取,而在访问红黑树之前,需要先将红黑树的全局锁解锁后,才可以执行对应的内存分配操作。而本申请中的第一内存分配函数的内存空间中独立的,其虚拟内存地址和对应的虚拟内存已经存在,与其他的内存空间均不同,即实现了第一内存分配函数与红黑树的剥离,所以第一内存分配函数和第二内存函数的执行过程解耦合,互不影响。
采用本申请提供的内存分配方法,由于调高了预设的内存阈值,所以对于大部分内存分配请求均会采用第一内存分配函数进行处理,由于第一内存分配函数的执行路径更短,性能更高,并且执行能力强,所以进行内存分配的执行力效率和响应速度更高。并且在采用第一内存分配函数执行内存分配请求时,对于请求扩张或收缩的频率大于或等于预设阈值的情况,会进一步对第一内存分配函数的内存空间中的弹性内存空间进行锁定,从而避免由于持续扩张或收缩造成的延迟分配问题,进一步加速执行过程。
下述结合附图对本申请所提供的内存分配装置进行解释说明,该内存分配装置可执行上述图1-图3任一内存分配方法,其具体实现以及有益效果参照上述,如下不再赘述。
图4为本申请一实施例提供的内存分配装置的结构示意图,如图4所示,该装置包括:获取模块201、分配模块202和调用模块203,其中:
获取模块201,用于获取来自应用端的内存分配请求。
分配模块202,用于若内存分配请求所申请的内存量满足预设条件,则从第一内存分配函数的内存空间中分配内存量的第一虚拟内存,其中,第一内存分配函数为连续内存分配函数。
调用模块203,用于根据第一虚拟内存,调用第一内存分配函数,以向内核申请第一虚拟内存对应的物理内存。
图5为本申请另一实施例提供的内存分配装置的结构示意图,如图5所示,该装置还包括:确定模块204,用于根据预设的内存阈值,确定内存量是否满足预设条件。
确定模块204,还用于若内存量小于或等于内存阈值,则确定内存量满足预设条件。
确定模块204,还用于若内存量大于内存阈值,则确定内存量不满足预设条件。
图6为本申请另一实施例提供的内存分配装置的结构示意图,如图6所示,该装置还包括:锁定模块205,用于对第一内存分配函数的内存空间中的弹性内存空间进行锁定,弹性内存空间为应用端请求扩张或收缩的内存空间。
可选地,锁定模块205,还用于若应用端请求扩张或收缩的频率大于或等于预设频率,则对第一内存分配函数的内存空间中的弹性内存空间进行锁定。
可选地,锁定模块205,还用于采用第一内存分配函数对应的私有锁,对弹性内存空间进行锁定。
可选地,分配模块202,还用于若内存量不满足预设条件,则从内核的虚拟内存空间分配内存量的第二虚拟内存,其中,第二内存分配函数为不连续内存的分配函数;
调用模块203,还用于根据第二虚拟内存,调用第二内存分配函数,以向内核申请第二虚拟内存对应的物理内存。
可选地,锁定模块205,还用于采用全局锁,对第二虚拟内存进行锁定。
上述装置用于执行前述实施例提供的方法,其实现原理和技术效果类似,在此不再赘述。
以上这些模块可以是被配置成实施以上方法的一个或多个集成电路,例如:一个或多个特定集成电路(Application Specific Integrated Circuit,简称ASIC),或,一个或多个微处理器(digital singnal processor,简称DSP),或,一个或者多个现场可编程门阵列(Field Programmable Gate Array,简称FPGA)等。再如,当以上某个模块通过处理元件调度程序代码的形式实现时,该处理元件可以是通用处理器,例如中央处理器(CentralProcessing Unit,简称CPU)或其它可以调用程序代码的处理器。再如,这些模块可以集成在一起,以片上系统(system-on-a-chip,简称SOC)的形式实现。
图7为本申请一实施例提供的内存分配设备的结构示意图,该内存分配设备可以集成于终端设备或者终端设备的芯片。
如图7所示,该内存分配设备包括:处理器501、存储介质502和总线503。
处理器501用于存储程序,处理器501调用存储介质502存储的程序,以执行上述图1-图3对应的方法实施例。具体实现方式和技术效果类似,这里不再赘述。
可选地,本申请还提供一种程序产品,例如存储介质,该存储介质上存储有计算机程序,包括程序,该程序在被处理器运行时执行上述方法对应的实施例。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本申请各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(英文:Read-Only Memory,简称:ROM)、随机存取存储器(英文:Random Access Memory,简称:RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
Claims (8)
1.一种内存分配方法,其特征在于,所述方法包括:
获取来自应用端的内存分配请求;
若所述内存分配请求所申请的内存量满足预设条件,则从第一内存分配函数的虚拟内存空间中分配所述内存量的第一虚拟内存;其中,所述第一内存分配函数为连续内存的分配函数;
根据所述第一虚拟内存,调用所述第一内存分配函数,以向内核申请所述第一虚拟内存对应的物理内存;
若所述内存量不满足所述预设条件,则从红黑树的虚拟内存空间中分配所述内存量的第二虚拟内存;
根据所述第二虚拟内存,调用第二内存分配函数,以向内核申请所述第二虚拟内存对应的物理内存;其中,所述第二内存分配函数为不连续内存的分配函数;
所述方法还包括:
对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定,所述弹性内存空间为所述应用端请求扩张或收缩的内存空间;
所述对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定,包括:
若所述应用端请求扩张或收缩的频率大于或等于预设频率,则对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定。
2.根据权利要求1所述的方法,其特征在于,所述获取来自应用端的内存分配请求之后,所述方法还包括:
根据预设的内存阈值,确定所述内存量是否满足预设条件;
若所述内存量小于或等于所述内存阈值,则确定所述内存量满足所述预设条件;
若所述内存量大于所述内存阈值,则确定所述内存量不满足所述预设条件。
3.根据权利要求1所述的方法,其特征在于,所述对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定,包括:
采用所述第一内存分配函数对应的私有锁,对所述弹性内存空间进行锁定。
4.根据权利要求1所述的方法,其特征在于,所述从红黑树的虚拟内存空间中分配所述内存量的第二虚拟内存之前,所述方法还包括:
采用全局锁,对所述第二虚拟内存进行锁定。
5.根据权利要求1所述的方法,其特征在于,所述第一内存分配函数的虚拟内存空间大于或等于预设虚拟内存空间。
6.一种内存分配装置,其特征在于,所述装置包括:获取模块、分配模块和调用模块,其中:
所述获取模块,用于获取来自应用端的内存分配请求;
所述分配模块,用于若所述内存分配请求所申请的内存量满足预设条件,则从第一内存分配函数的虚拟内存空间中分配所述内存量的第一虚拟内存,其中,所述第一内存分配函数为连续内存的分配函数;
所述调用模块,用于根据所述第一虚拟内存,调用所述第一内存分配函数,以向内核申请所述第一虚拟内存对应的物理内存;
所述分配模块,具体用于若所述内存量不满足所述预设条件,则从红黑树的虚拟内存空间分配所述内存量的第二虚拟内存;
所述调用模块,具体用于根据所述第二虚拟内存,调用第二内存分配函数,以向内核申请所述第二虚拟内存对应的物理内存,其中,所述第二内存分配函数为不连续内存的分配函数;
所述装置还包括:锁定模块,用于对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定,所述弹性内存空间为所述应用端请求扩张或收缩的内存空间;
所述锁定模块,还用于若所述应用端请求扩张或收缩的频率大于或等于预设频率,则对所述第一内存分配函数的虚拟内存空间中的弹性内存空间进行锁定。
7.一种内存分配设备,其特征在于,所述设备包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当内存分配设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行上述权利要求1-5任一项所述的方法。
8.一种存储介质,其特征在于,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行上述权利要求1-5任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010562873.7A CN111708638B (zh) | 2020-06-18 | 2020-06-18 | 内存分配方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010562873.7A CN111708638B (zh) | 2020-06-18 | 2020-06-18 | 内存分配方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111708638A CN111708638A (zh) | 2020-09-25 |
CN111708638B true CN111708638B (zh) | 2023-09-26 |
Family
ID=72541127
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010562873.7A Active CN111708638B (zh) | 2020-06-18 | 2020-06-18 | 内存分配方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111708638B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112346879B (zh) * | 2020-11-06 | 2023-08-11 | 网易(杭州)网络有限公司 | 进程管理方法、装置、计算机设备及存储介质 |
CN112817766B (zh) * | 2021-02-22 | 2024-01-30 | 北京青云科技股份有限公司 | 一种内存管理方法、电子设备及介质 |
CN113407309A (zh) * | 2021-06-28 | 2021-09-17 | 北京字节跳动网络技术有限公司 | 虚拟机内存申请方法、装置、存储介质及电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109144712A (zh) * | 2017-06-19 | 2019-01-04 | 北京信威通信技术股份有限公司 | 内存池构建、内存分配方法及装置 |
US20190042406A1 (en) * | 2017-08-01 | 2019-02-07 | International Business Machines Corporation | System and method to manage and share managed runtime memory for java virtual machine |
CN111078408A (zh) * | 2019-12-10 | 2020-04-28 | Oppo(重庆)智能科技有限公司 | 内存分配方法、装置、存储介质及电子设备 |
-
2020
- 2020-06-18 CN CN202010562873.7A patent/CN111708638B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109144712A (zh) * | 2017-06-19 | 2019-01-04 | 北京信威通信技术股份有限公司 | 内存池构建、内存分配方法及装置 |
US20190042406A1 (en) * | 2017-08-01 | 2019-02-07 | International Business Machines Corporation | System and method to manage and share managed runtime memory for java virtual machine |
CN111078408A (zh) * | 2019-12-10 | 2020-04-28 | Oppo(重庆)智能科技有限公司 | 内存分配方法、装置、存储介质及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN111708638A (zh) | 2020-09-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111708638B (zh) | 内存分配方法、装置、设备及存储介质 | |
US8850156B2 (en) | Method and system for managing virtual machine storage space and physical host | |
US9824011B2 (en) | Method and apparatus for processing data and computer system | |
US10552337B2 (en) | Memory management and device | |
US8453015B2 (en) | Memory allocation for crash dump | |
EP2479677A1 (en) | Method, system and physical host for virtual machine (vm) storage space management | |
US5623654A (en) | Fast fragmentation free memory manager using multiple free block size access table for a free list | |
CN111813710B (zh) | 避免Linux内核内存碎片方法、设备及计算机存储介质 | |
CN110727517A (zh) | 一种基于分区设计的内存分配方法和装置 | |
CN115421924A (zh) | 一种内存分配方法、装置及设备 | |
CN113467937A (zh) | 一种多核间免锁的内存分配方法、装置和电子设备 | |
CN117311997B (zh) | 一种计算芯片的内存管理方法、装置及计算芯片 | |
CN112631510B (zh) | 堆栈区域扩充的方法、装置及硬件平台 | |
JP2023527770A (ja) | メモリにおける推論 | |
US7840772B2 (en) | Physical memory control using memory classes | |
Barootkoob et al. | Parameters affecting the functionality of memory allocators | |
CN116225693A (zh) | 元数据管理方法、装置、计算机设备及存储介质 | |
WO2016187831A1 (zh) | 存取文件的方法、装置和存储系统 | |
CN114518962A (zh) | 内存的管理方法及装置 | |
US11061609B2 (en) | Distributed memory object method and system enabling memory-speed data access in a distributed environment | |
US11656905B2 (en) | Delegation control based on program privilege level and page privilege level | |
Park et al. | Memory efficient fork-based checkpointing mechanism for in-memory database systems | |
CN116089032B (zh) | 通过自适应配置的快速移动应用程序切换方法及存储介质 | |
CN111367836B (zh) | 一种针对数据库的处理方法及装置 | |
US20230027307A1 (en) | Hypervisor-assisted transient cache for virtual machines |
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 |