CN117032995A - 内存池管理方法、装置、计算机设备和存储介质 - Google Patents
内存池管理方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN117032995A CN117032995A CN202311289321.3A CN202311289321A CN117032995A CN 117032995 A CN117032995 A CN 117032995A CN 202311289321 A CN202311289321 A CN 202311289321A CN 117032995 A CN117032995 A CN 117032995A
- Authority
- CN
- China
- Prior art keywords
- node
- memory
- linked list
- memory block
- available
- 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.)
- Pending
Links
- 238000007726 management method Methods 0.000 title claims abstract description 46
- 238000000034 method Methods 0.000 claims abstract description 45
- 230000004044 response Effects 0.000 claims abstract description 44
- 238000001514 detection method Methods 0.000 claims description 15
- 238000004590 computer program Methods 0.000 claims description 14
- 238000004064 recycling Methods 0.000 claims description 4
- 238000010586 diagram Methods 0.000 description 11
- 238000011084 recovery Methods 0.000 description 3
- 230000001360 synchronised effect Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000013467 fragmentation Methods 0.000 description 1
- 238000006062 fragmentation reaction Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
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
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请涉及一种内存池管理方法、装置、计算机设备和存储介质。所述方法包括:创建链表,链表中的节点是内存池中的可用块,可用块是指未使用的内存块;响应于接收到任一内存分配指令,将当前链表的前x个节点对应的可用块进行分配,并将链表中的原第x+1个节点设置为新的首节点;x表示需要分配的内存块数量;响应于接收到任一内存释放指令,将已释放的内存块添加到链表中作为链表的新的首节点,以及将该新的首节点的下一节点设置为链表的旧的首节点。本申请实施例不使用循环管理或递归管理,通过提高内存池管理效率来提高内存分配速度,从而能满足特定场景的实时性要求。
Description
技术领域
本申请涉及内存管理技术领域,特别是涉及一种内存池管理方法、装置、计算机设备和存储介质。
背景技术
在相关的通用内存池管理方式中,会使用如图1所示的方式来对内存池段进行初始化,由于该方式需要遍历内存池,因而会产生一定的时间消耗。而一些场景(例如对自动驾驶的视觉数据进行处理的场景)对于内存分配的实时性要求很高,因此相关的通用内存池管理方式无法满足该要求。
发明内容
本申请针对上述不足或缺点,提供了一种内存池管理方法、装置、计算机设备和存储介质,本申请实施例不使用循环管理或递归管理,通过提高内存池管理效率来提高内存分配速度,从而能满足特定场景的实时性要求。
本申请根据第一方面提供了一种内存池管理方法,在一些实施例中,该方法包括:
创建链表,链表中的节点是内存池中的可用块,可用块是指未使用的内存块;
响应于接收到任一内存分配指令,将当前链表的前x个节点对应的可用块进行分配,并将链表中的原第x+1个节点设置为新的首节点;x表示需要分配的内存块数量;
响应于接收到任一内存释放指令,将已释放的内存块添加到链表中作为链表的新的首节点,以及将该新的首节点的下一节点设置为链表的旧的首节点。
在一些实施例中,创建链表之前,上述方法还包括:
建立内存池;
获取内存池的起始地址和结束地址;
根据内存池的起始地址和结束地址、预设地址长度划分内存池对应的连续内存地址,得到多个容量相同的内存块。
在一些实施例中,将当前链表的前x个节点对应的可用块进行分配,包括:
获取当前链表的表头信息,根据表头信息确定链表的首节点;
从该首节点开始进行分配,直至已分配内存块的数量等于x;其中,在将链表的任一节点对应的可用块分配之后,响应于已分配内存块的数量小于x,确定该节点的下一节点,并将该下一节点对应的可用块进行分配。
在一些实施例中,在分配链表的任一节点对应的可用块时,检测该节点对应的可用块是否已初始化;
响应于该节点对应的可用块已初始化,将该节点对应的可用块进行分配;
响应于该节点对应的可用块未初始化,对该节点对应的可用块进行初始化,在完成初始化之后将该节点对应的可用块进行分配。
在一些实施例中,确定任一节点的下一节点,包括:
响应于该任一节点对应的内存块在分配时已初始化,从该任一节点对应的内存块的特定区域中获取节点链接信息,根据节点链接信息确定该任一节点的下一节点;
响应于该任一节点对应的内存块在分配时未初始化,根据该任一节点对应的内存块地址确定该任一节点的下一节点。
在一些实施例中,节点链接信息包括内存块地址;
根据节点链接信息确定该任一节点的下一节点,包括:
将节点链接信息包括的内存块地址对应的内存块确定为该任一节点的下一节点。
在一些实施例中,根据该任一节点对应的内存块地址确定该任一节点的下一节点,包括:
将该任一节点对应的内存块地址和预设地址长度相加得到的地址对应的内存块确定为该任一节点的下一节点。
在一些实施例中,将链表中的原第x+1个节点设置为新的首节点,包括:
将原第x+1个节点对应的可用块的地址设置为链表的表头信息。
在一些实施例中,将释放的内存块添加到链表中作为链表的新的首节点,包括:
将释放的内存块的地址设置为链表的表头信息。
在一些实施例中,将该新的首节点的下一节点设置为链表的旧的首节点,包括:
将链表的旧的首节点的地址存储到该新的首节点对应的可用块中的特定区域。
在一些实施例中,将链表的旧的首节点的地址存储到该新的首节点对应的可用块中的特定区域,包括:
将链表的旧的首节点的地址存储到该新的首节点对应的可用块中开头的多个字节中。
在一些实施例中,将已释放的内存块添加到链表中作为链表的新的首节点之前,上述方法还包括:
检测目标内存块是否成功释放;目标内存块是指内存释放指令相关的内存块;
响应于目标内存块已成功释放,将目标内存块确定为已释放的内存块。
在一些实施例中,上述方法还包括:
响应于目标内存块未成功释放,不将目标内存块确定为已释放的内存块。
在一些实施例中,检测目标内存块是否成功释放,包括:
检测目标内存块的内存地址是否有效;
若检测结果为有效,判定目标内存块已成功释放;
若检测结果为无效,判定目标内存块未成功释放。
在一些实施例中,内存池中的各个内存块在上电后,均为未初始化状态。
在一些实施例中,响应于该节点对应的可用块未初始化,对该节点对应的可用块进行初始化之后,上述方法还包括:
检测该节点对应的可用块是否已初始化;
响应于检测结果为否,将该节点从链表中删除。
在一些实施例中,将当前链表的前x个节点对应的可用块进行分配之前,方法还包括:
获取内存分配指令指定的内存容量;
根据内存容量确定x的取值。
本申请根据第二方面提供了一种内存池管理装置,在一些实施例中,该装置包括:
创建模块,用于创建链表,链表中的节点是内存池中的可用块,可用块是指未使用的内存块;
内存分配模块,用于响应于接收到任一内存分配指令,将当前链表的前x个节点对应的可用块进行分配,并将链表中的原第x+1个节点设置为新的首节点;x表示需要分配的内存块数量;
内存回收模块,用于响应于接收到任一内存释放指令,将已释放的内存块添加到链表中作为链表的新的首节点,以及将该新的首节点的下一节点设置为链表的旧的首节点。
本申请根据第三方面提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述任一实施例中提供的内存池管理方法的步骤。
本申请根据第四方面提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述任一实施例中提供的内存池管理方法的步骤。
在本申请的上述实施例中,当内存池建立之后,即创建链表来追踪内存池中的可用块,进而在每次内存分配时,可以通过链表快速确定出可用块并进行分配,而在完成分配后,需相应对链表中的首节点进行更新,以便进行新的内存分配操作或内存回收操作;而在每次内存回收时,通过将已释放的内存块添加到链表中作为链表的新的首节点,以及将该新的首节点的下一节点设置为链表的旧的首节点,可以实现重复使用已初始化的内存块的目的,进一步缩短内存分配耗时。本申请实施例不使用循环管理或递归管理,通过提高内存池管理效率来提高内存分配速度,从而能满足特定场景的实时性要求。
附图说明
图1为相关的通用内存池管理方式对内存池段进行初始化的示意图;
图2为本申请根据一个或多个实施例提供的一种内存池管理方法的流程示意图;
图3为本申请根据一个或多个实施例提供的分配链表中前x个节点对应的可用块的流程示意图;
图4-1为本申请一些示例中提供的第一种内存块状态示意图;
图4-2为本申请一些示例中提供的第二种内存块状态示意图;
图4-3为本申请一些示例中提供的第三种内存块状态示意图;
图4-4为本申请一些示例中提供的第四种内存块状态示意图;
图4-5为本申请一些示例中提供的第五种内存块状态示意图;
图4-6为本申请一些示例中提供的第六种内存块状态示意图;
图5为本申请根据一个或多个实施例提供的一种内存池管理装置的结构框图;
图6为本申请根据一个或多个实施例提供的计算机设备的内部结构图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施例方式作进一步地详细描述。应当明确,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请的描述中,需要理解的是,术语“第一”、“第二”、“第三”等仅用于区别类似的对象,而不必用于描述特定的顺序或先后次序,也不能理解为指示或暗示相对重要性。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本申请中的具体含义。此外,在本申请的描述中,除非另有说明,“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
针对相关技术的不足或缺陷,本申请提供了一种内存池管理方法,该方法的执行主体可以是CPU(中央处理器),也可以是内存管理单元。
在一些实施例中,该方法包括如图2所示的步骤,即步骤S110至S130,下面对各个步骤进行详细说明。
S110:创建链表,链表中的节点是内存池中的可用块,可用块是指未使用的内存块。
上述的链表是指单向链表,单向链表是一种数据结构,它可以包括一个或多个节点,节点之间的连接是单向的,即访问该链表中的节点时,访问的顺序只能是从链表中的第一个节点(可称为首节点)开始依次到最后一个节点(可称为尾节点)。链表中的节点均是需要管理的内存池中的可用块。其中,可用块是指该内存池中未使用的内存块,未使用的内存块即是未分配给应用程序的内存块。
在本实施例中,该链表用于追踪内存池中的可用块。通常,在建立内存池之后,即可创建链表。在一些实施例中,创建链表之前,上述方法还包括:建立内存池;获取内存池的起始地址和结束地址;根据内存池的起始地址和结束地址、预设地址长度划分内存池对应的连续内存地址,得到多个容量相同的内存块。
内存池中的各个内存块的容量相同,内存块的容量可以通过将内存块的结束地址减去起始地址来得到。内存块的容量也等于该预设地址长度,具体地,内存块的容量是通过该预设地址长度来确定的,其可根据实际需求来设定,本实施例不对其做特别限制。
以下通过一个示例来对上述划分的操作进行说明。例如,假设内存池的起始地址和结束地址分别是11和20,而预设地址长度是2,则可以划分 得到5个内存块,各内存块对应的地址范围分别是:11-12,13-14,15-16,17-18,19-20。
本实施例将内存池划分为容量相同的多个内存块,由于内存块的地址是线形连续的,因而可以采用顺序管理的方式来对内存池中的内存块进行管理,该方式在实际应用时,可以不管应用程序的具体需求(指应用程序要申请的内存大小,不同应用程序要申请的内存大小会随时变换),因而相比循环管理或递归管理的方式,逻辑更为简单,更易于实现。
优选地,考虑到内存块在分配出去后,有可能因为出现故障而无法收回,这样就会产生内存碎片,为了减少内存碎片,在设置该预设地址长度时,其取值应尽可能小。例如,假设应用程序请求的内存容量是5,如果内存块的容量为5,那么可以向该应用程序分配一个内存块,假如该内存块在分配后,有部分地址出现故障,由于难以确定故障的是哪个或哪些地址,因此会将该内存块整体认为有问题而不会将其回收,而如果将内存块的容量设为1,如果向该应用程序分配了5个内存块,即使有部分内存块被认为有问题,也还能回收其他不被认为有问题的内存块。
S120:响应于接收到任一内存分配指令,将当前链表的前x个节点对应的可用块进行分配,并将链表中的原第x+1个节点设置为新的首节点;x表示需要分配的内存块数量。
在一些实施例中,将当前链表的前x个节点对应的可用块进行分配之前,上述方法还包括:获取内存分配指令指定的内存容量;根据内存容量确定x的取值。
应用程序需要使用内存时,例如有数据需要存储时,可以通过下发内存分配指令来申请内存。内存分配指令需要指定所申请的内存的容量,从而可以通过该容量来确定需要分配的内存块数量。例如,假设每个内存块的容量是3,而该内存分配指令指定的容量是10,那么确定需要分配4个内存块,而如果该内存分配指令指定的容量是9,那么确定需要分配3个内存块。即,如果内存分配指令指定的容量能对内存块容量整除,那么需要分配的内存块数量x是两者的商,如果内存分配指令指定的容量不能对内存块容量整除,那么需要分配的内存块数量x是两者的商+1。
在确定出x之后,可以判断内存池的可用块总数是否大于等于x,如果是,再执行将当前链表的前x个节点对应的可用块进行分配的操作。其中,内存池中的可用块都是链表中的节点,因此该可用块总数即是链表的节点数量。而由于链表中的节点的数量需要对链表进行遍历才能确定,为了提高内存分配速度,可以初始化一个变量来记录该可用块总数,相应地,在每次分配或回收内存块之后,需要相应更新该变量的值。可理解的,由于只设置了一个变量,因此需要消耗的存储空间是很小的。
在一些实施例中,如图3所示,将当前链表的前x个节点对应的可用块进行分配,包括:
S121:获取当前链表的表头信息,根据表头信息确定链表的首节点;
S122:从该首节点开始进行分配,直至已分配内存块的数量等于x;其中,在将链表的任一节点对应的可用块分配之后,响应于已分配内存块的数量小于x,确定该节点的下一节点,并将该下一节点对应的可用块进行分配。
其中,链表的表头信息用于确定链表中的首节点,其具体可以是内存块地址。该内存块地址可以是指内存块的起始地址。在获得链表的表头信息之后,该表头信息所指向的内存块即是链表的首节点。
在确定出链表的首节点之后,即可开始相应的内存分配操作。即,从首节点开始依次进行分配,每分配完一个内存块,就检测已分配内存块的数量是否等于x,如果不是,那么就继续确定出下一节点并进行分配,以此类推,直至已分配内存块的数量等于x,此时表明应用程序的内存需求已得到满足。
在一些实施例中,为了进一步减少初始化的时间成本,内存池中的各个内存块在上电后,均为未初始化状态。只有在分配内存块时,才对内存块进行初始化。
相应地,在分配链表的任一节点对应的可用块时,可以执行以下操作:
检测该节点对应的可用块是否已初始化;
响应于该节点对应的可用块已初始化,将该节点对应的可用块进行分配;
响应于该节点对应的可用块未初始化,对该节点对应的可用块进行初始化,在完成初始化之后将该节点对应的可用块进行分配。
即需要先检测节点对应的可用块是否已初始化,如果节点对应的可用块已初始化,那么可以直接进行分配,而如果节点对应的可用块还处于未初始化状态,那么就需要先对其进行初始化,完成初始化之后,再将其进行分配。其中,对内存块进行初始化时,可以选用成熟可靠的初始化手段,由于对内存块进行初始化的操作不在本申请的改进范围内,因而不对其进行过多介绍。
此外,响应于该节点对应的可用块未初始化,对该节点对应的可用块进行初始化之后,上述方法还包括:检测该节点对应的可用块是否已初始化;响应于检测结果为否,将该节点从链表中删除。
即,对内存块进行初始化时,有可能因为内存块存在故障而无法成功初始化,为了避免因为内存故障而影响内存管理效率,在对可用块进行初始化后,如果检测到节点对应的可用块无法初始化,那么就将其从链表中删除,相应地,将其删除后,需要将该节点的下一节点与该节点的上一节点链接起来,例如可以确定下一节点对应的内存块地址,将该内存块地址存储在该上一节点对应的内存块的特定区域,例如该内存块开头的4个字节中。由于本实施例中的内存分配操作和内存回收操作均是依靠链表来实现的,因此当该可用块从链表中删除之后,该可用块就不再参与到内存管理中,可理解地,在下次访问链表时,可以跳过该节点对应的内存块,而不需要再次对其进行初始化操作。
在一些实施例中,上述的确定任一节点的下一节点,包括:
响应于该任一节点对应的内存块在分配时已初始化,从该任一节点对应的内存块的特定区域中获取节点链接信息,根据节点链接信息确定该任一节点的下一节点;
响应于该任一节点对应的内存块在分配时未初始化,根据该任一节点对应的内存块地址确定该任一节点的下一节点。
相应地,上述的节点链接信息包括内存块地址。此时,根据节点链接信息确定该任一节点的下一节点时,可以将节点链接信息包括的内存块地址对应的内存块确定为该任一节点的下一节点。
而根据该任一节点对应的内存块地址确定该任一节点的下一节点时,可以将该任一节点对应的内存块地址和预设地址长度相加得到的地址对应的内存块确定为该任一节点的下一节点。
为了缩减因管理内存池而消耗的存储空间,本实施例只使用很小的存储空间来存储链表的表头信息,而不存储各节点间的链接信息。
具体地,在所有可用块均处于未初始化状态时,此时只存储链表的表头信息,无需消耗任何存储空间来存储各节点间的链接信息。
在所有可用块均处于已初始化状态时,只需要利用一点额外空间来存储链表的表头信息,而各节点的链接信息则存于相应节点对应的内存块中。例如,假设可用块一共为5块,即A/B/C/D/E,首节点是A,那么只需要通过额外空间来存储链表的表头信息(即A的地址),而B和C间的链接信息存于B中、C和D间的链接信息存于C中、D和E间的链接信息则存于D中。
在部分可用块处于已初始化状态,而其余部分可用块处于未初始化状态时,仍然是利用一点额外空间来存储链表的表头信息,而对于各节点间的链接信息,只由已初始化的可用块来存储下一节点的链接信息,而未初始化的可用块无需存储下一节点的链接信息。例如,假设可用块仍为A/B/C/D/E,首节点是A,其中,A和B均已初始化,而C、D、E均为初始化,那么A和B间的链接信息存于A中,B和C间的链接信息存于B中,而C和D间的链接信息、D和E间的链接信息无需存储。在分配完C之后,可以通过C的地址和内存块容量来确定D,同理,在分配完D之后,可以通过D的地址和内存块容量来确定E。
相应地,将链表中的原第x+1个节点设置为新的首节点,是指将原第x+1个节点对应的可用块的地址设置为链表的表头信息。
S130:响应于接收到任一内存释放指令,将已释放的内存块添加到链表中作为链表的新的首节点,以及将该新的首节点的下一节点设置为链表的旧的首节点。
应用程序不需要使用内存时,可以通过下发内存释放指令来请求回收内存。上述的已释放的内存块是指成功释放的内存块。已释放的内存块会被作为可用块添加到链表中作为首节点,而原来的首节点则会变成该已释放的内存块的下一节点。
其中,将释放的内存块添加到链表中作为链表的新的首节点时,可以是将释放的内存块的地址设置为链表的表头信息。
相应地,将该新的首节点的下一节点设置为链表的旧的首节点时,可以将链表的旧的首节点的地址存储到该新的首节点对应的可用块中的特定区域。具体地,将链表的旧的首节点的地址存储到该新的首节点对应的可用块中的特定区域,可以是将链表的旧的首节点的地址存储到该新的首节点对应的可用块中开头的多个字节中。该特定区域所包含的字节数量可根据实际需要来设定,例如设置为4个字节,本实施例不进行特别限制。
在本实施例中,由于分配出去的可用块都已经过初始化,因而,将每个释放回来的内存块设置为链表的首节点,就能确保链表中的已初始化的可用块必然会在未初始化的可用块之前,这样在分配内存块时,就会优先分配已初始化的内存块,从而达到重复利用已初始化的内存块的目的。
在本申请的上述实施例中,当内存池建立之后,即创建链表来追踪内存池中的可用块,进而在每次内存分配时,可以通过链表快速确定出可用块并进行分配,而在完成分配后,需相应对链表中的首节点进行更新,以便进行新的内存分配操作或内存回收操作;而在每次内存分配时均从链表中的首节点开始依次往下分配各个可用块的基础上,本实施例在每次内存回收时,通过将已释放的内存块添加到链表中作为链表的新的首节点,以及将该新的首节点的下一节点设置为链表的旧的首节点,可以使回收的已初始化可用块在链表中的顺序一直保持在未初始化可用块的前面,进而在进行内存分配时就能优先分配已初始化的可用块,达到重复使用已初始化的可用块,减少需要使用未初始化的可用块的频率的目的,从而提高内存分配速度,进一步缩短内存分配耗时。本申请实施例不使用循环管理或递归管理,通过提高内存池管理效率来提高内存分配速度,从而能满足特定场景的实时性要求。
在一些实施例中,将已释放的内存块添加到链表中作为链表的新的首节点之前,上述方法还包括:
检测目标内存块是否成功释放;目标内存块是指内存释放指令相关的内存块;
响应于目标内存块已成功释放,将目标内存块确定为已释放的内存块。
本实施例可以避免将未成功释放的内存块作为可用块加入链表中,由于未成功释放的内存块不会加入链表,因而不需要参与内存池的管理中,因而在进行内存分配时,就不会因为需要分配的内存块存在故障而影响到分配速度。在前述实施例中,可以将未成功初始化的内存块从链表中删除,本实施例可以与该前述实施例配合使用,即在将未成功初始化的内存块从链表中删除的基础上,避免将未成功释放的内存块加入链表中,以此进一步确保链表的内存块都是可使用的,从而能够更顺利地进行内存分配,保证内存分配速度。
具体地,在释放内存块时,有可能因为内存块存在故障而无法成功释放(例如因死锁等原因导致无法释放),为了避免因为内存故障而影响内存管理效率,在收到内存释放指令时,可以先确定内存释放指令相关的内存块,即目标内存块,然后检测其是否成功释放。在一些实施方式中,检测目标内存块是否成功释放时,可以检测目标内存块的内存地址是否有效;若检测结果为有效,判定目标内存块已成功释放;若检测结果为无效,判定目标内存块未成功释放。其中,检测内存地址是否有效的操作可以选用成熟可靠的有效性检测手段来实现。
假如检测后确定目标内存块已成功释放,那么就可以将其作为可用块添加到链表中。如果检测后确定目标内存块未成功释放,则可以响应于目标内存块未成功释放,不将目标内存块确定为已释放的内存块,进而目标内存块就不会被添加到链表中,从而在分配内存块时,就会跳过该内存块,即该内存块就不再参与到内存管理中。
上述实施例所提供的内存池管理方法可以应用在对内存分配时间极为敏感的任何场景中,例如多视频任务上云场景、对自动驾驶的视觉数据进行处理的场景等等。
为了更好理解该内存池管理方法,本申请还提供了以下示例。
1、建立内存池,按照固定大小将内存池分为多个内存块(block),请参见图4-1,该内存池中的内存块数量为6块,分别对应于编号0-5,在未使用时,所有内存块均不进行初始化,同时维护链表的表头信息指向第0块内存块,可用块数量为6个。此时各节点的顺序是0>1>2>3>4>5。
2、请参见图4-2,假设有应用程序申请1块内存块,则根据表头信息确定首节点,即编号为0的内存块,接着对其进行初始化,初始化之后将其进行分配。最后将表头信息更新为编号为1的内存块,以及维护可用块数量为5。此时各节点的顺序是1>2>3>4>5。
3、请参见图4-3,假设有应用程序申请1块内存块,则根据表头信息确定首节点,即编号为1的内存块,接着对其进行初始化,初始化之后将其进行分配。最后将表头信息更新为编号为2的内存块,以及维护可用块数量为4。此时各节点的顺序是2>3>4>5。
4、请参见图4-4,假设有应用程序申请1块内存块,则根据表头信息确定首节点,即编号为2的内存块,接着对其进行初始化,初始化之后将其进行分配。最后将表头信息更新为编号为3的内存块,以及维护可用块数量为3。此时各节点的顺序是3>4>5。
5、请参见图4-5,假设有1块内存块释放了,即编号为0的内存块,则将表头信息更新为编号为0的内存块,同时将原来的首节点,即编号为3的内存块的地址存于编号为0的内存块中,维护可用块数量为4。此时各节点的顺序是0>3>4>5。
6、请参见图4-6,假设又有1块内存块释放了,即编号为2的内存块,则将表头信息更新为编号为2的内存块,同时将原来的首节点,即编号为0的内存块的地址存于编号为2的内存块中,维护可用块数量为5。此时各节点的顺序是2>0>3>4>5。
需要说明的是,关于上述任何一个实施例中提供的内存池管理方法所包括的各个步骤,除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,这些步骤中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
基于相同的发明构思,本申请还提供了一种内存池管理装置。在一些实施例中,如图5所示,该内存池管理装置包括以下模块:
创建模块110,用于创建链表,链表中的节点是内存池中的可用块,可用块是指未使用的内存块;
内存分配模块120,用于响应于接收到任一内存分配指令,将当前链表的前x个节点对应的可用块进行分配,并将链表中的原第x+1个节点设置为新的首节点;x表示需要分配的内存块数量;
内存回收模块130,用于响应于接收到任一内存释放指令,将已释放的内存块添加到链表中作为链表的新的首节点,以及将该新的首节点的下一节点设置为链表的旧的首节点。
在一些实施例中,上述装置还包括:
内存池建立模块,用于建立内存池;
划分模块,用于获取内存池的起始地址和结束地址;以及根据内存池的起始地址和结束地址、预设地址长度划分内存池对应的连续内存地址,得到多个容量相同的内存块。
在一些实施例中,内存分配模块120,包括:
首节点确定子模块,用于获取当前链表的表头信息,根据表头信息确定链表的首节点;
分配子模块,用于从该首节点开始进行分配,直至已分配内存块的数量等于x;其中,在将链表的任一节点对应的可用块分配之后,响应于已分配内存块的数量小于x,确定该节点的下一节点,并将该下一节点对应的可用块进行分配。
在一些实施例中,内存分配模块120还用于:
在分配链表的任一节点对应的可用块时,检测该节点对应的可用块是否已初始化;
响应于该节点对应的可用块已初始化,将该节点对应的可用块进行分配;
响应于该节点对应的可用块未初始化,对该节点对应的可用块进行初始化,在完成初始化之后将该节点对应的可用块进行分配。
在一些实施例中,分配子模块确定任一节点的下一节点时,用于:
响应于该任一节点对应的内存块在分配时已初始化,从该任一节点对应的内存块的特定区域中获取节点链接信息,根据节点链接信息确定该任一节点的下一节点;
响应于该任一节点对应的内存块在分配时未初始化,根据该任一节点对应的内存块地址确定该任一节点的下一节点。
在一些实施例中,节点链接信息包括内存块地址;相应地,分配子模块根据节点链接信息确定该任一节点的下一节点时,用于:将节点链接信息包括的内存块地址对应的内存块确定为该任一节点的下一节点。
在另一些实施例中,分配子模块根据该任一节点对应的内存块地址确定该任一节点的下一节点时,用于:将该任一节点对应的内存块地址和预设地址长度相加得到的地址对应的内存块确定为该任一节点的下一节点。
在一些实施例中,内存分配模块120将链表中的原第x+1个节点设置为新的首节点时,用于:将原第x+1个节点对应的可用块的地址设置为链表的表头信息。
在一些实施例中,内存回收模块130将释放的内存块添加到链表中作为链表的新的首节点时,用于:将释放的内存块的地址设置为链表的表头信息。
在一些实施例中,内存回收模块130将该新的首节点的下一节点设置为链表的旧的首节点时,用于:将链表的旧的首节点的地址存储到该新的首节点对应的可用块中的特定区域。
在一些实施例中,内存回收模块130将链表的旧的首节点的地址存储到该新的首节点对应的可用块中的特定区域时,用于:将链表的旧的首节点的地址存储到该新的首节点对应的可用块中开头的多个字节中。
在一些实施例中,内存回收模块130将已释放的内存块添加到链表中作为链表的新的首节点之前,还用于:
检测目标内存块是否成功释放;目标内存块是指内存释放指令相关的内存块;
响应于目标内存块已成功释放,将目标内存块确定为已释放的内存块。
在一些实施例中,内存回收模块130还用于:响应于目标内存块未成功释放,不将目标内存块确定为已释放的内存块。
在一些实施例中,内存回收模块130检测目标内存块是否成功释放时,用于:
检测目标内存块的内存地址是否有效;
若检测结果为有效,判定目标内存块已成功释放;
若检测结果为无效,判定目标内存块未成功释放。
在一些实施例中,内存池中的各个内存块在上电后,均为未初始化状态。
在一些实施例中,响应于该节点对应的可用块未初始化,对该节点对应的可用块进行初始化之后,内存分配模块120还用于:
检测该节点对应的可用块是否已初始化;
响应于检测结果为否,将该节点从链表中删除。
在一些实施例中,内存分配模块120还用于:在将当前链表的前x个节点对应的可用块进行分配之前,获取内存分配指令指定的内存容量,根据内存容量确定x的取值。
关于内存池管理装置的具体限定可以参见上文中对于内存池管理方法的限定,在此不再赘述。上述内存池管理装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
本申请在一些实施例中提供了一种计算机设备,其内部结构图可以如图6所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于链表的表头信息、可用块数量等数据,具体存储的数据还可以参见上述方法实施例中的限定。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种内存池管理方法。
本领域技术人员可以理解,图6中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
本实施例还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时可以实现上述任一实施例中提供的内存池管理方法的步骤。
本申请在一些实施例中还提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述任一实施例中提供的内存池管理方法的步骤。
在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
本领域普通技术人员可以理解实现上述方法实施例中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)、 DRAM(SLDRAM)、存储器总线(Rambus)、直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (20)
1.一种内存池管理方法,其特征在于,所述方法包括:
创建链表,所述链表中的节点是所述内存池中的可用块,所述可用块是指未使用的内存块;
响应于接收到任一内存分配指令,将当前所述链表的前x个节点对应的可用块进行分配,并将所述链表中的原第x+1个节点设置为新的首节点;所述x表示需要分配的内存块数量;
响应于接收到任一内存释放指令,将已释放的内存块添加到所述链表中作为所述链表的新的首节点,以及将该新的首节点的下一节点设置为所述链表的旧的首节点。
2.如权利要求1所述的方法,其特征在于,所述创建链表之前,所述方法还包括:
建立所述内存池;
获取所述内存池的起始地址和结束地址;
根据所述内存池的起始地址和结束地址、预设地址长度划分所述内存池对应的连续内存地址,得到多个容量相同的内存块。
3.如权利要求1所述的方法,其特征在于,将当前所述链表的前x个节点对应的可用块进行分配,包括:
获取当前所述链表的表头信息,根据所述表头信息确定所述链表的首节点;
从该首节点开始进行分配,直至已分配内存块的数量等于所述x;其中,在将所述链表的任一节点对应的可用块分配之后,响应于所述已分配内存块的数量小于所述x,确定该节点的下一节点,并将该下一节点对应的可用块进行分配。
4.如权利要求3所述的方法,其特征在于,在分配所述链表的任一节点对应的可用块时,检测该节点对应的可用块是否已初始化;
响应于该节点对应的可用块已初始化,将该节点对应的可用块进行分配;
响应于该节点对应的可用块未初始化,对该节点对应的可用块进行初始化,在完成初始化之后将该节点对应的可用块进行分配。
5.如权利要求3所述的方法,其特征在于,确定任一节点的下一节点,包括:
响应于该任一节点对应的内存块在分配时已初始化,从该任一节点对应的内存块的特定区域中获取节点链接信息,根据所述节点链接信息确定该任一节点的下一节点;
响应于该任一节点对应的内存块在分配时未初始化,根据该任一节点对应的内存块地址确定该任一节点的下一节点。
6.如权利要求5所述的方法,其特征在于,所述节点链接信息包括内存块地址;
根据所述节点链接信息确定该任一节点的下一节点,包括:
将所述节点链接信息包括的内存块地址对应的内存块确定为该任一节点的下一节点。
7.如权利要求5所述的方法,其特征在于,根据该任一节点对应的内存块地址确定该任一节点的下一节点,包括:
将该任一节点对应的内存块地址和预设地址长度相加得到的地址对应的内存块确定为该任一节点的下一节点。
8.如权利要求1所述的方法,其特征在于,将所述链表中的原第x+1个节点设置为新的首节点,包括:
将所述原第x+1个节点对应的可用块的地址设置为所述链表的表头信息。
9.如权利要求1所述的方法,其特征在于,将释放的内存块添加到所述链表中作为所述链表的新的首节点,包括:
将释放的内存块的地址设置为所述链表的表头信息。
10.如权利要求1所述的方法,其特征在于,将该新的首节点的下一节点设置为所述链表的旧的首节点,包括:
将所述链表的旧的首节点的地址存储到该新的首节点对应的可用块中的特定区域。
11.如权利要求10所述的方法,其特征在于,将所述链表的旧的首节点的地址存储到该新的首节点对应的可用块中的特定区域,包括:
将所述链表的旧的首节点的地址存储到该新的首节点对应的可用块中开头的多个字节中。
12.如权利要求1所述的方法,其特征在于,将已释放的内存块添加到所述链表中作为所述链表的新的首节点之前,所述方法还包括:
检测目标内存块是否成功释放;所述目标内存块是指所述内存释放指令相关的内存块;
响应于所述目标内存块已成功释放,将所述目标内存块确定为已释放的内存块。
13.如权利要求12所述的方法,其特征在于,所述方法还包括:
响应于所述目标内存块未成功释放,不将所述目标内存块确定为已释放的内存块。
14.如权利要求12所述的方法,其特征在于,检测目标内存块是否成功释放,包括:
检测所述目标内存块的内存地址是否有效;
若检测结果为有效,判定所述目标内存块已成功释放;
若检测结果为无效,判定所述目标内存块未成功释放。
15.如权利要求2所述的方法,其特征在于,所述内存池中的各个内存块在上电后,均为未初始化状态。
16.如权利要求4所述的方法,其特征在于,响应于该节点对应的可用块未初始化,对该节点对应的可用块进行初始化之后,所述方法还包括:
检测该节点对应的可用块是否已初始化;
响应于检测结果为否,将该节点从所述链表中删除。
17.如权利要求1所述的方法,其特征在于,将当前所述链表的前x个节点对应的可用块进行分配之前,所述方法还包括:
获取所述内存分配指令指定的内存容量;
根据所述内存容量确定所述x的取值。
18.一种内存池管理装置,其特征在于,所述装置包括:
创建模块,用于创建链表,所述链表中的节点是所述内存池中的可用块,所述可用块是指未使用的内存块;
内存分配模块,用于响应于接收到任一内存分配指令,将当前所述链表的前x个节点对应的可用块进行分配,并将所述链表中的原第x+1个节点设置为新的首节点;所述x表示需要分配的内存块数量;
内存回收模块,用于响应于接收到任一内存释放指令,将已释放的内存块添加到所述链表中作为所述链表的新的首节点,以及将该新的首节点的下一节点设置为所述链表的旧的首节点。
19.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至17中任一项所述方法的步骤。
20.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至17中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311289321.3A CN117032995A (zh) | 2023-10-08 | 2023-10-08 | 内存池管理方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311289321.3A CN117032995A (zh) | 2023-10-08 | 2023-10-08 | 内存池管理方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117032995A true CN117032995A (zh) | 2023-11-10 |
Family
ID=88630340
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311289321.3A Pending CN117032995A (zh) | 2023-10-08 | 2023-10-08 | 内存池管理方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117032995A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1635482A (zh) * | 2003-12-29 | 2005-07-06 | 北京中视联数字系统有限公司 | 一种嵌入式系统内存管理的方法 |
WO2016011811A1 (zh) * | 2014-07-21 | 2016-01-28 | 深圳市中兴微电子技术有限公司 | 一种内存管理方法、装置及存储介质 |
CN106991010A (zh) * | 2017-03-22 | 2017-07-28 | 武汉虹信通信技术有限责任公司 | 一种用于流媒体服务器的内存集中动态分配方法 |
CN114490060A (zh) * | 2022-01-24 | 2022-05-13 | 网易(杭州)网络有限公司 | 内存分配方法、装置、计算机设备和计算机可读存储介质 |
-
2023
- 2023-10-08 CN CN202311289321.3A patent/CN117032995A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1635482A (zh) * | 2003-12-29 | 2005-07-06 | 北京中视联数字系统有限公司 | 一种嵌入式系统内存管理的方法 |
WO2016011811A1 (zh) * | 2014-07-21 | 2016-01-28 | 深圳市中兴微电子技术有限公司 | 一种内存管理方法、装置及存储介质 |
CN106991010A (zh) * | 2017-03-22 | 2017-07-28 | 武汉虹信通信技术有限责任公司 | 一种用于流媒体服务器的内存集中动态分配方法 |
CN114490060A (zh) * | 2022-01-24 | 2022-05-13 | 网易(杭州)网络有限公司 | 内存分配方法、装置、计算机设备和计算机可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20220309007A1 (en) | Data Write Method, Apparatus, and System | |
CN109582227B (zh) | 固态硬盘写入方法、装置、计算机设备和存储介质 | |
CN109614226B (zh) | 一种基于Kubernetes的有状态应用存储管理方法 | |
EP3306477B1 (en) | Storage device and block storage method based on the storage device | |
CN105516367A (zh) | 分布式数据存储系统、方法和装置 | |
CN107122133B (zh) | 数据存储方法及装置 | |
US20150089178A1 (en) | Management Of A Memory | |
CN105677243A (zh) | 数据写入装置及方法 | |
CN115543871B (zh) | 数据存储方法及相关设备 | |
CN111522659B (zh) | 一种空间使用方法和装置 | |
CN111291062B (zh) | 数据同步写入方法、装置、计算机设备及存储介质 | |
CN111984196B (zh) | 一种文件迁移方法、装置、设备及可读存储介质 | |
CN117032995A (zh) | 内存池管理方法、装置、计算机设备和存储介质 | |
CN105450679A (zh) | 进行数据云存储的方法及系统 | |
CN111597066A (zh) | Ssd修复方法、装置、计算机设备及存储介质 | |
CN111176559B (zh) | 数据写入方法及装置、双活系统 | |
CN114168225B (zh) | 固态硬盘映射表延迟更新方法、装置、计算机设备及存储介质 | |
CN113867925A (zh) | 内存管理方法、装置、设备和存储介质 | |
CN110059109B (zh) | 数据查询的装置、方法及存储介质 | |
CN113419672A (zh) | 一种存储容量管理方法、系统及存储介质 | |
CN111491040A (zh) | 一种ip分配方法以及ip分配装置 | |
US9773562B2 (en) | Storage apparatus, flash memory control apparatus, and program | |
CN111524059A (zh) | 一种图像缓存时内存利用方法、系统、终端和存储介质 | |
CN112799711B (zh) | 合并容器镜像的方法、装置、计算机设备和存储介质 | |
CN113934370B (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 |