G06F9/50
1.一种内存配置方法,其特征在于,包括:
基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素;
若确定未成功申请所述目标内存元素,则为所述业务模块创建目标扩展内存池,以及将所述目标扩展内存池作为新增节点添加到所述链表的尾部;
所述链表的头节点对应所述业务模块的默认内存池,所述链表中除头节点以外的节点对应所述业务模块的扩展内存池;所述默认内存池是在初始化用户态进程的情况下,为所述业务模块创建的。
2.根据权利要求1所述内存配置方法,其特征在于,所述创建目标扩展内存池,包括:
基于所述默认内存池的容量,持续执行用于创建所述目标扩展内存池的第一操作直至确定满足终止条件;
第1次执行所述第一操作所申请的内存容量为所述默认内存池的容量;第二内存容量为第一内存容量的一半,所述第一内存容量为第(N-1)次执行所述第一操作所申请的内存容量,所述第二内存容量为第N次执行所述第一操作所申请的内存容量,所述N为大于或等于2的正整数;
所述确定满足终止条件为以下操作中的任意一项:
确定成功创建所述目标扩展内存池;
或,确定累计值大于或等于预设创建尝试次数,所述累计值用于记录执行所述第一操作的累计次数,所述累计值被配置为零的第一时刻为通过所述第一操作成功创建所述目标扩展内存池的时刻;
或,确定所述第二内存容量小于或等于预设内存容量。
3.根据权利要求2所述内存配置方法,其特征在于,所述默认内存池的容量为预设内存元素容量与预设内存元素数量的乘积;在所述基于所述默认内存池的容量,持续执行用于创建所述目标扩展内存池的第一操作直至确定满足终止条件之后,所述创建目标扩展内存池还包括:
在确定累计值大于或等于预设创建尝试次数,或确定所述第二内存容量小于或等于预设内存容量的情况下,基于所述预设内存元素容量,执行用于创建所述目标扩展内存池的第二操作。
4.根据权利要求3所述内存配置方法,其特征在于,在所述基于所述预设内存元素容量,执行用于创建所述目标扩展内存池的第二操作之后,还包括:
若确定通过所述第二操作成功创建所述目标扩展内存池,则确定执行所述第二操作的第二时刻;
若确定系统时刻与所述第二时刻之间的时间间隔大于或等于预设时间间隔,则配置所述累计值为0。
5.根据权利要求3所述内存配置方法,其特征在于,所述目标内存元素的头信息包括内存类型标志,所述内存类型标志用于指示所述目标内存元素所属的内存为第一类型内存或第二类型内存,所述第一类型内存为默认内存池或通过所述第一操作创建的扩展内存池,所述第二类型内存为通过所述第二操作创建的扩展内存池;
在所述基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素之后,还包括:
基于所述内存类型标志,释放所述目标内存元素。
6.根据权利要求5所述内存配置方法,其特征在于,所述基于所述内存类型标志,释放所述目标内存元素,包括:
在所述内存类型标志指示所述目标内存元素所属的内存为第一类型内存的情况下,确定所述目标内存元素所属的目标内存池;
基于所述目标内存元素的头信息,在所述目标内存池中释放所述目标内存元素。
7.根据权利要求6所述内存配置方法,其特征在于,在所述基于所述目标内存元素的头信息,在所述目标内存池中释放所述目标内存元素之后,还包括:
在所述目标内存池为通过所述第一操作创建的扩展内存池的情况下,获取所述目标内存池的使用率;
若确定所述使用率为零,则销毁所述目标内存池,并将所述目标内存池对应的节点从所述链表中删除。
8.一种内存配置装置,其特征在于,包括:
申请模块,用于基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素;
创建模块,用于若确定未成功申请所述目标内存元素,则为所述业务模块创建目标扩展内存池,以及将所述目标扩展内存池作为新增节点添加到所述链表的尾部;
所述链表的头节点对应所述业务模块的默认内存池,所述链表中除头节点以外的节点对应所述业务模块的扩展内存池;所述默认内存池是在初始化用户态进程的情况下,为所述业务模块创建的。
9.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至7任一项所述内存配置方法。
10.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述内存配置方法。
本发明涉及计算机技术领域,尤其涉及一种内存配置方法、装置、电子设备及存储介质。
池是一种常见的设计技术,它将计算机中常用的核心资源提前申请出来,放到一个池子里面,由计算机自行管理资源的释放与申请。数据平面开发套件(Data PlaneDevelopment Kit,DPDK)作为一种高性能数据转发套件,其中的关键内存资源,提供了类似内存池的结构,这一结构在DPDK内部称为mempool。
高速缓冲存储器(cache)是计算机体系中的一个非常重要的概念,它充当了中央处理器(Central Processing Unit,CPU)与主存之间的缓冲,平衡了CPU访问寄存器与访问主存之间的巨大差异,带了更好的性能。cache技术可以抽象为一种缓冲技术,它将少部分访问非常频繁的数据缓存起来,对这些数据的访问通过缓冲区完成,不用访问更底层的结构。DPDK的mempool中就使用了缓冲技术,在DPDK内部称为mempool cache,与cache类似,mempool cache中的元素更少,访问速度更快,在软件上的意义是执行更少的代码逻辑。但DPDK的mempool内存池创建后大小固定,灵活性较差。
本发明提供一种内存配置方法、装置、电子设备及存储介质,用以解决现有技术中DPDK的mempool内存池创建后大小固定,灵活性较差的缺陷,实现动态扩容业务模块的内存池。
第一方面,本发明提供一种内存配置方法,包括:
基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素;
若确定未成功申请所述目标内存元素,则为所述业务模块创建目标扩展内存池,以及将所述目标扩展内存池作为新增节点添加到所述链表的尾部;
所述链表的头节点对应所述业务模块的默认内存池,所述链表中除头节点以外的节点对应所述业务模块的扩展内存池;所述默认内存池是在初始化用户态进程的情况下,为所述业务模块创建的。
可选地,根据本发明提供的一种内存配置方法,所述创建目标扩展内存池,包括:
基于所述默认内存池的容量,持续执行用于创建所述目标扩展内存池的第一操作直至确定满足终止条件;
第1次执行所述第一操作所申请的内存容量为所述默认内存池的容量;第二内存容量为第一内存容量的一半,所述第一内存容量为第(N-1)次执行所述第一操作所申请的内存容量,所述第二内存容量为第N次执行所述第一操作所申请的内存容量,所述N为大于或等于2的正整数;
所述确定满足终止条件为以下操作中的任意一项:
确定成功创建所述目标扩展内存池;
或,确定累计值大于或等于预设创建尝试次数,所述累计值用于记录执行所述第一操作的累计次数,所述累计值被配置为零的第一时刻为通过所述第一操作成功创建所述目标扩展内存池的时刻;
或,确定所述第二内存容量小于或等于预设内存容量。
可选地,根据本发明提供的一种内存配置方法,所述默认内存池的容量为预设内存元素容量与预设内存元素数量的乘积;在所述基于所述默认内存池的容量,持续执行用于创建所述目标扩展内存池的第一操作直至确定满足终止条件之后,所述创建目标扩展内存池还包括:
在确定累计值大于或等于预设创建尝试次数,或确定所述第二内存容量小于或等于预设内存容量的情况下,基于所述预设内存元素容量,执行用于创建所述目标扩展内存池的第二操作。
可选地,根据本发明提供的一种内存配置方法,在所述基于所述预设内存元素容量,执行用于创建所述目标扩展内存池的第二操作之后,还包括:
若确定通过所述第二操作成功创建所述目标扩展内存池,则确定执行所述第二操作的第二时刻;
若确定系统时刻与所述第二时刻之间的时间间隔大于或等于预设时间间隔,则配置所述累计值为0。
可选地,根据本发明提供的一种内存配置方法,所述目标内存元素的头信息包括内存类型标志,所述内存类型标志用于指示所述目标内存元素所属的内存为第一类型内存或第二类型内存,所述第一类型内存为默认内存池或通过所述第一操作创建的扩展内存池,所述第二类型内存为通过所述第二操作创建的扩展内存池;
在所述基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素之后,还包括:
基于所述内存类型标志,释放所述目标内存元素。
可选地,根据本发明提供的一种内存配置方法,所述基于所述内存类型标志,释放所述目标内存元素,包括:
在所述内存类型标志指示所述目标内存元素所属的内存为第一类型内存的情况下,确定所述目标内存元素所属的目标内存;
基于所述目标内存元素的头信息,在所述目标内存中释放所述目标内存元素。
可选地,根据本发明提供的一种内存配置方法,在所述基于所述目标内存元素的头信息,在所述目标内存中释放所述目标内存元素之后,还包括:
在所述目标内存为通过所述第一操作创建的扩展内存池的情况下,获取所述目标内存的使用率;
若确定所述使用率为零,则销毁所述目标内存,并将所述目标内存对应的节点从所述链表中删除。
第二方面,本发明还提供一种内存配置装置,包括:
申请模块,用于基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素;
创建模块,用于若确定未成功申请所述目标内存元素,则为所述业务模块创建目标扩展内存池,以及将所述目标扩展内存池作为新增节点添加到所述链表的尾部;
所述链表的头节点对应所述业务模块的默认内存池,所述链表中除头节点以外的节点对应所述业务模块的扩展内存池;所述默认内存池是在初始化用户态进程的情况下,为所述业务模块创建的。
第三方面,本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述内存配置方法。
第四方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述内存配置方法。
本发明提供的内存配置方法、装置、电子设备及存储介质,通过基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,若确定未成功申请目标内存元素,则表示业务模块的内存池内存元素全都被耗尽,进而可以为业务模块创建目标扩展内存池并将目标扩展内存池作为新增节点添加到链表的尾部,进而可以再次基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,进而可以在目标扩展内存池中成功申请目标内存元素,能够实现动态扩容业务模块的内存池。
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的内存配置方法的流程示意图;
图2是本发明提供的内存配置装置的结构示意图;
图3是本发明提供的电子设备的结构示意图。
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明提供的内存配置方法的流程示意图,如图1所示,所述内存配置方法的执行主体可以是电子设备。该方法包括:
步骤101,基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素。
所述链表的头节点对应所述业务模块的默认内存池,所述链表中除头节点以外的节点对应所述业务模块的扩展内存池;所述默认内存池是在初始化用户态进程的情况下,为所述业务模块创建的。
具体地,为了实现动态扩容业务模块的内存池,在初始化用户态进程的情况下,可以为业务模块创建默认内存池,在初始化用户态进程之后默认内存池使用耗尽时,可以为业务模块创建扩展内存池,在为业务模块创建内存的过程中每次创建一个内存池,则可以将该内存作为新增节点添加到链表的尾部,链表的头节点对应业务模块的默认内存池,链表中除头节点以外的节点对应业务模块的扩展内存池,通过链表可以指示内存申请顺序。
具体地,可以基于链表指示的内存申请顺序,遍历业务模块的各内存池,尝试申请目标内存元素,直至成功申请目标内存元素,或者遍历完业务模块的各内存池未成功申请目标内存元素。
步骤102,若确定未成功申请所述目标内存元素,则为所述业务模块创建目标扩展内存池,以及将所述目标扩展内存池作为新增节点添加到所述链表的尾部。
具体地,若遍历完业务模块的各内存未成功申请目标内存元素,则表示业务模块的内存池内存元素全都耗尽,可以为业务模块创建目标扩展内存池,并将目标扩展内存池作为新增节点添加到链表的尾部,进而可以再次基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,进而可以在目标扩展内存池中成功申请目标内存元素。
可选地,可以为各内存池配置模块名称,针对同一个业务模块可以创建多个内存池(包括默认内存池和扩展内存池),这多个内存池的模块名称相同。可以按照序号累加的方式,为各扩展内存池配置索引序号。
本发明提供的内存配置方法,通过基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,若确定未成功申请目标内存元素,则表示业务模块的内存池内存元素全都被耗尽,进而可以为业务模块创建目标扩展内存池并将目标扩展内存池作为新增节点添加到链表的尾部,进而可以再次基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,进而可以在目标扩展内存池中成功申请目标内存元素,能够实现动态扩容业务模块的内存池。
可选地,所述创建目标扩展内存池,包括:
基于所述默认内存池的容量,持续执行用于创建所述目标扩展内存池的第一操作直至确定满足终止条件;
第1次执行所述第一操作所申请的内存容量为所述默认内存池的容量;第二内存容量为第一内存容量的一半,所述第一内存容量为第(N-1)次执行所述第一操作所申请的内存容量,所述第二内存容量为第N次执行所述第一操作所申请的内存容量,所述N为大于或等于2的正整数;
所述确定满足终止条件为以下操作中的任意一项:
确定成功创建所述目标扩展内存池;
或,确定累计值大于或等于预设创建尝试次数,所述累计值用于记录执行所述第一操作的累计次数,所述累计值被配置为零的第一时刻为通过所述第一操作成功创建所述目标扩展内存池的时刻;
或,确定所述第二内存容量小于或等于预设内存容量。
具体地,在确定未成功申请所述目标内存元素之后,可以基于默认内存池的容量,持续执行用于创建目标扩展内存池的第一操作直至确定满足终止条件。
具体地,每次执行第一操作所申请的内存容量是不同的,第1次执行第一操作所申请的内存容量为默认内存池的容量,第2次执行第一操作所申请的内存容量为第1次执行第一操作所申请的内存容量的一半,第3次执行第一操作所申请的内存容量为第2次执行第一操作所申请的内存容量的一半,以此类推,若第(N-1)次执行第一操作所申请的内存容量为第一内存容量,第N次执行第一操作所申请的内存容量为第二内存容量,那么第二内存容量为第一内存容量的一半。
具体地,在持续执行第一操作的过程中,可以确定是否满足终止条件,若确定满足终止条件,则停止执行第一操作。
可选地,在持续执行第一操作的过程中,若确定成功创建目标扩展内存池,则可以停止执行第一操作。在此情况下,可以配置累计值为零。
可选地,在持续执行第一操作的过程中,若确定累计值大于或等于预设创建尝试次数(例如,预设创建尝试次数可以是10次),则可以停止执行第一操作。
可以理解的是,累计值的初始值可以是零,每执行一次第一操作,则累计值可以增加1,当累计值大于或等于预设创建尝试次数的情况下,则可以确定当前系统剩余内存已不足。
可选地,在持续执行第一操作的过程中,若确定第二内存容量小于或等于预设内存容量(例如,预设内存容量可以是零),则可以停止执行第一操作。
因此,在默认内存池耗尽后实现动态扩容内存池并加入链表管理申请使用,并在内存池扩展创建中判断系统内存不足时尝试循环减半扩容内存池,不在内存不足时频繁调用扩容内存池导致创建失败以减少系统性能损耗。
可选地,所述默认内存池的容量为预设内存元素容量与预设内存元素数量的乘积;在所述基于所述默认内存池的容量,持续执行用于创建所述目标扩展内存池的第一操作直至确定满足终止条件之后,所述创建目标扩展内存池还包括:
在确定累计值大于或等于预设创建尝试次数,或确定所述第二内存容量小于或等于预设内存容量的情况下,基于所述预设内存元素容量,执行用于创建所述目标扩展内存池的第二操作。
具体地,在确定累计值大于或等于预设创建尝试次数,或确定第二内存容量小于或等于预设内存容量的情况下,则表示当前系统剩余内存已不足,进而可以基于预设内存元素容量,执行用于创建目标扩展内存池的第二操作,也即可以为业务模块创建内存容量较小的目标扩展内存池。
可以理解的是,所述第一操作可以是创建内存池cache,所述第二操作可以是创建普通内存,普通内存的容量小于cache的容量。
因此,在当前系统剩余内存已不足的情况下,可以为业务模块创建内存容量较小的目标扩展内存池,不在内存不足时频繁调用扩容内存池导致创建失败以减少系统性能损耗。
可选地,在所述基于所述预设内存元素容量,执行用于创建所述目标扩展内存池的第二操作之后,所述方法还包括:
若确定通过所述第二操作成功创建所述目标扩展内存池,则确定执行所述第二操作的第二时刻;
若确定系统时刻与所述第二时刻之间的时间间隔大于或等于预设时间间隔,则配置所述累计值为0。
具体地,在执行第二操作之后,可以判断是否成功创建目标扩展内存池,若确定成功创建目标扩展内存池,则可以记录执行第二操作的时刻(也即第二时刻),进而可以比较系统时刻与第二时刻之间的时间间隔与预设时间间隔(例如,预设时间间隔可以是10分钟)的大小,在确定前者大于或等于后者的情况下,可以配置累计值为0,表示后续再创建扩展内存池的过程中,可以通过第一操作尝试创建扩展内存池。
可以理解的是,为业务模块创建目标扩展内存池失败会不断累加累计值,在确定累计值大于或等于预设创建尝试次数,或确定第二内存容量小于或等于预设内存容量的情况下,基于预设内存元素容量,执行用于创建目标扩展内存池的第二操作。若确定通过第二操作成功创建所述目标扩展内存池,则确定执行第二操作的第二时刻;若确定系统时刻与第二时刻之间的时间间隔大于或等于预设时间间隔,则配置累计值为0,后续扩展内存池操作会判断累计值为0时再次切换回第一操作。以此能够实现自动切换业务模块的申请内存方式。
因此,在通过第二操作成功创建目标扩展内存池之后,在计时一段时间后,系统剩余内存可能变得较为充足,可以尝试恢复为通过第一操作创建扩展内存池。
可选地,所述目标内存元素的头信息包括内存类型标志,所述内存类型标志用于指示所述目标内存元素所属的内存为第一类型内存或第二类型内存,所述第一类型内存为默认内存池或通过所述第一操作创建的扩展内存池,所述第二类型内存为通过所述第二操作创建的扩展内存池;
在所述基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素之后,所述方法还包括:
基于所述内存类型标志,释放所述目标内存元素。
具体地,若需要释放目标内存元素,则可以先判断目标内存元素所属的内存的类型,在确定目标内存元素所属的内存为第一类型内存的情况下,可以按第一类型内存对应的释放方式,释放目标内存元素,在确定目标内存元素所属的内存为第二类型内存的情况下,可以按第二类型内存对应的释放方式,释放目标内存元素。
因此,通过内存类型标志可以记录目标内存元素所属的内存的类型,进而类型对应的释放方式来正确释放目标内存元素。
可选地,所述基于所述内存类型标志,释放所述目标内存元素,包括:
在所述内存类型标志指示所述目标内存元素所属的内存为第一类型内存的情况下,确定所述目标内存元素所属的目标内存;
基于所述目标内存元素的头信息,在所述目标内存中释放所述目标内存元素。
具体地,若需要释放目标内存元素,则可以先判断目标内存元素所属的内存的类型,在确定目标内存元素所属的内存为第一类型内存的情况下,可以确定目标内存元素所属的目标内存,进而可基于目标内存元素的头信息,在目标内存中释放目标内存元素。
可以理解的是,目标内存元素的头信息记录了内存元素的基础信息(例如内存元素对应的指针),基于头信息可以正确释目标内存元素。
因此,在内存类型标志指示目标内存元素所属的内存为第一类型内存的情况下,可以基于目标内存元素的头信息正确释放目标内存元素。
可选地,在所述基于所述目标内存元素的头信息,在所述目标内存中释放所述目标内存元素之后,所述方法还包括:
在所述目标内存为通过所述第一操作创建的扩展内存池的情况下,获取所述目标内存的使用率;
若确定所述使用率为零,则销毁所述目标内存,并将所述目标内存对应的节点从所述链表中删除。
具体地,在目标内存为通过第一操作创建的扩展内存池的情况下,可以在释放目标内存元素之后,判断目标内存的使用率是否为零,若确定使用率为零,则可以销毁目标内存,并将目标内存对应的节点从链表中删除,能够实现动态缩容业务模块的内存池。
以下为本发明的一个可选的示例,但不作为对本发明的限定。
本发明提供的内存配置方法,可以通过在系统初始化用户态进程时,为业务模块预先分配所需预设大小的cache内存;在用户态进程使用cache内存过程中根据实际使用情况,在预设分配的cache内存耗尽后实现动态扩容缩容cache内存;并在cache内存申请中根据实际情况判断系统内存不足时大小减半扩容cache或降为普通内存申请方式,不在内存不足时频繁调用扩容cache失败以减少系统性能损耗,同时可以达到动态切换分配内存方式及动态扩容缩容cache内存的有益效果,具体如下:
1、封装cache创建接口函数,主要包括:创建cache信息记录结构体,封装每个cache 元素(elem)成员的header初始化函数,封装cache创建接口函数,具体如下。
1)创建cache信息记录结构体(struct mempool_info),成员包括:字符数组(cache_name)用于记录创建cache的不同模块名称;用于记录扩展cache的索引序号(cache_index);用于记录内存不足时降级为普通申请的标志位(malloc_flag),用于释放模块做普通内存释放还是cache内存释放标志;用于记录cache扩展创建失败的次数(creat_fail_count),也即所述累计值;双向链表指针(cache_prev及cache_next)用于扩展的cache添加或删除;cache_lock用于cache链表的扩容缩容加解锁;用于记录创建cachemempool的地址的指针(cache_pstpool)。
2)封装每个cache elem成员的头部(header)初始化函数,即钩子函数(obj_init),入参分别为该内存池指针(rte_mempool)和池内每个elem header指针;该函数用于cache mempool创建完成后对其内部每个elem header进行初始化,可以借用DPDK的structrte_mempool_objhdr结构体成员mp保存其所属内存池的rte_mempool指针。
3)封装cache创建接口函数,入参分别为各模块名称、各模块申请结构体大小(也即预设内存元素容量)、各模块申请结构体总数(也即预设内存元素数量);各模块创建的内存池大小(cache size)等于各模块申请结构体大小与各模块申请结构体总数的乘积,根据不同模块的入参,调用DPDK的rte_mempool_create()函数进行cache mempool创建,相关的信息保存到cache信息记录结构体struct mempool_info中。
各业务模块声明struct mempool_info结构体全局变量,初始化时根据各业务模块自身需要调用封装的cache创建接口函数申请创建不同名称、不同cache size大小的内存池做为首个内存池(也即所述默认内存池),该池为各业务模块初始化时预分配且永不释放销毁;使用各业务模块声明的struct mempool_info结构体全局变量保存各自首个内存池信息,用于后续各业务模块首个内存池cache elem的申请或释放,并作为链表头用于该模块内存池的扩容和缩容管理。
2、封装cache申请函数,主要包括:先在首个内存池申请内存元素(cache elem),然后遍历扩展内存池申请cache elem,全都耗尽时的内存池扩展创建,内存不足时的循环减半cache扩展创建,扩展创建失败超限降级为普通申请,时间累计超时再次升级为cache扩展创建,具体如下。
1)各模块申请cache elem使用时,使用各业务模块声明的struct mempool_info结构体全局变量保存的各自首个内存池信息作为入参,也就是优先使用初始化的首个内存池cache elem优先申请,以便提高cache elem申请的性能。
2)当某个业务模块的首个内存池cache elem使用耗尽之后,根据该业务模块内存池信息全局变量保存的首个内存池信息链表指针,循环遍历后面扩展内存池进行cacheelem申请,以便减少cache elem申请失败情况。
3)若还未扩展过cache内存池或者扩展的cache内存池也使用耗尽,则触发一次cache池扩展创建,根据该业务模块内存池信息全局变量保存的该模块申请结构体大小与该模块申请结构体总数的乘积,获取到和该模块首个内存池相同的cache size创建扩展内存池(也即第一次执行所述第一操作),若扩展创建成功则将扩展的内存池信息加入该模块的链表尾部,作为下次循环遍历扩展内存池进行cache elem申请使用,并清空记录该模块cache扩展创建失次数的creat_fail_count变量值;若扩展cache创建失败说明系统剩余内存已不足,此时累加creat_fail_count值记录该模块cache扩展创建失败的次数,同时依次循环cache size/2减半cache内存大小再次尝试进行扩展创建直到成功,以便减少按固定初始化size进行cache扩展创建一直失败情况。
4)若连续循环cache size/2减半扩展创建失败的次数累加超过10次,或cachesize/2减半未到10次值已变为0(也即确定所述第二内存容量小于或等于预设内存容量),则直接将creat_fail_count设置为超限阈值10,说明系统内存已严重不足则不再尝试做cache扩展创建,直接调用DPDK内存申请接口函数rte_malloc()按该模块申请结构体大小降级为普通内存申请(也即执行所述第二操作),若成功则设置malloc_flag记录为普通申请的标志位用于释放模块做普通内存释放使用;同时记录当前第一次降级为普通内存申请的系统时间(malloc_system_time)。
5)各模块申请cache elem时判断若扩展创建失败的次数creat_fail_count累加超过超限阈值10次,则直接按该模块申请结构体大小降级为普通内存申请调用DPDK内存申请接口函数rte_malloc(),若成功则设置malloc_flag记录为普通申请的标志位用于释放模块做普通释放使用,每次判断当前系统时间和记录的第一次降级为普通内存申请的系统时间malloc_system_time差值是否大于阈值十分钟,因为此时间段内可能已经系统内存释放或cache释放销毁,若已超过十分钟则清空扩展创建失败的次数creat_fail_count值,让下次申请cache elem时再次尝试进行cache申请或创建,达到内存不足情况下动态切换分配内存方式的效果。
通过以上操作,在系统初始化用户态进程时,为业务模块(比如新建会话模块)预先分配所需预设大小的cache内存;在用户态进程使用cache内存过程中根据实际使用情况,在预设分配的cache首个内存池中优先申请提升新建性能,在首个内存池耗尽后实现动态扩容cache内存池并加入链表管理申请使用,并在cache内存扩展创建中判断系统内存不足时尝试循环减半扩容cache,直到最终成功或最终降为普通内存申请方式,不在内存不足时频繁调用扩容cache导致创建失败以减少系统性能损耗,并在计时一段时间后尝试恢复为cache申请创建,达到了动态切换分配内存方式及动态扩容cache内存的有益效果。
3、封装cache释放函数,主要包括:根据要释放cache elem内存地址(head)中保存的malloc_flag是否置位确定是普通内存释放;根据要释放cache elem内存地址head中mp成员保存的其所属内存池的rte_mempool指针确认是不是要释放到首个内存池;非首个内存池的cache elem释放则循环遍历链表确认其所属扩展内存池并进行释放;释放后对扩展内存池使用率为零的则进行cache销毁做大内存释放操作,具体如下。
1)封装cache释放函数,函数入参为各业务模块声明的struct mempool_info结构体全局变量保存的各自首个内存池信息指针及要释放的cache elem指针作为入参,优先判断要释放cache elem内存地址head中保存的malloc_flag置位情况,若置位则判定是普通内存释放并调用DPDK内存释放函数rte_free()释放内存。
2)若malloc_flag未置位,说明是cache elem释放,则根据要释放cache elem内存地址head中mp成员保存的其所属内存池的rte_mempool指针判断是否等于首个内存池的mp指针,确认是不是要释放到首个内存池,若是则释放到首个内存池中;各模块首个内存池为系统初始化时分配,一直占用不销毁。
3)判断非首个内存池的cache elem释放则循环遍历链表确认其所属的扩展内存池并进行释放;释放后对扩展内存池使用率为零的则进行cache销毁做大内存释放操作,并对链表进行摘链操作。
通过以上操作,对要释放的cache elem头信息判定申请方式,是普通内存申请的则进行普通内存方式释放,是cache内存申请的则区分释放到对应首个内存池或扩展内存池,对闲置无用的扩展池还要进行销毁操作,如此保证了cache elem内存的正确释放和弹性缩容;
本发明提供的内存配置方法,通过基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,若确定未成功申请目标内存元素,则表示业务模块的内存池内存元素全都被耗尽,进而可以为业务模块创建目标扩展内存池并将目标扩展内存池作为新增节点添加到链表的尾部,进而可以再次基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,进而可以在目标扩展内存池中成功申请目标内存元素,能够实现动态扩容业务模块的内存池。
下面对本发明提供的内存配置装置进行描述,下文描述的内存配置装置与上文描述的内存配置方法可相互对应参照。
图2是本发明提供的内存配置装置的结构示意图,如图2所示,所述装置包括:申请模块201和创建模块202,其中:
申请模块201,用于基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素;
创建模块202,用于若确定未成功申请所述目标内存元素,则为所述业务模块创建目标扩展内存池,以及将所述目标扩展内存池作为新增节点添加到所述链表的尾部;
所述链表的头节点对应所述业务模块的默认内存池,所述链表中除头节点以外的节点对应所述业务模块的扩展内存池;所述默认内存池是在初始化用户态进程的情况下,为所述业务模块创建的。
本发明提供的内存配置装置,通过基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,若确定未成功申请目标内存元素,则表示业务模块的内存池内存元素全都被耗尽,进而可以为业务模块创建目标扩展内存池并将目标扩展内存池作为新增节点添加到链表的尾部,进而可以再次基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素,进而可以在目标扩展内存池中成功申请目标内存元素,能够实现动态扩容业务模块的内存池。
图3是本发明提供的电子设备的结构示意图,如图3所示,该电子设备可以包括:处理器(processor)310、通信接口(Communications Interface)320、存储器(memory)330和通信总线340,其中,处理器310,通信接口320,存储器330通过通信总线340完成相互间的通信。处理器310可以调用存储器330中的逻辑指令,以执行内存配置方法,例如该方法包括:
基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素;
若确定未成功申请所述目标内存元素,则为所述业务模块创建目标扩展内存池,以及将所述目标扩展内存池作为新增节点添加到所述链表的尾部;
所述链表的头节点对应所述业务模块的默认内存池,所述链表中除头节点以外的节点对应所述业务模块的扩展内存池;所述默认内存池是在初始化用户态进程的情况下,为所述业务模块创建的。
此外,上述的存储器330中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法提供的内存配置方法,例如该方法包括:
基于链表指示的内存申请顺序,在业务模块的内存池中申请目标内存元素;
若确定未成功申请所述目标内存元素,则为所述业务模块创建目标扩展内存池,以及将所述目标扩展内存池作为新增节点添加到所述链表的尾部;
所述链表的头节点对应所述业务模块的默认内存池,所述链表中除头节点以外的节点对应所述业务模块的扩展内存池;所述默认内存池是在初始化用户态进程的情况下,为所述业务模块创建的。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
本文发布于:2023-04-14 05:00:26,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/3/86430.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |