G06F9/50 G06F9/445
1.一种内存分配方法,其特征在于,包括:
在接收到应用程序启动请求时,构建N个内存池、第一映射关系和第二映射关系;所述内存池包括至少一个内存块;所述第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系;所述第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系;N为正整数;
在接收到所述应用程序发送的内存申请请求之后,根据所述内存申请请求获取所述应用程序的内存申请尺寸,并根据所述应用程序的内存申请尺寸和所述第一映射关系,确定第一内存池的第一标识;
根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址,并在确定所述第一内存地址为有效地址时,将所述第一内存地址发送给所述应用程序。
2.根据权利要求1所述的方法,其特征在于,当所述内存池中的内存块按照单链表进行连接,位于同一个所述内存池中的各内存块的尺寸相同时,所述构建N个内存池,具体包括:
使用系统内存申请函数,获取原始内存区域的内存地址;
将所述原始内存区域的内存地址进行内存池划分,得到N个内存池的内存地址;
将第i个内存池的内存地址按照第i个尺寸进行内存块划分,得到第i个内存池的Mi个内存块,将第i个内存池的第j+1个内存块的内存地址存储至第i个内存池的第j个内存块,并将预设无效地址存储至第i个内存池的第Mi个内存块;j为正整数,j≤Mi-1;Mi为正整数;i为正整数,i≤N。
3.根据权利要求1所述的方法,其特征在于,当位于同一个所述内存池中的各内存块的尺寸相同时,所述构建第一映射关系,包括:
计算所述N个内存池中任意两个内存池的内存块尺寸之间的差值,得到第一差值集合;所述内存块尺寸用于表征所述内存池中内存块的尺寸;
将所述第一差值集合中的最小值确定为第一尺寸值,将所述N个内存池的内存块尺寸中的最小值确定为第二尺寸值,并将所述第一尺寸值和所述第二尺寸值中的最小值确定为第三尺寸值;
将所述N个内存池的内存块尺寸中的最大值确定为第四尺寸值,并将所述第四尺寸值和所述第三尺寸值的比值,确定为第一数目;所述第一数目用于表征所述第一映射关系中的关系个数;
分别将各所述内存池的内存块尺寸与r倍的第三尺寸值作差,得到第二差值集合,并将第二差值集合中的最小非负差值对应的内存池的内存池标识,作为第r个申请尺寸区间对应的内存池标识;所述第r个申请尺寸区间为区间(r-1倍的第三尺寸值,r倍的第三尺寸值];r为正整数,r≤第一数目;
根据各个申请尺寸区间及其对应的内存池标识,建立第一映射关系。
4.根据权利要求1所述的方法,其特征在于,所述根据所述应用程序的内存申请尺寸和所述第一映射关系,确定第一内存池的第一标识,包括:
根据所述应用程序的内存申请尺寸和第一映射关系,确定所述应用程序的内存申请尺寸所属的目标申请尺寸区间;
根据所述目标申请尺寸区间和所述第一映射关系,确定第一内存池的第一标识。
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在确定所述第一内存地址为有效地址时,根据所述第一内存地址确定第一内存块;
读取所述第一内存块中保存的第二内存地址;
利用所述第一标识和所述第二内存地址,更新所述第二映射关系,使得所述第二映射关系包括所述第一标识和所述第二内存地址之间的对应关系。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在接收到应用程序启动请求时,构建第三映射关系;
根据所述第一标识和所述第三映射关系,确定所述第一内存池的使能状态;
所述根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址,包括:
在确定所述第一内存池的使能状态为允许使用状态时,根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在接收到应用程序启动请求时,构建第四映射关系;所述第四映射关系用于记录内存池标识与内存池的内存地址之间的映射关系;
在接收到所述应用程序发送的内存释放请求之后,根据所述内存释放请求,确定待释放内存区域的内存地址,并根据原始内存区域的内存地址和所述待释放内存区域的内存地址,判断所述待释放内存区域是否属于所述原始内存区域;其中,所述原始内存区域包括所述N个内存池;
在确定所述待释放内存区域属于所述原始内存区域时,根据所述待释放内存区域的内存地址和所述第四映射关系,确定第二内存池的第二标识,并根据所述第二标识和所述第二映射关系,获取所述第二标识对应的第三内存地址;
将所述第三内存地址存储至所述待释放内存区域,并利用所述第二标识和所述待释放内存区域的内存地址,更新所述第二映射关系,使得所述第二映射关系包括所述第二标识和所述待释放内存区域的内存地址之间的对应关系。
8.一种内存分配装置,其特征在于,包括:
构建单元,用于在接收到应用程序启动请求时,构建N个内存池、第一映射关系和第二映射关系;所述内存池包括至少一个内存块;所述第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系;所述第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系;N为正整数;
第一处理单元,用于在接收到所述应用程序发送的内存申请请求之后,根据所述内存申请请求获取所述应用程序的内存申请尺寸,并根据所述应用程序的内存申请尺寸和所述第一映射关系,确定第一内存池的第一标识;
分配单元,用于根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址,并在确定所述第一内存地址为有效地址时,将所述第一内存地址发送给所述应用程序。
9.一种设备,其特征在于,所述设备包括处理器以及存储器:
所述存储器用于存储计算机程序;
所述处理器用于根据所述计算机程序执行权利要求1-7中任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质用于存储计算机程序,所述计算机程序用于执行权利要求1-7中任一项所述的方法。
本申请涉及计算机技术领域,尤其涉及一种内存分配方法、装置、设备及存储介质。
内存分配是指在应用程序执行过程中对存储空间进行分配或者回收。例如,在应用程序(例如,游戏、音乐播放器等)运行过程中,需要向该应用程序分配内存,以便保证目标应用程序能够顺利运行。
目前,通常使用默认的系统内存分配方案进行内存分配,而且系统内存分配方案会响应各种尺寸的内存申请请求。但是,因系统内存分配方案的内存申请和释放过程效率比较低,使得该系统内存分配方案在处理那些内存申请释放比较频繁的应用程序任务(例如,加载游戏关卡等)时,需要花费较长的时间响应该应用程序任务的内存分配请求,如此导致该应用程序任务的完成耗时较长,从而导致该应用程序的运行流畅性较低。
本申请实施例提供了一种内存分配方法、装置、设备及存储介质,能够提高内存分配效率,从而提高应用程序的运行流畅性。
有鉴于此,本申请第一方面提供了一种内存分配方法,包括:
在接收到应用程序启动请求时,构建N个内存池、第一映射关系和第二映射关系;所述内存池包括至少一个内存块;所述第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系;所述第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系;N为正整数;
在接收到所述应用程序发送的内存申请请求之后,根据所述内存申请请求获取所述应用程序的内存申请尺寸,并根据所述应用程序的内存申请尺寸和所述第一映射关系,确定第一内存池的第一标识;
根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址,并在确定所述第一内存地址为有效地址时,将所述第一内存地址发送给所述应用程序。
本申请第二方面提供了一种内存分配装置,包括:
构建单元,用于在接收到应用程序启动请求时,构建N个内存池、第一映射关系和第二映射关系;所述内存池包括至少一个内存块;所述第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系;所述第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系;N为正整数;
第一处理单元,用于在接收到所述应用程序发送的内存申请请求之后,根据所述内存申请请求获取所述应用程序的内存申请尺寸,并根据所述应用程序的内存申请尺寸和所述第一映射关系,确定第一内存池的第一标识;
分配单元,用于根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址,并在确定所述第一内存地址为有效地址时,将所述第一内存地址发送给所述应用程序。
本申请第三方面提供了一种设备,所述设备包括处理器以及存储器:
所述存储器用于存储计算机程序;
所述处理器用于根据所述计算机程序执行上述第一方面所述的内存分配方法。
本申请第四方面提供了计算机可读存储介质,所述计算机可读存储介质用于存储计算机程序,所述计算机程序用于执行上述第一方面所述的内存分配方法。
本申请第五方面提供了一种包括指令的计算机程序产品,当其在计算机上运行时,使得所述计算机执行上述第一方面所述的内存分配方法。
从以上技术方案可以看出,本申请实施例具有以下优点:
本申请实施例提供的内存分配方法中,在接收到应用程序启动请求时,先构建多个内存池、第一映射关系和第二映射关系,使得每个内存池均包括至少一个内存块,第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系,以及第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的地址之间的映射关系。然后,在接收到应用程序发送的内存申请请求之后,先根据内存申请请求获取应用程序的内存申请尺寸,并根据应用程序的内存申请尺寸和第一映射关系,确定第一内存池的第一标识;再根据第一标识和第二映射关系,获取第一标识对应的第一内存地址,并在确定第一内存地址为有效地址时,将第一内存地址发送给应用程序,以便后续应用程序能够使用第一内存地址对应的内存块。
可见,因各内存池、第一映射关系和第二映射关系均是在应用程序启动时构建的,使得在应用程序运行过程中接收到应用程序发送的内存申请请求之后,只需通过查询第一映射关系和第二映射关系,即可确定出为该应用程序分配的内存,如此简化了该应用程序运行过程中的内存申请流程,有利于提高内存分配效率,从而有利于提高该应用程序的运行流畅性。
图1为本申请实施例提供的内存分配方法的一种应用场景示意图;
图2为本申请实施例提供的内存分配方法的另一种应用场景示意图;
图3为本申请实施例提供的一种内存分配方法的流程示意图;
图4为本申请实施例提供的内存池划分示意图;
图5为本申请实施例提供的不同内存块之间的地址指引关系;
图6为本申请实施例提供的在内存申请期间第二映射关系的更新过程示意图;
图7为本申请实施例提供的不同内存块之间的地址指引关系的更新示意图;
图8为本申请实施例提供的在内存申请期间的内存池的使用流程图;
图9为本申请实施例提供的内存释放的流程图;
图10为本申请实施例提供的在内存释放期间的内存池的使用流程图;
图11为本申请实施例提供的应用于图1所示应用场景下的内存分配方法的流程图;
图12为本申请实施例提供的用户触发应用程序启动请求的示意图;
图13为本申请实施例提供的一种内存分配装置的结构示意图;
图14为本申请实施例提供的另一种内存分配装置的结构示意图;
图15为本申请实施例提供的又一种内存分配装置的结构示意图;
图16为本申请实施例提供的再一种内存分配装置的结构示意图;
图17为本申请实施例提供的一种终端设备的结构示意图;
图18为本申请实施例提供的一种服务器的结构示意图。
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
发明人对传统内存分配过程(例如,系统内存分配方案)研究中发现,因传统内存分配过程的内存申请和释放流程比较复杂,导致传统内存分配过程的内存申请和释放过程效率比较低,使得该传统内存分配过程在处理那些内存申请释放(尤其是小内存申请释放)比较频繁的应用程序任务(例如,加载游戏关卡等)时,需要花费较长的时间响应该应用程序任务的内存分配请求,如此导致该应用程序任务的完成耗时较长,从而导致该应用程序的运行流畅性较低。
针对上述传统内存分配过程存在的技术问题,本申请实施例提供了一种内存分配方法,能够有效地简化应用程序运行过程中的内存申请流程,有利于提高内存分配效率。
具体地,在本申请实施例提供的内存分配方法中,在接收到应用程序启动请求时,先构建多个内存池、第一映射关系和第二映射关系,使得每个内存池均包括至少一个内存块,第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系,以及第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的地址之间的映射关系。然后,在接收到应用程序发送的内存申请请求之后,先根据内存申请请求获取应用程序的内存申请尺寸,并根据应用程序的内存申请尺寸和第一映射关系,确定第一内存池的第一标识;再根据第一标识和第二映射关系,获取第一标识对应的第一内存地址,并在确定第一内存地址为有效地址时,将第一内存地址发送给应用程序,以便后续应用程序能够使用第一内存地址对应的内存块。
可见,因各内存池、第一映射关系和第二映射关系均是在应用程序启动时构建的,使得在应用程序运行过程中接收到应用程序发送的内存申请请求之后,只需通过查询第一映射关系和第二映射关系,即可确定出为该应用程序分配的内存,如此简化了该应用程序运行过程中的内存申请流程,有利于提高内存分配效率。
应理解,本申请实施例提供的内存分配方法可以应用于数据处理设备,如终端设备、服务器等;其中,终端设备具体可以为智能手机、计算机、个人数字助理(PersonalDigital Assitant,PDA)、平板电脑等;服务器具体可以为应用服务器,也可以为Web服务器,在实际部署时,该服务器可以为独立服务器,也可以为集服务器。
若本申请实施例提供的内存分配方法由终端设备执行时,则终端设备可以在接收到应用程序启动请求时先构建多个内存池、第一映射关系和第二映射关系,并在接收到应用程序发送的内存申请请求之后,直接第一映射关系和第二映射关系从多个内存池中确定出第一内存地址,以便将该第一内存地址对应的内存块分配给该应用程序。若本申请实施例提供的内存分配方法由服务器执行时,则服务器先根据终端设备上传的应用程序启动请求,构建多个内存池、第一映射关系和第二映射关系,并在接收到终端设备上传的内存申请请求之后,先直接第一映射关系和第二映射关系从多个内存池中确定出第一内存地址,再将第一内存地址发送给终端设备,以使终端设备将该第一内存地址对应的内存块分配给应用程序。
为了便于理解本申请实施例提供的技术方案,下面对本申请实施例提供的内存分配方法应用于终端设备为例,对本申请实施例提供的内存分配方法适用的应用场景进行示例性介绍。
参见图1,该图为本申请实施例提供的内存分配方法的应用场景示意图。如图1所示,该应用场景包括:终端设备101和用户102;其中,终端设备101用于执行本申请实施例提供的内存分配方法进行内存分配。
终端设备101在接收到用户102触发的应用程序启动请求时,终端设备101先构建多个内存池、第一映射关系和第二映射关系,使得每个内存池均包括至少一个内存块,第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系,以及第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的地址之间的映射关系。然后,终端设备101在接收到应用程序发送的内存申请请求之后,先根据内存申请请求获取应用程序的内存申请尺寸,并根据应用程序的内存申请尺寸和第一映射关系,确定第一内存池的第一标识;再根据第一标识和第二映射关系,获取第一标识对应的第一内存地址,并在确定第一内存地址为有效地址时,将第一内存地址对应的内存块分配给应用程序,以便后续应用程序能够使用第一内存地址对应的内存块执行相应的任务(例如,加载游戏道具等)。
应理解,在实际应用中,也可以将本申请实施例提供的内存分配方法应用于服务器,参见图2,该图为本申请实施例提供的内存分配方法的另一种应用场景示意图。如图2所示,服务器201能够先根据终端设备上传的应用程序启动请求,先构建多个内存池、第一映射关系和第二映射关系,使得每个内存池均包括至少一个内存块,第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系,以及第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的地址之间的映射关系。然后,服务器201在接收到终端设备上传的内存申请请求之后,先根据内存申请请求获取应用程序的内存申请尺寸,并根据应用程序的内存申请尺寸和第一映射关系,确定第一内存池的第一标识;再根据第一标识和第二映射关系,获取第一标识对应的第一内存地址,并在确定第一内存地址为有效地址时,直接将第一内存地址发送给终端设备,以使终端设备将该第一内存地址对应的内存块分配给应用程序,以便后续应用程序能够使用第一内存地址对应的内存块执行相应的任务(例如,加载游戏道具等)。
应理解,图1和图2所示的应用场景仅为示例,在实际应用中,本申请实施例提供的内存分配方法还可以应用于其他进行内存分配的应用场景,在此不对本申请实施例提供的内存分配方法做任何限定。
下面通过实施例对本申请提供的内存分配方法进行介绍。
方法实施例一
参见图3,图3为本申请实施例提供的一种内存分配方法的流程示意图。为了便于描述,下述实施例仅以终端设备为执行主体为例对该内存分配方法进行介绍。如图3所示,该内存分配方法包括S301-S304:
S301:在接收到应用程序启动请求时,构建N个内存池、第一映射关系和第二映射关系。
应用程序是一种电脑软件,尤其可以是一种在运行过程中需要频繁申请释放小内存的电脑软件。另外,本申请实施例不限定应用程序,例如,应用程序可以是游戏软件,且该游戏软件在运行过程(如加载内容庞杂的关卡等)中需要频繁申请释放小内存。
本申请实施例不限定应用程序启动请求的获取方式,例如,当用户点击终端设备上的应用程序图标时,触发应用程序启动请求,此时终端设备便可以接收到该应用程序启动请求。
N个内存池用于为应用程序提供各种尺寸的内存块;N为正整数。
另外,每个内存池均包括至少一个内存块。例如,当N为3时,第1个内存池可以包括10000个32字节的内存块,第2个内存池包括5000个64字节的内存块,而且第3个内存池包括1000个256字节的内存块。
另外,位于同一个内存池中的各内存块的尺寸相同。也就是,一个内存池中可以包括多个尺寸相同的内存块。
另外,内存池中的内存块可以按照单链表进行连接。例如,如图4所示,当第i个内存池包括Mi个地址连续的内存块,且第i个内存池按照单链表进行连接时,可以将第i个内存池中的地址指针进行如下设定:将第i个内存池的第j+1个内存块的内存地址存储至第i个内存池的第j个内存块,并将预设无效地址存储至第i个内存池的第Mi个内存块,以使后续可以根据第i个内存池的第j个内存块中存储的地址,直接到第i个内存池的第j+1个内存块的内存地址存储。
另外,本申请实施例还提供了一种构建内存池的具体实施方式,在该实施方式中,当内存池中的内存块按照单链表进行连接,位于同一个内存池中的各内存块的尺寸相同时,则N个内存池的构建过程具体包括步骤11至步骤13:
步骤11:使用系统内存申请函数,获取原始内存区域的内存地址。
系统内存申请函数是指上文系统内存分配方案进行内存分配时所使用的函数。
原始内存区域是指在应用程序启动时,为应用程序申请得到的一块内存空间较大的内存区域;而且,原始内存区域内包括大量的地址连续的内存地址。
步骤12:将原始内存区域的内存地址进行内存池划分,得到N个内存池的内存地址。
本申请实施例不限定内存池划分,可以均匀划分,也可以按照预设内存池尺寸列表进行划分。其中,预设内存池尺寸列表可以根据应用场景预先设定。
基于上述内容可知,本申请实施例中,在获取到原始内存区域之后,可以将原始内存区域划分成N个内存池,使得每个内存池包括多个连续的内存地址。例如,当原始内存区域为896000字节时,则可以将原始内存区域划分3个内存池,且第1个内存池为320000字节,第2个内存池为320000字节,第3个内存池为256000字节。
步骤13:将第i个内存池的内存地址按照第i个尺寸进行内存块划分,得到第i个内存池的Mi个内存块,将第i个内存池的第j+1个内存块的内存地址存储至第i个内存池的第j个内存块,并将预设无效地址存储至第i个内存池的第Mi个内存块;j为正整数,j≤Mi-1;Mi为正整数;i为正整数,i≤N。
第i个尺寸是预先根据应用场景设定的。例如,第1个尺寸为32,第1个尺寸为64,第3个尺寸为256。
预设无效地址用于标记该内存块为其所属内存池中的最后一个内存区域;而且,本申请实施例不限定预设无效地址的表示方式,例如,预设无效地址可以为0。
基于上述内容可知,本申请实施例中,在获取到各个内存池之后,可以将每个内存池均匀分割成多个内存块,使得每个内存池均包括多个尺寸相同的内存块。例如,当将原始内存区域划分3个内存池,且第1个内存池为320000字节,第2个内存池为320000字节,第3个内存池为256000字节时,可以将第1个内存池均匀划分成10000个32字节的内存块,将第2个内存池均匀划分成5000个64字节的内存块,并将第3个内存池均匀划分成1000个256字节的内存块。
另外,如图4所示,第i个内存池的具体划分过程为:首先,将第i个内存池的内存地址按照第i个尺寸进行内存块划分,得到第i个内存池的Mi个内存块,使得该Mi个内存块的尺寸均是第i个尺寸。然后,将第i个内存池的第2个内存块的内存地址存储至第i个内存池的第1个内存块,将第i个内存池的第3个内存块的内存地址存储至第i个内存池的第2个内存块,……(以此类推),将第i个内存池的第Mi-1个内存块的内存地址存储至第i个内存池的第Mi-2个内存块,并在第i个内存池的第Mi个内存块中存储预设无效地址。如此使得在后续第i个内存池的寻址过程中,可以从第i个内存池的第1个内存块中到第i个内存池的第2个内存块的内存地址,从第i个内存池的第2个内存块中到第i个内存池的第3个内存块的内存地址,……(以此类推),直至从第i个内存池的第Mi个内存块中到预设无效地址时,可以确定第i个内存池中的各个内存块均已被遍历。其中,j为正整数,j≤Mi-1;Mi为正整数;i为正整数,i≤N。
基于上述内存池的相关内容可知,在本申请实施例中,在应用程序启动时,可以先构建多个内存池,使得每个内存池具包括多个尺寸相同且地址相连的内存块,还使得不同内存池中的内存块的尺寸不同。如此,在后续内存申请过程中,可以利用不同内存池中的内存块响应具有不同尺寸需求的内存申请。
需要说明的是,本申请实施例不限定原始内存区域的尺寸、各个内存池的尺寸、以及各个内存块的尺寸的获取方式。例如,上述尺寸可以预先根据应用场景设定,也可以基于应用程序的模拟测试数据的统计信息(例如,不同尺寸的内存的申请量、申请频率、申请峰值等统计信息)设定。
另外,第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系。
其中,内存池标识用于唯一标记内存池。另外,本申请实施例不限定内存标识的表示方式,例如,内存标识可以是内存池在原始内存区域的排列序号(“1”,“2”,“3”,……)。
另外,本申请实施例还提供了一种构建第一映射关系的实施方式,具体包括步骤21至步骤28:
步骤21:计算N个内存池中任意两个内存池的内存块尺寸之间的差值,得到第一差值集合。
内存块尺寸用于表征内存池中内存块的尺寸。例如,当内存池包括10000个32字节的内存块时,则该内存池的内存块尺寸为32。
本申请实施例中,在获取到N个内存池之后,可以利用公式(1)计算任意两个内存池的内存块尺寸之间的差值,得到第一差值集合。
exy=|lx-ly| (1)
式中,exy表示第x个内存池的内存块尺寸与第y个内存池的内存块尺寸之间的差值;lx表示第x个内存池的内存块尺寸;ly表示第y个内存池的内存块尺寸;x为正整数,x≤N,且x≠y,y为正整数,y≤N;N为内存池的总数。
作为示例,当第1个内存池包括10000个32字节的内存块、第2个内存池包括5000个64字节的内存块、以及第3个内存池包括1000个256字节的内存块时,第1个内存池的内存块尺寸为32,第2个内存池的内存块尺寸为64,第3个内存池的内存块尺寸为256;第1个内存池的内存块尺寸与第2个内存池的内存块尺寸之间的差值为32,第1个内存池的内存块尺寸与第3个内存池的内存块尺寸之间的差值为224,第2个内存池的内存块尺寸与第3个内存池的内存块尺寸之间的差值为192。如此可得第一差值集合为{32,224,192}。
步骤22:将第一差值集合中的最小值确定为第一尺寸值。
本申请实施例中,在获取到第一差值集合之后,将第一差值集合中的最小值确定为第一尺寸值。例如,当第一差值集合为{32,224,192}时,则第一尺寸值为32。
步骤23:将N个内存池的内存块尺寸中的最小值确定为第二尺寸值。
本申请实施例中,在获取到N个内存池之后,可以将N个内存池的内存块尺寸中的最小值确定为第二尺寸值。例如,基于步骤S21中示例内容可知,第1个内存池的内存块尺寸为32,第2个内存池的内存块尺寸为64,第3个内存池的内存块尺寸为256,则第二尺寸值为32。
步骤24:将第一尺寸值和第二尺寸值中的最小值确定为第三尺寸值。
本申请实施例中,在获取到第一尺寸值和第二尺寸值之后,可以将第一尺寸值和第二尺寸值中的最小值确定为第三尺寸值,其具体为:若第一尺寸值大于第二尺寸值,则将第二尺寸值确定为第三尺寸值;若第一尺寸值等于第二尺寸值,则将第二尺寸值或第一尺寸值确定为第三尺寸值;第一尺寸值小于第二尺寸值,则将第一尺寸值确定为第三尺寸值。例如,当第一尺寸值为32,且第二尺寸值为32时,则确定第三尺寸值为32。
步骤25:将N个内存池的内存块尺寸中的最大值确定为第四尺寸值。
本申请实施例中,在获取到N个内存池之后,可以将N个内存池的内存块尺寸中的最大值确定为第四尺寸值。例如,基于步骤S21中示例内容可知,第1个内存池的内存块尺寸为32,第2个内存池的内存块尺寸为64,第3个内存池的内存块尺寸为256,则第四尺寸值为256。
步骤26:将第四尺寸值和第三尺寸值的比值,确定为第一数目。其中,第一数目用于表征第一映射关系中的关系个数。
本申请实施例中,在获取到第四尺寸值和第三尺寸值之后,可以将第四尺寸值和第三尺寸值的比值,确定为第一数目,以使得第一数目能够表征第一映射关系中的关系个数。例如,当第三尺寸值为32,且第四尺寸值为256时,则第一数目为256÷32=8。此时,第一映射关系包括8个对应关系。
步骤27:分别将各内存池的内存块尺寸与r倍的第三尺寸值作差,得到第二差值集合,并将第二差值集合中的最小非负差值对应的内存池的内存池标识,作为第r个申请尺寸区间对应的内存池标识;第r个申请尺寸区间为(r-1倍的第三尺寸值,r倍的第三尺寸值];r为正整数,r≤第一数目。
作为示例,当第1个内存池的内存块尺寸为32,第2个内存池的内存块尺寸为64,第3个内存池的内存块尺寸为256,第三尺寸值为32,第一数目为8;而且第1个内存池的内存池标识为“0”,第2个内存池的内存池标识为“1”,第3个内存池的内存池标识为“2”时,则步骤27具体可以包括以下步骤:
分别将第1个内存池的内存块尺寸(32)与1倍的第三尺寸值(32)作差、将第2个内存池的内存块尺寸(64)与1倍的第三尺寸值(32)作差、以及将第3个内存池的内存块尺寸(256)与1倍的第三尺寸值(32)作差,得到第二差值集合{0,32,224},并将第二差值集合中的最小非负差值(0)对应的内存池的内存池标识(“0”),作为第1个申请尺寸区间((0,32])对应的内存池标识。也就是,申请尺寸区间(0,32]对应与第1个内存池的内存池标识“0”。
分别将第1个内存池的内存块尺寸(32)与2倍的第三尺寸值(64)作差、将第2个内存池的内存块尺寸(64)与2倍的第三尺寸值(64)作差、以及将第3个内存池的内存块尺寸(256)与2倍的第三尺寸值(64)作差,得到第二差值集合{-32,0,192},并将第二差值集合中的最小非负差值(0)对应的内存池的内存池标识(“1”),作为第2个申请尺寸区间((32,64])对应的内存池标识。也就是,申请尺寸区间(32,64]对应与第2个内存池的内存池标识“1”。
分别将第1个内存池的内存块尺寸(32)与3倍的第三尺寸值(96)作差、将第2个内存池的内存块尺寸(64)与3倍的第三尺寸值(96)作差、以及将第3个内存池的内存块尺寸(256)与3倍的第三尺寸值(96)作差,得到第二差值集合{-64,-32,160},并将第二差值集合中的最小非负差值(160)对应的内存池的内存池标识(“2”),作为第3个申请尺寸区间((64,96])对应的内存池标识。也就是,申请尺寸区间(64,96]对应与第3个内存池的内存池标识“2”。
……(以此类推),最终能够得到8个对应关系,该8个对应关系具体为:申请尺寸区间(0,32]对应与第1个内存池的内存池标识“0”;申请尺寸区间(32,64]对应与第2个内存池的内存池标识“1”;申请尺寸区间(64,96]对应与第3个内存池的内存池标识“2”;申请尺寸区间(96,128]对应与第3个内存池的内存池标识“2”;申请尺寸区间(128,160]对应与第3个内存池的内存池标识“2”;申请尺寸区间(160,192]对应与第3个内存池的内存池标识“2”;申请尺寸区间(192,224]对应与第3个内存池的内存池标识“2”;申请尺寸区间(224,256]对应与第3个内存池的内存池标识“2”。
步骤28:根据各个申请尺寸区间及其对应的内存池标识,建立第一映射关系。
本申请实施例不限定第一映射关系的表示方式,例如,可以采用映射表的方式进行表示,也可以还用函数的方式进行表示,还可以采用数组的方式进行表示,。为了便于理解,下面结合数组的方式进行说明。
在一种可能的实施方式中,当第一映射关系采用数组表示时,则第一映射关系为[F1,F2,F3,……,FR],其中,Fr在数组中处于第r个元素的位置;而且Fr表示第r个申请尺寸区间(r-1倍的第三尺寸值,r倍的第三尺寸值]对应的内存池标识,r为正整数,r≤R,R表示第一映射关系中的关系总数(也就是,第一数目)。另外,可以利用公式(3)使用该第一映射关系。
式中,Sarray表示待查询内存尺寸对应的内存池标识在数组中的位置;ls表示待查询内存尺寸;La表示第三尺寸值;[·]表示取整函数。
为了便于理解上述内容,下面结合示例进行说明。
作为示例,当第一映射关系采用数组的方式进行表示时,基于步骤27的示例内容可知,第一映射关系为[0,1,2,2,2,2,2,2]。此时,若待查询内存尺寸为50时,则待查询内存尺寸对应的内存池标识在数组中的位置为[(50-1)/32]+1=2,可见待查询内存尺寸50对应的内存池标识位于数组[0,1,2,2,2,2,2,2]中第2个元素位置,也就是,待查询内存尺寸50对应的内存池标识为1。
基于上述第一映射关系的相关内容可知,本申请实施例中,在获取到N个内存池之后,可以根据各个内存池的内存块尺寸来确定每个内存池负责响应的申请尺寸区间,以使得不同内存池能够管理不同尺寸的内存申请。可见,因具有不同内存块尺寸的内存池能够分别管理不同尺寸的内存申请,使得具有不同内存块尺寸的内存池能够同时处理不同尺寸的内存申请,如此能够实现不同尺寸的内存申请的并行执行。
另外,第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系。
内存池中下一个待分配内存块的内存地址是指内存池中下一个空闲内存块的内存地址。例如,如图5所示,当第i个内存池的第1个内存块至第3个内存块均已被使用时,则第4个内存块就是第i个内存池中下一个待分配内存块,则第4个内存块的内存地址就是内存池中下一个待分配内存块的内存地址。另外,由于第4个内存块的内存地址是存储在第3个内存块中的,因而,可以在将第3个内存块分配给应用程序进行使用时,可以直接从第3个内存块中读取第4个内存块的内存地址,并将第4个内存块的内存地址,作为第i个内存池的内存池标识对应的内存池中下一个待分配内存块的内存地址,并记录在第二映射关系中,以使第二映射关系能够清楚地记录有第4个内存块的内存地址与第i个内存池的内存池标识之间的对应关系。
另外,在接收到应用程序启动请求时,可以对第二映射关系进行初始化处理,具体为:第二映射关系包括N条对应关系,且第i条关系为第i个内存池的内存池标识对应于第i个内存池中内存地址排序最靠前的内存块的内存地址。其中,i为正整数,i≤N。
另外,第二映射关系是随着应用程序的内存申请与释放进行更新的,该更新过程将在下文进行具体介绍。
基于上述内容可知,本申请实施例中,当用户想要在终端设备上运行应用程序时,用户可以通过点击终端设备上的应用程序图标来触发应用程序启动请求,使得终端设备在接收到应用程序启动请求之后,构建N个内存池,以使得不同内存池负责管理不同尺寸的内存申请;同时,还需要构建第一映射关系和第二映射关系,以便后续能够利用第一映射关系确定每个内存申请应该使用的内存池,并根据第二映射关系将该内存池中下一个待分配内存块的内存地址,分配给应用程序,以使该应用程序能够使用该内存地址对应的内存块进行相应的任务。
S302:在接收到应用程序发送的内存申请请求之后,根据内存申请请求获取应用程序的内存申请尺寸。
内存申请请求是指应用程序发送的用于申请待分配内存的请求;而且,内存申请请求中携带有待分配内存的尺寸。
应用程序的内存申请尺寸是指待分配内存的尺寸。
基于上述内容可知,应用程序运行过程中,在接收到应用程序发送的内存申请请求之后,可以直接从该内存申请请求中提取出待分配内存的尺寸,作为应用程序的内存申请尺寸,以便后续能够基于该应用程序的内存申请尺寸,从内存池中确定与该应用程序的内存申请尺寸相匹配的内存块。
S303:根据应用程序的内存申请尺寸和第一映射关系,确定第一内存池的第一标识。
本申请实施例不限定S303的实施方式,下面结合两种可能的实施方式进行说明。
在第一种可能的实施方式中,当第一映射关系采用映射表的方式进行表示时,则S303具体可以为:先根据应用程序的内存申请尺寸和第一映射关系,确定应用程序的内存申请尺寸所属的目标申请尺寸区间;再根据目标申请尺寸区间和第一映射关系,确定第一内存池的第一标识。
可见,在本申请实施例中,当第一映射关系采用映射表的方式进行表示时,在获取到应用程序的内存申请尺寸之后,可以先将应用程序的内存申请尺寸与第一映射关系中的各个申请尺寸区间进行比较,确定该应用程序的内存申请尺寸所属的目标申请尺寸区间;再在第一映射关系中查目标申请尺寸区间对应的内存池标识,作为第一内存池的第一标识。例如,基于上文步骤27中示例内容可知,当应用程序的内存申请尺寸为50时,因应用程序的内存申请尺寸50属于申请尺寸区间(32,64],使得应用程序的内存申请尺寸50对应的第一标识应该是第2个内存池的内存池标识“1”。
基于上述第一种可能的实施方式的相关内容可知,当第一映射关系采用映射表的方式进行表示时,可以先利用第一映射关系,确定应用程序的内存申请尺寸所属的目标申请尺寸区间,再利用目标申请尺寸区间和第一映射关系,确定第一内存池的第一标识,以便后续能够将第一内存池中的下一个待分配内存块分配给应用程序进行使用。
在第二种可能的实施方式中,当第一映射关系采用数组的方式进行表示时,S303具体可以为:先根据应用程序的内存申请尺寸,利用公式(3)确定第一位置,该第一位置表示应用程序的内存申请尺寸对应的内存池标识在第一映射关系中的位置;再将位于第一映射关系中第一位置上的内存池标识,确定为第一内存池的第一标识。
基于上述相关内容可知,在本申请实施例中,在获取到应用程序的内存申请尺寸之后,可以先将应用程序的内存申请尺寸作为待查询内存尺寸Sarray,再利用公式(3)确定应用程序的内存申请尺寸对应的内存池标识在第一映射关系(也就是数组[F1,F2,F3,……,FR])中的位置,并将该第一映射关系中该位置上的内存池标识,确定为第一内存池的第一标识。例如,基于步骤S28中的示例内容可知,当应用程序的内存申请尺寸为50时,因应用程序的内存申请尺寸为50对应的内存池标识位于数组[0,1,2,2,2,2,2,2]中第2个元素位置,使得应用程序的内存申请尺寸50对应的第一标识应该是第2个内存池的内存池标识“1”。
基于上述S303的相关内容可知,本申请实施例中,在获取到应用程序的内存申请尺寸之后,可以根据应用程序的内存申请尺寸和第一映射关系,确定第一内存池的第一标识,以便后续能够基于该第一标识,将第一内存池中的下一个待分配内存块分配给应用程序进行使用。
S304:根据第一标识和第二映射关系,获取第一标识对应的第一内存地址,并在确定第一内存地址为有效地址时,将第一内存地址发送给应用程序。
有效地址与上文中的无效地址相对应,有效地址是指非无效地址,也就是具有实际内存块对应的地址。
本申请实施例中,在获取到第一标识之后,可以先在第二映射关系中,查询第一标识对应的内存池中下一个待分配内存块的内存地址,作为第一内存地址;再判断该第一内存地址是否是有效地址,若是,则确定第一内存池在当前时刻下存在可以使用的空闲内存块,此时,可以直接将第一内存地址发送给应用程序,以使该应用程序能够使用第一内存地址对应的内存块执行相应任务;若否,则确定在当前时刻下第一内存池中各内存块均处于使用状态,使得第一内存池无法为应用程序分配内存,此时,为了能够保证应用程序的正常运行,可以调用系统内存申请函数,以便能够按照默认的系统内存分配方案为应用程序分配内存。
基于上述步骤S301至S304的相关内容可知,在本申请实施例提供的内存分配方法中,在接收到应用程序启动请求时,先构建多个内存池、第一映射关系和第二映射关系,使得每个内存池均包括至少一个内存块,第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系,以及第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的地址之间的映射关系。然后,在接收到应用程序发送的内存申请请求之后,先根据内存申请请求获取应用程序的内存申请尺寸,并根据应用程序的内存申请尺寸和第一映射关系,确定第一内存池的第一标识;再根据第一标识和第二映射关系,获取第一标识对应的第一内存地址,并在确定第一内存地址为有效地址时,将第一内存地址发送给应用程序,以便后续应用程序能够使用第一内存地址对应的内存块。
可见,因各内存池、第一映射关系和第二映射关系均是在应用程序启动时构建的,使得在应用程序运行过程中接收到应用程序发送的内存申请请求之后,只需通过查询第一映射关系和第二映射关系,即可确定出为该应用程序分配的内存,如此简化了该应用程序运行过程中的内存申请流程,有利于提高内存分配效率,从而有利于提高该应用程序的运行流畅性。
方法实施例二
另外,若将第一内存地址发送给应用程序,则表示将第一内存地址对应的内存块分配给应用程序使用了,从而表示该第一内存地址对应的内存块在当前时刻下处于使用状态。此时,为了使得第一内存地址所述的第一内存池能够继续将空间内存块分配给应用程序使用,需要在确定第一内存地址之后,更新第二映射关系,使得后续能够利用第二映射关系查到第一内存池中的其他空闲内存块进行分配。
基于此,本申请实施例还提供了内存分配方法的一种实施方式,在该实施方式中,该内存分配方法除了可以包括上述S301至S304以外,还可以包括S305-S307(如图6所示):
S305:在确定第一内存地址为有效地址时,根据第一内存地址确定第一内存块。
其中,第一内存块是指第一内存池中具有第一内存地址的内存块。
S306:读取第一内存块中保存的第二内存地址。
其中,第二内存地址是指存储于第一内存块中的地址。
S307:利用第一标识和第二内存地址,更新第二映射关系,使得第二映射关系包括第一标识和第二内存地址之间的对应关系。
本申请实施例中,在确定第一内存地址为有效地址之后,可以先将第一内存地址对应的内存块确定为第一内存块,并从第一内存块中读取第二内存地址;再将第二内存地址作为第一内存池中的下一个待分配内存块,也就是将第二内存地址,设定为第一标识对应的第一内存池中的下一个待分配内存块,以便利用第一标识及其对应的第一内存池中的下一个待分配内存块(也就是,第二内存地址),更新第二映射关系,该更新过程具体为;删除第一标识与第一内存地址之间的对应关系,并增加第一标识和第二内存地址之间的对应关系。
作为示例,如图7所示,当第一内存池为图5所示的第i个内存池,第一内存地址为第i个内存池的第4个内存块的地址时,则S305-S307具体可以为:在确定第i个内存池的第4个内存块的地址为有效地址之后,先根据第i个内存池的第4个内存块的地址,确定第i个内存池的第4个内存块,并从第i个内存池的第4个内存块中读取到第i个内存池的第5个内存块的地址;再将第i个内存池的第5个内存块的地址,确定为第i个内存池中的下一个待分配内存块,并在第二映射关系中,将第i个内存池的内存标识(也就是,第一标识)对应的第i个内存池中的下一个待分配内存,替换为第i个内存池的第5个内存块的地址,以便后续在借助第i个内存池的内存标识和第二映射关系,查第i个内存池中的下一个待分配内存时,能够直接到第i个内存池的第5个内存块的地址。
基于上述S305至S307的相关内容可知,本申请实施例中,第二映射关系会随着应用程序的内存申请过程进行更新,其具体为:在确定将第一内存地址对应的第一内存块分配给应用程序时,可以在第二映射关系中,将第一标识对应的第一内存池中的下一个待分配内存块,替换为从第一内存块中存储的第二内存地址,以使后续内存分配过程中,能够直接借助第一标识和第二映射关系,查到第一内存池中的第二内存地址。可见,因第二映射关系会随着应用程序的内存申请过程进行更新,使得第二映射关系能够准确地反映各个内存池中不同内存块的使用状态,从而使得基于第二映射关系能够准确地确定出每一个内存池在当前时刻下可以分配给应用程序的内存块,如此有利于实现在提高分配准确性的前提下提高分配效率。
另外,为了提高内存分配准确性,可以设定为每个内存池在一个时间段内只能响应应用程序的一个内存申请请求,也就是,当一个内存池正在响应一个内存申请请求时,该内存池不能响应其他请求(例如,内存申请请求或内存释放请求),但是除了该内存池以外的其他内存池则可以响应其他请求。
基于此,本申请实施例还提供了内存分配方法的另一种实施方式,在该实施方式中,该内存分配方法除了可以包括上述全部或部分步骤以外,还可以包括S308-S313(如图8所示):
S308:在接收到应用程序启动请求时,构建第三映射关系。
第三映射关系用于记录内存池标识与内存池使能状态之间的映射关系。
内存使能状态用于表征内存池是否处于允许使用状态。另外,当一个内存池的内存使用状态为允许使用状态时,则表示该内存池可以为应用程序分配内存块;然而,当一个内存池的内存使用状态为不允许使用状态时,则表示该内存池暂时无法可以为应用程序分配内存块。
另外,在初始的第三映射关系(也就是,在接收到应用程序启动请求时构建的第三映射关系)中,每个内存池标识对应的内存池使能状态均是允许使用状态。
基于上述内容可知,本申请实施例中,在接收到应用程序启动请求时,还可以构建第三映射关系,使得第三映射关系能够准确地记录各个内存池的使能状态。
S309:根据第一标识和第三映射关系,确定第一内存池的使能状态。
本申请实施例中,在获取到第一标识之后,可以从第三映射关系中查出第一标识对应的内存池使能状态,作为第一内存池的使能状态,以便后续能够基于第一内存池的使能状态来确定第一内存池是否可以被使用。
需要说明的是,S309需要在执行S303之后且在执行S304之前执行。
S310:判断第一内存池的使能状态是否为允许使用状态,若是,则执行S311;若否,则执行S313。
S311:将第三映射关系中第一内存池的使能状态更新为不允许使用状态,并继续执行上文S304-S307。
本申请实施例中,在确定出第一内存池的使能状态为允许使用状态时,可以确定第一内存池在当前时刻下可以响应应用程序的内存申请请求。此时,为了能够达到第一内存池在一个时间段内只响应一个请求的目的,可以先将第三映射关系中第一内存池的使能状态更新为不允许使用状态,再执行上述S304-S307。其中,因在执行S304至S307期间,第三映射关系中记录的第一内存池的使能状态为不允许使用状态,使得第一内存池在执行S304至S307期间不再响应其他任何请求,如此能够使得第一内存池准确顺利地执行S304至S307,如此能够有效地避免因第一内存池在同一时间段响应两个请求引发的混乱现象,如此提高了内存池的内存分配准确性。
S312:将第三映射关系中第一内存池的使能状态更新为允许使用状态。
本申请实施例中,在第一内存池执行完上述S304-S307之后,可以确定第一内存池已完成了响应应用程序发送的内存申请请求,从而可以确定第一内存池已经处于稳定状态,此时该第一内存池可以继续响应其他请求了,因而,在执行完S304-S307之后,可以将第三映射关系中第一内存池的使能状态恢复为允许使用状态,以便第一内存池能够响应其他请求。
S313:等待预设时长,继续执行S309。
预设时长可以预先根据应用场景设定。例如,预设时长可以为3秒。
本申请实施例中,在确定第一内存池的使能状态为不允许使用状态时,可以确定第一内存池在当前时刻下正在处理其他请求,从而可以确定第一内存池在当前时刻下暂时不可以响应该应用程序的内存申请请求。此时,可以等待预设时长,再次去查询第二映射关系中第一内存池的使能状态是否发生变化,若没有发生变化,则继续等待预设时长;……(重复多次),直至在确定第二映射关系中第一内存池的使能状态为允许使用状态时,则可以执行上文S311及其后续步骤。
基于上述S308至S313的相关内容可知,本申请实施例中,在确定出第一内存池的第一标识之后,可以先利用第三映射关系,确定出第一内存池是否处于允许使用状态,以便在确定第一内存池处于不允许使用状态时,进行等待,直至在确定第一内存池处于允许使用状态时,根据第一标识和第二映射关系为应用程序分配第一内存池中的内存块。其中,因内存池在一个时间段只能处理一个请求,使得第一内存池准确顺利地响应应用程序的该请求,如此能够有效地避免因第一内存池在一个时间段同时响应两个请求引发的混乱现象,如此提高了内存池的内存分配准确性。
另外,在应用程序使用完内存块时,可以释放该内存块,以便后续在内存池再次响应内存申请请求时,优先将该释放的内存块再次提供给应用程序进行使用,如此能够保证在内存池中只有排列顺序靠前的内存块均被使用的基础上才会进一步使用排列顺序靠后的内存块。基于此,本申请实施例还提供了内存分配方法的又一种实施方式,在该实施方式中,内存分配方法除了可以包括上述全部或部分步骤以外,还可以包括S314-S319(如图9所示):
S314:在接收到应用程序启动请求时,构建第四映射关系。
第四映射关系用于记录内存池标识与内存池的内存地址之间的映射关系。
本申请实施例中,在获取到N个内存池之后,可以利用各个内存池的内存标识及其内存地址,构建第四映射关系,使得第四映射关系能够用于记录每个内存池的内存地址,以便后续能够直接通过借助一个内存池的内存标识,从第四映射关系中查到该内存池的内存地址。
S315:在接收到应用程序发送的内存释放请求之后,根据内存释放请求,确定待释放内存区域的内存地址。
内存释放请求用于表征应用程序发送的释放待释放内存区域的请求;而且,内存释放请求携带有待释放内存区域的内存地址。
本申请实施例中,在接收到应用程序发送的内存释放请求之后,可以直接从该内存释放请求中提取待释放内存区域的内存地址,以便后续能够基于该内存地址进行内存释放。
S316:根据原始内存区域的内存地址和待释放内存区域的内存地址,判断待释放内存区域是否属于原始内存区域,若是,则执行S317;若否,则执行S319。
原始内存区域包括N个内存池,而且原始内存区域的相关内容请参见上文。
本申请实施例中,在获取到待释放内存区域的内存地址之后,可以先根据原始内存区域的内存地址和待释放内存区域的内存地址,判断待释放内存区域是否属于原始内存区域,若是,则确定该待释放内存区域属于内存池中的内存块,此时可以利用下文S317-S318完成内存块的释放过程;若否,则确定该待释放内存区域不属于内存池中的内存块,此时可以直接使用系统内存释放函数对待释放内存区域进行释放。
S317:根据待释放内存区域的内存地址和第四映射关系,确定第二内存池的第二标识。
第二内存区域用于表征待释放内存区域所属的内存池。
本申请实施例中,在确定待释放内存区域属于原始内存区域时,可以在第四映射关系中查询待释放内存区域的内存地址对应的内存标识,确定第二内存池的第二标识,而且该查询过程具体可以为:先根据待释放内存区域的内存地址和第四映射关系,确定待释放内存区域的内存地址所属的目标内存池的内存地址;再根据第四映射关系和目标内存池的内存地址,确定第二内存池的第二标识。也就是,在确定待释放内存区域属于原始内存区域时,先分别利用第四映射关系中记录的各个内存池的内存地址与待释放内存区域的内存地址进行比较,确定出待释放内存区域的内存地址所属的目标内存池的内存地址;再在第四映射关系中直接查目标内存池的内存地址对应的内存标识,作为第二内存池的第二标识。
S318:根据第二标识和第二映射关系,获取第二标识对应的第三内存地址,将第三内存地址存储至待释放内存区域,并利用第二标识和待释放内存区域的内存地址,更新第二映射关系,使得第二映射关系包括第二标识和待释放内存区域的内存地址之间的对应关系。
本申请实施例中,为了能够实现在内存池中只有在内存地址排列顺序靠前的内存块均被使用的基础上,才会进一步使用内存地址排列顺序靠后的内存块的目的,可以在确定出待释放内存区域所属的内存池之后,先从第二映射关系中,查询在当前时刻下待释放内存区域所属的内存池中下一个待分配内存块的内存地址,作为第三内存地址;再将第三内存地址存储至待释放内存区域,并将第二映射关系中第二标识对应的内存池中下一个待分配内存块的内存地址,替换为待释放内存区域的内存地址,如此使得第三内存地址对应的内存块的使用顺序位于待释放内存区域之后。为了便于理解,下面结合图7所示的示例进行说明
作为示例,当第一内存池为图5所示的第i个内存池,第三内存地址为第i个内存池的第4个内存块的地址,待释放内存区域为第i个内存池的第1个内存块的地址时,则S318具体可以为:在确定待释放内存区域属于第i个内存池时,可以先从第二映射关系中,获取到第i个内存池中下一个待分配内存块的内存地址为第i个内存池的第4个内存块的地址;再将第i个内存池的第4个内存块的地址存储至第i个内存池的第1个内存块,以便将来在将第i个内存池的第1个内存块分配给应用程序使用时,能够从第i个内存池的第1个内存块中读取第i个内存池的第4个内存块的地址;同时,还需要将第二映射关系中第i个内存池中下一个待分配内存块的内存地址,替换为第i个内存池的第1个内存块,以使第i个内存池在下一次响应应用程序的内存申请请求时,能够直接将第i个内存池的第1个内存块再次分配给应用程序使用。
可见,本申请实施例中,各个内存池可以优先使用被释放的内存块来响应应用程序的内存申请请求,如此能够实现内存池优先使用内存地址排序靠前的内存块响应应用程序的内存申请请求,以便日后能够基于每个内存池中内存块的使用情况来调整内存池的大小,以使得调整后的内存池能够在满足应用程序内存使用的前提下减少内存池的尺寸。例如,当内存池包括1000个内存块时,若在实际应用过程中发现内存池中的内存地址排序靠前的800个内存块均使用过,但是内存地址排序靠前的200个内存块从来没有使用过,此时可以确定该内存池的尺寸偏大,应该缩小该内存池的尺寸。
S319:使用系统内存释放函数对待释放内存区域进行释放。
系统内存释放函数是指上文系统内存分配方案进行内存释放时所使用的函数。
基于上述S314至S319的相关内容可知,本申请实施例中,在接收到应用程序发送的内存释放请求之后,先根据内存释放请求确定待释放内存区域的内存地址,再根据原始内存区域的内存地址和待释放内存区域的内存地址,判断待释放内存区域是否属于原始内存区域,以便在确定待释放内存区域属于原始内存区域时,先根据待释放内存区域的内存地址和第四映射关系确定第二内存池的第二标识,并根据第二标识和第二映射关系获取第二标识对应的第三内存地址;再将第三内存地址存储至待释放内存区域,并利用第二标识和待释放内存区域的内存地址,更新第二映射关系,使得第二映射关系包括第二标识和待释放内存区域的内存地址之间的对应关系。
其中,因将第二内存池中待释放内存区域进行释放时,可以直接将第二映射关系中第二标识对应的内存池中下一个待分配内存块的内存地址,替换为待释放内存区域的内存地址,如此使得第三内存地址对应的内存块的使用顺序位于待释放内存区域之后。可见,本申请实施例中,各个内存池可以优先使用被释放的内存块来响应应用程序的内存申请请求,如此能够实现内存池优先使用内存地址排序靠前的内存块响应应用程序的内存申请请求,以便日后能够基于每个内存池中内存块的使用情况来调整内存池的大小,以使得调整后的内存池能够在满足应用程序内存使用的前提下减少内存池的尺寸。
另外,为了提高内存释放准确性,可以设定为每个内存池在一个时间段内只能响应应用程序的一个内存释放请求,也就是,当一个内存池正在响应一个内存释放请求时,该内存池不能响应其他请求(例如,内存申请请求或内存释放请求),但是除了该内存池以外的其他内存池则可以响应其他请求。
基于此,本申请实施例还提供了内存分配方法的再一种实施方式,在该实施方式中,该内存分配方法除了可以包括上述全部或部分步骤以外,还可以包括S320-S324(如图10所示):
S320:根据第二标识和第三映射关系,确定第二内存池的使能状态。
本申请实施例中,在获取到第二标识之后,可以从第三映射关系中查出第二标识对应的内存池使能状态,作为第二内存池的使能状态,以便后续能够基于第二内存池的使能状态来确定第二内存池是否可以被使用。
需要说明的是,S320需要在执行S317之后且在执行S318之前执行。
S321:判断第二内存池的使能状态是否为允许使用状态,若是,则执行S322;若否,则执行S324。
S322:将第三映射关系中第二内存池的使能状态更新为不允许使用状态,并继续执行上文S318。
本申请实施例中,在确定出第二内存池的使能状态为允许使用状态时,可以确定第二内存池在当前时刻下可以响应应用程序的内存释放请求。此时,为了能够达到第二内存池在一个时间段内只响应一个请求的目的,可以先将第三映射关系中第二内存池的使能状态更新为不允许使用状态,再执行上述S318。其中,因在执行S318期间,第三映射关系中记录的第二内存池的使能状态为不允许使用状态,使得第二内存池在执行S318期间不再响应其他任何请求,如此能够使得第二内存池准确顺利地执行S318,如此能够有效地避免因第二内存池在同一时间段响应两个请求引发的混乱现象,如此提高了内存池的内存释放准确性。
S323:将第三映射关系中第二内存池的使能状态更新为允许使用状态。
本申请实施例中,在第二内存池执行完上述S318之后,可以确定第二内存池已完成了响应应用程序发送的内存释放请求,从而可以确定第二内存池已经处于稳定状态,此时该第二内存池可以继续响应其他请求了,因而,在执行完S318之后,可以将第三映射关系中第二内存池的使能状态恢复为允许使用状态,以便第二内存池能够响应其他请求。
S324:等待预设时长,继续执行S320。
本申请实施例中,在确定第二内存池的使能状态为不允许使用状态时,可以确定第二内存池在当前时刻下正在处理其他请求,从而可以确定第二内存池在当前时刻下暂时不可以响应该应用程序的内存释放请求。此时,可以等待预设时长,再次去查询第二映射关系中第二内存池的使能状态是否发生变化,若没有发生变化,则继续等待预设时长;……(重复多次),直至在确定第二映射关系中第二内存池的使能状态为允许使用状态时,则可以执行上文S322及其后续步骤。
基于上述S320至S324的相关内容可知,本申请实施例中,在确定出第二内存池的第二标识之后,可以先利用第三映射关系,确定出第二内存池是否处于允许使用状态,以便在确定第二内存池处于不允许使用状态时,进行等待,直至在确定第二内存池处于允许使用状态时,根据第二标识和第二映射关系对待释放内存区域进行释放。其中,因内存池在一个时间段只能处理一个请求,使得第二内存池准确顺利地响应应用程序的该请求,如此能够有效地避免因第二内存池在一个时间段同时响应两个请求引发的混乱现象,如此提高了内存池的内存分配准确性。
为了便于进一步理解本申请实施例提供的内存分配方法,场景实施例将结合图11对本申请实施例提供的内存分配方法进行整体介绍。
场景实施例
场景实施例是对方法实施例提供的内存分配方法的示例性介绍,为了简要起见,场景实施例中与方法实施例中部分内容相同,在此不再赘述,该内容相同的部分的技术详情请参照方法实施例中的相关内容。
参见图11,该图为本申请实施例提供的应用于图1所示应用场景下的内存分配方法的流程图。
本申请实施例提供的内存分配方法,包括S1101-S1120:
S1101:终端设备在接收到用户触发的应用程序启动请求时,使用系统内存申请函数,获取原始内存区域的内存地址。
原始内存区域的相关内容请参见上文步骤11。
应用程序可以是指游戏软件,尤其可以是指使用水银引擎打造的大型多人在线角扮演游戏软件。其中,大型多人在线角扮演游戏软件的游戏内容十分丰富,支持大场景无缝连接,场景中有各种大大小小的物件,人物也很复杂,有非常多的服装,还支持数百人同屏大混战。可见,这么多的服务需求对游戏加载和运行时刻的内存申请分配性能就有了较高的要求。
本申请实施例中,当用户点击终端设备上的应用程序图标(例如,如图12所示的游戏软件图标)时,触发应用程序启动请求,此时终端设备便可以接收到该应用程序启动请求,并使用系统内存申请函数,获取原始内存区域的内存地址,以便后续能够基于该原始内存区域构建内存池。
S1102:终端设备利用原始内存区域,构建N个内存池。
需要说明的是,S1102可以采用上文步骤12至步骤13来构建N个内存池,请参见上文步骤12至步骤13。
S1103:终端设备根据N个内存池,构建第一映射关系、第二映射关系、第三映射关系和第四映射关系。
其中,第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系;所述第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系;第四映射关系用于记录内存池标识与内存池的内存地址之间的映射关系;第三映射关系用于记录内存池标识与内存池使能状态之间的映射关系。
另外,本申请实施例不限定在实际应用时第一映射关系、第二映射关系、第四映射关系和第三映射关系之间的关系,例如,可以利用一个全局数组表征第二映射关系、第四映射关系和第三映射关系,并利用一个静态数组表征第一映射关系,如此使得全局数组用于记录内存池标识与内存池的内存池尺寸、内存地址、内存块尺寸、下一个待分配内存块的内存地址、以及使能状态之间的对应关系;静态数组用于记录申请尺寸区间与内存池标识之间的对应关系。
S1104:终端设备在接收到应用程序发送的内存申请请求之后,根据内存申请请求获取应用程序的内存申请尺寸,并根据应用程序的内存申请尺寸和第一映射关系确定第一内存池的第一标识。
S1105:终端设备根据第一标识和第三映射关系,确定第一内存池的使能状态。
S1106:终端设备判断第一内存池的使能状态是否为允许使用状态,若是,则执行S1108;若否,则执行S1107。
S1107:终端设备等待预设时长,继续执行S1105。
S1108:终端设备将第三映射关系中第一内存池的使能状态更新为不允许使用状态,并根据第一标识和第二映射关系,获取第一标识对应的第一内存地址。
S1109:终端设备判断第一内存地址是否为有效地址,若是,则执行S1110;若否,则执行S1111。
S1110:终端设备根据第一内存地址确定第一内存块,读取第一内存块中保存的第二内存地址,并利用第一标识和第二内存地址,更新第二映射关系,使得第二映射关系包括第一标识和第二内存地址之间的对应关系;并将第一内存地址发送给应用程序。
S1111:终端设备使用系统内存申请函数为应用程序分配符合应用程序的内存申请尺寸的内存。
S1112:终端设备将第三映射关系中第一内存池的使能状态更新为允许使用状态。
S1113:终端设备在接收到应用程序发送的内存释放请求之后,根据内存释放请求,确定待释放内存区域的内存地址。
S1114:终端设备根据原始内存区域的内存地址和待释放内存区域的内存地址,判断待释放内存区域是否属于原始内存区域,若是,则执行S1116;若否,则执行S1115。
S1115:终端设备使用系统内存释放函数对待释放内存区域进行释放。
S1116:终端设备根据待释放内存区域的内存地址和第四映射关系,确定第二内存池的第二标识。
S1117:终端设备根据第二标识和第三映射关系,确定第二内存池的使能状态。
S1118:终端设备判断第二内存池的使能状态是否为允许使用状态,若是,则执行S1119;若否,则执行S1120。
S1119:终端设备将第三映射关系中第二内存池的使能状态更新为不允许使用状态,根据第二标识和第二映射关系,获取第二标识对应的第三内存地址,将第三内存地址存储至待释放内存区域,并利用第二标识和待释放内存区域的内存地址,更新第二映射关系,使得第二映射关系包括第二标识和待释放内存区域的内存地址之间的对应关系,将第三映射关系中第二内存池的使能状态更新为允许使用状态。
S1120:终端设备等待预设时长,继续执行S1117。
基于上述S1101至S1120的相关内容可知,在本申请实施例中,因各内存池、第一映射关系和第二映射关系均是在应用程序启动时构建的,使得在应用程序运行过程中接收到应用程序发送的内存申请请求之后,只需通过查询第一映射关系和第二映射关系,即可确定出为该应用程序分配的内存,如此简化了该应用程序运行过程中的内存申请流程,有利于提高内存分配效率,从而有利于提高该应用程序的运行流畅性。
基于上述提供的内存分配方法的相关内容,本申请实施例还提供了对应的内存分配装置,以使得上述提供的内存分配方法在实际中得以应用和实现。
装置实施例
需要说明的是,本实施例提供的内存分配装置的技术详情可以参照上述提供的内存分配方法。
参见图13,该图为本申请实施例提供的一种内存分配装置的结构示意图。
本申请实施例提供的内存分配装置1300,包括:
构建单元1301,用于在接收到应用程序启动请求时,构建N个内存池、第一映射关系和第二映射关系;所述内存池包括至少一个内存块;所述第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系;所述第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系;N为正整数;
第一处理单元1302,用于在接收到所述应用程序发送的内存申请请求之后,根据所述内存申请请求获取所述应用程序的内存申请尺寸,并根据所述应用程序的内存申请尺寸和所述第一映射关系,确定第一内存池的第一标识;
分配单元1303,用于根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址,并在确定所述第一内存地址为有效地址时,将所述第一内存地址发送给所述应用程序。
可选的,在图13所示的内存分配装置1300的基础上,所述构建单元1301,具体用于:当所述内存池中的内存块按照单链表进行连接,位于同一个所述内存池中的各内存块的尺寸相同时,
使用系统内存申请函数,获取原始内存区域的内存地址;
将所述原始内存区域的内存地址进行内存池划分,得到N个内存池的内存地址;
将第i个内存池的内存地址按照第i个尺寸进行内存块划分,得到第i个内存池的Mi个内存块,将第i个内存池的第j+1个内存块的内存地址存储至第i个内存池的第j个内存块,并将预设无效地址存储至第i个内存池的第Mi个内存块;j为正整数,j≤Mi-1;Mi为正整数;i为正整数,i≤N。
可选的,在图13所示的内存分配装置1300的基础上,所述构建单元1301,具体用于:当位于同一个所述内存池中的各内存块的尺寸相同时,
计算所述N个内存池中任意两个内存池的内存块尺寸之间的差值,得到第一差值集合;所述内存块尺寸用于表征所述内存池中内存块的尺寸;
将所述第一差值集合中的最小值确定为第一尺寸值,将所述N个内存池的内存块尺寸中的最小值确定为第二尺寸值,并将所述第一尺寸值和所述第二尺寸值中的最小值确定为第三尺寸值;
将所述N个内存池的内存块尺寸中的最大值确定为第四尺寸值,并将所述第四尺寸值和所述第三尺寸值的比值,确定为第一数目;所述第一数目用于表征所述第一映射关系中的关系个数;
分别将各所述内存池的内存块尺寸与r倍的第三尺寸值作差,得到第二差值集合,并将第二差值集合中的最小非负差值对应的内存池的内存池标识,作为第r个申请尺寸区间对应的内存池标识;所述第r个申请尺寸区间为区间(r-1倍的第三尺寸值,r倍的第三尺寸值];r为正整数,r≤第一数目;
根据各个申请尺寸区间及其对应的内存池标识,建立第一映射关系。
可选的,在图13所示的内存分配装置1300的基础上,所述第一处理单元1302,具体用于:
根据所述应用程序的内存申请尺寸和第一映射关系,确定所述应用程序的内存申请尺寸所属的目标申请尺寸区间;
根据所述目标申请尺寸区间和所述第一映射关系,确定第一内存池的第一标识。
可选的,在图13所示的内存分配装置1300的基础上,如图14所示,所述内存分配装置1300还包括:
第一更新单元1304,用于在确定所述第一内存地址为有效地址时,根据所述第一内存地址确定第一内存块;读取所述第一内存块中保存的第二内存地址;利用所述第一标识和所述第二内存地址,更新所述第二映射关系,使得所述第二映射关系包括所述第一标识和所述第二内存地址之间的对应关系。
可选的,在图13或图14所示的内存分配装置1300的基础上,如图15所示,所述内存分配装置1300还包括:
所述构建单元1301,还用于在接收到应用程序启动请求时,构建第三映射关系;
确定单元1305,用于根据所述第一标识和所述第三映射关系,确定所述第一内存池的使能状态;
所述分配单元1303,具体用于在确定所述第一内存池的使能状态为允许使用状态时,根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址。
可选的,在图13-图15任一项所示的内存分配装置1300的基础上,如图16所示,所述内存分配装置1300还包括:
所述构建单元1301,还用于在接收到应用程序启动请求时,构建第四映射关系;所述第四映射关系用于记录内存池标识与内存池的内存地址之间的映射关系;
第二处理单元1306,用于在接收到所述应用程序发送的内存释放请求之后,根据所述内存释放请求,确定待释放内存区域的内存地址,并根据原始内存区域的内存地址和所述待释放内存区域的内存地址,判断所述待释放内存区域是否属于所述原始内存区域;其中,所述原始内存区域包括N个内存池;
释放单元1307,用于在确定所述待释放内存区域属于所述原始内存区域时,根据所述待释放内存区域的内存地址和所述第四映射关系,确定第二内存池的第二标识,并根据所述第二标识和所述第二映射关系,获取所述第二标识对应的第三内存地址;将所述第三内存地址存储至所述待释放内存区域,并利用所述第二标识和所述待释放内存区域的内存地址,更新所述第二映射关系,使得所述第二映射关系包括所述第二标识和所述待释放内存区域的内存地址之间的对应关系。
基于上述内存分配装置1300的相关内容可知,本申请实施例提供的内存分配方法中,在接收到应用程序启动请求时,先构建多个内存池、第一映射关系和第二映射关系,使得每个内存池均包括至少一个内存块,第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系,以及第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的地址之间的映射关系。然后,在接收到应用程序发送的内存申请请求之后,先根据内存申请请求获取应用程序的内存申请尺寸,并根据应用程序的内存申请尺寸和第一映射关系,确定第一内存池的第一标识;再根据第一标识和第二映射关系,获取第一标识对应的第一内存地址,并在确定第一内存地址为有效地址时,将第一内存地址发送给应用程序,以便后续应用程序能够使用第一内存地址对应的内存块。
可见,因各内存池、第一映射关系和第二映射关系均是在应用程序启动时构建的,使得在应用程序运行过程中接收到应用程序发送的内存申请请求之后,只需通过查询第一映射关系和第二映射关系,即可确定出为该应用程序分配的内存,如此简化了该应用程序运行过程中的内存申请流程,有利于提高内存分配效率,从而有利于提高该应用程序的运行流畅性。
本申请实施例还提供了一种用于分配内存的终端设备和服务器,下面将从硬件实体化的角度对本申请实施例提供的用于分配内存的终端设备和服务器进行介绍。
参见图17,为本申请实施例提供的一种终端设备的结构示意图。为了便于说明,仅示出了与本申请实施例相关的部分,具体技术细节未揭示的,请参照本申请实施例方法部分。该终端可以为包括手机、平板电脑、个人数字助理(英文全称:Personal DigitalAssistant,英文缩写:PDA)、销售终端(英文全称:Point of Sales,英文缩写:POS)、车载电脑等任意终端设备,以终端为平板电脑为例:
图17示出的是与本申请实施例提供的终端相关的平板电脑的部分结构的框图。参考图17,平板电脑包括:射频(英文全称:Radio Frequency,英文缩写:RF)电路1710、存储器1720、输入单元1730、显示单元1740、传感器1750、音频电路1760、无线保真(英文全称:wireless fidelity,英文缩写:WiFi)模块1770、处理器1780、以及电源1790等部件。本领域技术人员可以理解,图17中示出的平板电脑结构并不构成对平板电脑的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
存储器1720可用于存储软件程序以及模块,处理器1780通过运行存储在存储器1720的软件程序以及模块,从而执行平板电脑的各种功能应用以及数据处理。存储器1720可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据平板电脑的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器1720可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
处理器1780是平板电脑的控制中心,利用各种接口和线路连接整个平板电脑的各个部分,通过运行或执行存储在存储器1720内的软件程序和/或模块,以及调用存储在存储器1720内的数据,执行平板电脑的各种功能和处理数据,从而对平板电脑进行整体监控。可选的,处理器1780可包括一个或多个处理单元;优选的,处理器1780可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器1780中。
在本申请实施例中,该终端所包括的处理器1780还具有以下功能:
在接收到应用程序启动请求时,构建N个内存池、第一映射关系和第二映射关系;所述内存池包括至少一个内存块;所述第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系;所述第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系;N为正整数;
在接收到所述应用程序发送的内存申请请求之后,根据所述内存申请请求获取所述应用程序的内存申请尺寸,并根据所述应用程序的内存申请尺寸和所述第一映射关系,确定第一内存池的第一标识;
根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址,并在确定所述第一内存地址为有效地址时,将所述第一内存地址发送给所述应用程序。
可选的,所述处理器1780还用于执行本申请实施例提供的内存分配方法的任意一种实现方式的步骤。
本申请实施例还提供了一种服务器,图18是本申请实施例提供的一种服务器的结构示意图,该服务器1800可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(central processing units,CPU)1822(例如,一个或一个以上处理器)和存储器1832,一个或一个以上存储应用程序1842或数据1844的存储介质1830(例如一个或一个以上海量存储设备)。其中,存储器1832和存储介质1830可以是短暂存储或持久存储。存储在存储介质1830的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器1822可以设置为与存储介质1830通信,在服务器1800上执行存储介质1830中的一系列指令操作。
服务器1800还可以包括一个或一个以上电源1826,一个或一个以上有线或无线网络接口1850,一个或一个以上输入输出接口1858,和/或,一个或一个以上操作系统1841,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
上述实施例中由服务器所执行的步骤可以基于该图18所示的服务器结构。
其中,CPU 1822用于执行如下步骤:
在接收到应用程序启动请求时,构建N个内存池、第一映射关系和第二映射关系;所述内存池包括至少一个内存块;所述第一映射关系用于记录申请尺寸区间与内存池标识之间的映射关系;所述第二映射关系用于记录内存池标识与内存池中下一个待分配内存块的内存地址之间的映射关系;N为正整数;
在接收到所述应用程序发送的内存申请请求之后,根据所述内存申请请求获取所述应用程序的内存申请尺寸,并根据所述应用程序的内存申请尺寸和所述第一映射关系,确定第一内存池的第一标识;
根据所述第一标识和所述第二映射关系,获取所述第一标识对应的第一内存地址,并在确定所述第一内存地址为有效地址时,将所述第一内存地址发送给所述应用程序。
可选的,CPU 1822还可以用于执行本申请实施例中内存分配方法的任意一种实现方式的步骤。
本申请实施例还提供一种计算机可读存储介质,用于存储计算机程序,该计算机程序用于执行前述各个实施例所述的一种内存分配方法中的任意一种实施方式。
本申请实施例还提供一种包括指令的计算机程序产品,当其在计算机上运行时,使得计算机执行前述各个实施例所述的一种内存分配方法中的任意一种实施方式。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(英文全称:Read-OnlyMemory,英文缩写:ROM)、随机存取存储器(英文全称:Random Access Memory,英文缩写:RAM)、磁碟或者光盘等各种可以存储计算机程序的介质。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。
本文发布于:2023-04-13 12:32:02,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/3/86013.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |