CN109144712A - 内存池构建、内存分配方法及装置 - Google Patents
内存池构建、内存分配方法及装置 Download PDFInfo
- Publication number
- CN109144712A CN109144712A CN201710462336.3A CN201710462336A CN109144712A CN 109144712 A CN109144712 A CN 109144712A CN 201710462336 A CN201710462336 A CN 201710462336A CN 109144712 A CN109144712 A CN 109144712A
- Authority
- CN
- China
- Prior art keywords
- memory
- block
- control block
- target
- memory block
- 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
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
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
技术领域
本发明实施例涉及计算机软件技术,尤其涉及内存池构建、内存分配方法、及装置。
背景技术
通常我们习惯于使用new、malloc等系统原生的API(Application ProgrammingInterfac,应用程序编程接口)申请分配内存,这样做的缺点在于:由于不同应用程序所申请的内存块的大小不定,当频繁使用时会造成大量内存碎片并进而降低了系统性能。
内存池是一种优化的内存分配方式,内存池在真正使用内存之前,先申请分配一定数量的、大小相等的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存不够则再申请新的内存。这样做的显著优点是,使得内存分配效率得到提升,同时因为不会频繁申请和释放内存,所以不会出现内存碎片,提高系统效率。内存池的实现方式一般采用的是拉链式的哈希表进行存储,每个哈希节点指向不同大小的内存池,每个内存池中,将大小一致的空闲内存和使用内存分别使用链表进行组织,形成空闲链表和使用链表。当申请内存时,从空闲链表获取链表节点,并将其加入使用链表中;释放内存时,将链表节点从使用链表中摘链,并加入空闲链表。
随着技术的不断进步,人们对内存池的使用要求也不断提高,传统的内存池结构已经无法满足人们日益严苛的使用需求。
发明内容
本发明实施例提供了一种内存池构建、内存分配方法、装置、设备及存储介质,以实现对现有的内存池进行结构优化,提高内存池的工作性能。
第一方面,本发明实施例提供了一种内存池构建方法,包括:
确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据所述内存块种类构建哈希节点数组,其中,不同内存块种类对应不同内存块大小,不同哈希节点对应不同的内存块种类;
根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,并根据计算得到的内存总量申请内存;
将与各所述内存块种类分别对应的所述内存划分为与所述内存块数量匹配的内存块,并申请与所述内存块对应的内存控制块与所述内存块相关联;
将与相同内存块种类对应的内存控制块相连接,构建内存控制块链表,并将不同内存控制块链表的链表头写入对应的哈希节点中;
构建红黑树,以存储与已占用内存块对应的内存控制块。
第二方面,本发明实施例还提供了一种内存分配方法,使用通过本发明实施例所述的内存池构建方法所构建的内存池,包括:
在获取与内存申请请求对应的目标申请内存大小后,根据所述目标申请内存大小,在所述内存池中的哈希节点数组中查找对应的第一目标哈希节点,并在所述第一目标哈希节点中获取第一目标链表头;
根据所述第一目标链表头查找对应的第一目标内存控制块链表,并在所述第一目标内存控制块链表中,获取对应的第一目标内存控制块;
将所述第一目标内存控制块从所述第一目标内存控制块链表中摘下后,将所述第一目标内存控制块加入红黑树中,并返回与所述第一目标内存控制块关联的第一目标内存块的地址;
在获取与内存释放请求对应的内存释放地址后,将在所述红黑树中查找到的,与所述内存释放地址对应的第二目标内存控制块从所述红黑树中摘下;
如果确定与内存释放地址对应的第二目标内存块不存在写越界,则在与所述第二目标内存控制块对应的第二目标哈希节点中获取第二目标链表头后,根据所述第二目标链表头查找对应的第二目标内存控制块链表,并在所述第二目标内存控制块链表中,加入所述第二目标内存控制块。
第三方面,本发明实施例还提供了一种内存池构建装置,包括:
内存块参数确定模块,用于确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据所述内存块种类构建哈希节点数组,其中,不同内存块种类对应不同内存块大小,不同哈希节点对应不同的内存块种类;
内存申请模块,用于根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,并根据计算得到的内存总量申请内存;
内存控制块关联模块,用于将与各所述内存块种类分别对应的所述内存划分为与所述内存块数量匹配的内存块,并申请与所述内存块对应的内存控制块与所述内存块相关联;
内存控制块链表构建模块,用于将与相同内存块种类对应的内存控制块相连接,构建内存控制块链表,并将不同内存控制块链表的链表头写入对应的哈希节点中;
红黑树构建模块,用于构建红黑树,以存储与已占用内存对应的内存控制块。
第四方面,本发明实施例还提供了一种内存分配装置,使用通过本发明实施例所述的内存池构建装置所建立的内存池,包括:
内存申请请求处理模块,用于在获取与内存申请请求对应的目标申请内存大小后,根据所述目标申请内存大小,在所述内存池中的哈希节点数组中查找对应的第一目标哈希节点,并在所述第一目标哈希节点中获取第一目标链表头;
第一目标内存控制块获取模块,用于根据所述第一目标链表头查找对应的第一目标内存控制块链表,并在所述第一目标内存控制块链表中,获取对应的第一目标内存控制块;
内存块地址返回模块,用于将所述第一目标内存控制块从所述第一目标内存控制块链表中摘下后,将所述第一目标内存控制块加入红黑树中,并返回与所述第一目标内存控制块关联的第一目标内存块的地址;
内存控制块摘除模块,用于在获取与内存释放请求对应的内存释放地址后,将在所述红黑树中查找到的,与所述内存释放地址对应的第二目标内存控制块从所述红黑树中摘下;
第二目标内存控制块加入模块,用于如果确定与内存释放地址对应的第二目标内存块不存在写越界,则在与所述第二目标内存控制块对应的第二目标哈希节点中获取第二目标链表头后,根据所述第二目标链表头查找对应的第二目标内存控制块链表,并在所述第二目标内存控制块链表中,加入所述第二目标内存控制块。
本发明实施例提供了内存池构建、内存分配方法、装置,在内存池构建过程中,通过预先确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据确定的内存块种类以及内存块数量构建内存池,可以尽可能避免由于内存池初始化过程中构建的内存块种类以及与内存块种类对应的内存块数量不合理,而造成的内存资源浪费的问题,提高了内存的使用率,此外,通过构建一个红黑树代替链表来存储与已占用内存块对应的内存控制块,可以降低检索对应内存控制块的时间复杂度,进一步优化了内存池的性能。
附图说明
图1a是本发明实施例一中的一种内存池构建方法的流程图;
图1b是本发明实施例一中的一种内存块的结构示意图;
图1c是本发明实施例一中的另一种内存块的结构示意图;
图1d是本发明实施例一中的另一种内存块的结构示意图;
图1e是本发明实施例一中的一种内存池中各个数据结构的组成关系的结构示意图;
图2是本发明实施例二中的一种内存分配方法的流程图;
图3是本发明实施例三中的一种内存池构建装置的结构图;
图4是本发明实施例四中的一种内存分配装置的结构图;
图5是本发明实施例五中的一种计算机设备的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作(或步骤)描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。
实施例一
图1a为本发明实施例一提供的一种内存池构建方法的流程图,本实施例可适用于对内存池进行初始化构建的情况,该方法可以由本发明实施例提供的内存池构建装置来执行,该装置可采用软件和/或硬件的方式实现,并一般可集成在电子设备中,典型的,所述电子设备可以为基站。如图1a所示,本实施例的方法具体包括:
S110、确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据所述内存块种类构建哈希节点数组;其中,不同内存块种类对应不同内存块大小,不同哈希节点对应不同的内存块种类。
发明人通过研究发现,当现有的内存池容量不够时,需要重新申请内存并重新进行初始化工作,这样就降低了内存申请的效率,并且因为无法预估出需要使用的内存块的大小,只能按预设大小进行内存池的申请,会造成内存资源的浪费,降低了内存的使用率。基于此,发明人创造性的提出在进行内存池的初始化之前,首先根据系统运行状态,确定系统正常运行所需的至少两个内存块种类以及与所述内存块种类对应的内存块数量。
在本实施例的一个可选的实施方式中,确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量可以包括:
统计系统在设定时间段内,设定负载下记录的内存申请信息;根据所述内存申请信息,确定至少两个内存块种类,以及与所述内存块种类对应的内存块数量;其中,所述内存申请信息包括申请内存大小。
也即,可以首先将系统(所述电子设备所使用的操作系统)设置为高负载状态(例如:当前连接系统的用户设备的数量大于设定阈值),之后通过统计设定时间段内(例如:1小时、3小时或者5小时等)内的内存申请信息,例如:100次32字节的内存申请,800次64字节的内存申请等。
相应的,可以将32字节以及64字节确定为两种不同的内存块种类,100确定为与32字节对应的内存块数量,800确定为与64字节对应的内存块数量。当然,从设计冗余量的角度考虑,最终确定的与内存池构建时使用的内存块种类对应的内存块数量可以大于预先记录的内存申请信息中与内存块种类对应的内存块数量。
进一步的,考虑到内存划分的难度以及最终确定的内存块种类的数量限制,可以将记录的内存申请信息中包括的多个内存块种类向上取整为一个内存块种类。
例如:将内存申请信息中5字节、6字节、7字节以及8字节的申请内存大小,最终确定为一个8字节的内存块种类。
S120、根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,并根据计算得到的内存总量申请内存。
其中,一个内存块种类对应一个申请内存大小,其也就对应内存区中的一个内存块。同时,为了实现对内存块的正常查找,内存中的不同内存块需要对应存储不同的链表控制信息。因此,在计算内存总量的时候,同时还要考虑链表控制信息的大小。其中,在如1b中示出了一种内存块的结构示意图。如图1b所示,一个内存块中同时包括:链表控制信息以及实际分配内存,所述实际分配内存与一个内存块种类相对应。
相应的,可以根据与各内存块种类对应的内存块(链表控制信息所占的内存与实际分配内存之和)的大小,以及与各内存块对应的内存块数量,计算与各所述内存块种类分别对应的内存总量;
进一步的,发明人通过研究发现:现有的内存池在实现时分配的内存块与链表控制信息使用连续的内存,链表控制信息位于内存块位置处向前偏移若干个字节的位置上,当内存块在使用过程中发生错误,如写越界等,造成内存块的链表控制信息被修改,从而导致整个链表失效,无法进行补救。基于此,发明人创造性的提出:将链表控制信息与内存块分开,保证内存使用时出现写越界等异常情况时,也不会覆盖到对应的链表控制信息,不会波及到整个内存池的结构。其中,在图1c中示出了相应的内存块的结构示意图。如图1c所示,一个内存块中同时包括:链表控制信息、保护内存块以及实际分配内存,通过上述内存块结构,即使实际分配内存出现写越界,也不会影响链表控制信息。
相应的,可以根据与各内存块种类对应的内存块的大小(链表控制信息所占的内存、保护内存块以及实际分配内存之和),以及与各内存块对应的内存块数量,计算与各所述内存块种类分别对应的内存总量;
更进一步的,发明人考虑通过在实际分配内存首尾加入魔数,以实现对实际分配内存写越界的有效判断,以进一步优化内存池的性能。其中,在图1d中示出了相应的内存块的结构示意图。如图1d所示,一个内存块中同时包括:链表控制信息、保护内存块、位于实际分配内存首尾的魔数以及所述实际分配内存。相应的,可以根据与各内存块种类对应的内存块的大小(链表控制信息所占的内存、保护内存块、实际分配内存以及实际分配内存首尾魔数所占的内存大小之和),以及与各内存块对应的内存块数量,计算与各所述内存块种类分别对应的内存总量。
基于上述分析,在本实施例的一个可选的实施方式中,根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,可以包括:依次获取一个内存块种类作为当前内存块种类;获取与所述当前内存块种类对应的初始内存块大小;根据所述初始内存块大小、链表控制信息占用的内存大小以及链表控制信息与所述初始内存块之间的保护内存块大小,计算得到实际内存块大小;根据所述实际内存块大小,以及与所述当前内存块种类对应的内存块数量,计算的得到与所述当前内存块种类对应的内存总量;返回执行依次获取一个内存块种类作为当前内存块种类的操作,直至完成对全部内存块种类的处理。
具体的,根据所述初始内存块大小、链表控制信息占用的内存大小以及链表控制信息与所述初始内存块之间的保护内存块大小,计算得到实际内存块大小,进一步可以包括:根据所述初始内存块大小、链表控制信息占用的内存大小、链表控制信息与所述初始内存块之间的保护内存块大小以及所述初始内存块首尾添加的魔数占用的内存大小,计算得到实际内存块大小。
S130、将与各所述内存块种类分别对应的所述内存划分为与所述内存块数量匹配的内存块,并申请与所述内存块对应的内存控制块与所述内存块相关联。
S140、将与相同内存块种类对应的内存控制块相连接,构建内存控制块链表,并将不同内存控制块链表的链表头写入对应的哈希节点中。
S150、构建红黑树,以存储与已占用内存块对应的内存控制块。
在本实施例中,红黑树用于存放与已经被占用的内存块对应的内存控制块,是按照内存地址的数值作为判断依据进行组织的,主要用于内存的释放。使用红黑树可以降低检索对应控制块的时间复杂度,同时因为需要反复的插入删除节点,红黑树的恢复效率也比较高。
本发明实施例提供了一种内存池构建方法,在内存池构建过程中,通过预先确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据确定的内存块种类以及内存块数量构建内存池,可以尽可能避免由于内存池初始化过程中构建的内存块种类以及与内存块种类对应的内存块数量不合理,而造成的内存资源浪费的问题,提高了内存的使用率,此外,通过构建一个红黑树代替链表来存储与已占用内存块对应的内存控制块,可以降低检索对应内存控制块的时间复杂度,进一步优化了内存池的性能。
在上述各实施例的基础上,统计系统在设定时间段内,设定负载下记录的内存申请信息,可以包括:
将与内存池模式对应的内存申请接口的第一申请接口函数替换为系统原生的第二申请接口函数;将与内存池模式对应的内存释放接口的第一释放接口函数替换为系统原生的第二释放接口函数;在所述第一申请接口函数中添加统计功能,用于记录所述申请内存大小;对系统在设定时间段内,设定负载下记录的所述申请内存大小的总数量进行统计;
其中,所述第一申请接口函数与所述第二申请接口函数之间通过不同编译宏进行区分,所述第一释放接口函数与所述第二释放接口函数之间通过不同编译宏进行区分。
在本实施例中,为了减少对上层应用的修改,可以构造一个内存池容量评估模块,其对外接口与内存池现有的接口完全一致,只是在每个接口中,使用编译宏来区分(也即,通过编译宏开关来确定当前对内存的申请和释放使用的是系统的原生API函数还是内存池),当内存评估模块生效时,其内存的申请和释放直接调用系统的原生API函数,只是在对应接口中添加统计功能,记录申请内存的大小,让系统在高负载下运行一段时间,根据记录的申请内存的大小,从而可以得出一个较为准确的系统内存使用量的统计。根据该统计可以评估出内存池中各个内存块的大小以及数量,最大限度的增加内存的使用率,同时因为是在高负载下进行的评估,这样也就有效防止内存块数量不足的情况发生。
进一步的,发明人通过研究发现:现有的内存池在发生错误后,无法对发生的问题进行定位分析和记录,从而不能给使用者提供解决问题的思路,只能通过review代码的方式,效率低下。基于此,发明人创造性的提出了在内存池中加入出错分析记录功能,当内存池出现坏块时,能够对具体哪个模块造成的内存写越界为用户提供一定的线索。此外,并将损坏的内存块标记为坏块(存储于新的出错记录链表中),坏块不会再分配给用户。
相应的在上述各实施例的基础上,所述方法还包括:构建出错记录链表,以存储与内存使用过程中的出错内存块对应的内存控制块。相应的,所述内存控制块可以包括:前向指针、后向指针、父指针、内存块存储地址、哈希节点地址以及出错诊断数据。
具体应用场景
图1e是本发明实施例一中的一种内存池中各个数据结构的组成关系的结构示意图。如图1e所示,本发明实施例中所述内存池的整体结构,是由一个拉链式哈希表1101、一个红黑树1102和一个出错记录链表1103组成。
其中,拉链式哈希表1101中存放与整个内存池的可用内存块对应的内存控制块。根据预先进行的系统内存使用量的统计,决定建立多少个哈希节点(也即,确定有多少个内存块类型)。哈希节点的先后循序根据与内存块类型对应的申请内存大小,由大到小进行排列,这样做的目的是为了优化内存申请效率。在每个哈希节点中,包含了一个内存控制块链表,用于存放与当前可用的内存块对应的内存控制块,主要用于内存的申请;
红黑树1102,用于存放与当前占用的内存块对应的内存控制块,主要用于内存的释放;
出错记录链表1103,用于存放与运行过程中出错的内存块对应的内存控制块,便于分析记录原因;
拉链式哈希表1101、红黑树1102以及出错记录链表1103这三种数据结构用到的内存控制块完全一致:其中,当内存控制块用于红黑树时,其“前向指针”指向左孩子;“后向指针”指向右孩子;“父指针”指向父节点;“地址”指的是本内存控制块指向的内存块的实际地址。一般来说,地址都要以四字节单位申请,所以最后两个比特一定为0,用于存储节点颜色;“哈希节点地址”用于快速找到该内存控制块所属的哈希节点;“诊断数据”用于存放当发生内存错误问题是用于分析定位之用;当内存控制块用于出错记录链表时,父指针没有作用,地址部分不用着色,其它作用与红黑树一致。
基于图1e所述的内存池中各个数据结构的组成关系,构建内存池时,执行下述操作:
1、根据由系统内存使用量的统计结果确定的所需要的内存块种类,构造哈希节点数组,每个哈希节点存放内存控制块节点链表的链表头,按照内存块种类对应的内存块由多到少的顺序排列;
2、根据由系统内存使用量的统计结果,可以得出不同大小的内存块需要申请的个数,在每个内存块的前后分别加入两个字节的魔术用于判断内存写越界,得出每个种类的需要申请的内存总量,申请内存;
3、根据内存块的个数将内存分隔为相同大小的内存块,并且申请相同个数的内存控制块,修改内存控制块中的内容,使内存控制块与内存块相关联,将相同大小的内存控制块连接在一起成为一个双向链表,也即内存控制块链表;
4、将链表头写入到对应的哈希节点中;
5、构造红黑树和出错记录链表,初始化均为空。
实施例二
图2为本发明实施例二提供的一种内存分配方法的流程图,本实施例可适用于对内存池中的内存进行申请或者释放的情况,使用本发明实施例的内存池构建方法所构建的内存池,本实施例的方法可以由本发明实施例提供的内存分配装置来执行,该装置可采用软件和/或硬件的方式实现,并一般可集成在电子设备中。如图2所示,本实施例的方法具体包括:
S210、在获取与内存申请请求对应的目标申请内存大小后,根据所述目标申请内存大小,在所述内存池中的哈希节点数组中查找对应的第一目标哈希节点,并在所述第一目标哈希节点中获取第一目标链表头。
S220、根据所述第一目标链表头查找对应的第一目标内存控制块链表,并在所述第一目标内存控制块链表中,获取对应的第一目标内存控制块。
S230、将所述第一目标内存控制块从所述第一目标内存控制块链表中摘下后,将所述第一目标内存控制块加入红黑树中,并返回与所述第一目标内存控制块关联的第一目标内存块的地址。
在本实施例中,在内存池获取内存申请请求后,根据需要申请的内存大小找出对应的哈希节点;根据哈希节点中存放的链表头,找到一个链表节点,获取其对应的内存控制块;将该内存控制块从对应的内存控制块链表摘下,并将该内存控制块加入到红黑树中;给用户返回对应内存块的地址;
S240、在获取与内存释放请求对应的内存释放地址后,将在所述红黑树中查找到的,与所述内存释放地址对应的第二目标内存控制块从所述红黑树中摘下。
S250、如果确定与内存释放地址对应的第二目标内存块不存在写越界,则在与所述第二目标内存控制块对应的第二目标哈希节点中获取第二目标链表头后,根据所述第二目标链表头查找对应的第二目标内存控制块链表,并在所述第二目标内存控制块链表中,加入所述第二目标内存控制块。
在本实施例的一个可选的实施方式中,在获取与内存释放请求对应的释放地址后,将在所述红黑树中查找到的,与所述释放地址对应的第二目标内存控制块从所述红黑树中摘下之后,还可以包括:
如果确定与内存释放地址对应的第二目标内存块存在写越界,则将所述第二目标内存控制块加入出错记录链表中。
进一步的,在确定与内存释放地址对应的第二目标内存块存在写越界,可以包括:根据与所述第二目标内存控制块对应的第二目标哈希节点,确定与所述第二目标内存块对应的目标释放内存大小;根据所述目标释放内存大小以及所述内存释放地址,在所述第二目标内存块的魔数存储位置中读取对应的待验证数据;如果所述待验证数据与预存的魔数值不匹配,则确定与内存释放地址对应的第二目标内存块存在写越界。
在本实施例中,在内存池获取内存释放请求后,根据内存释放请求中的释放地址在红黑树中找到对应的内存控制块,从红黑树上摘下;根据内存控制块找到对应的哈希节点的地址,可以得出内存块的大小,在与释放地址对应的内存块中,分别向后向前偏移两个字节得到对应的魔数,查看有没有存在内存写越界的情况:如果存在写越界的情况,将对应的内存控制块加入到出错记录链表中,再将诊断数据和提示信息提示给用户;如果没有越界情况,则将内存控制块加入到对应的内存控制块链表中。
本发明实施例提供了一种内存分配方法,通过预先确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据确定的内存块种类以及内存块数量构建内存池,可以尽可能避免由于内存池初始化过程中构建的内存块种类以及与内存块种类对应的内存块数量不合理,而造成的内存资源浪费的问题,提高了内存的使用率,此外,通过构建一个红黑树代替链表来存储与已占用内存块对应的内存控制块,可以降低检索对应内存控制块的时间复杂度,进一步优化了内存池的性能。
另外,需要再次强调的是,本发明实施例的内存池的使用的场景,特别适应于那种需要频繁申请和释放的地方,如果申请的内存要长期使用的话,本发明实施例的内存池会浪费一定的内存。
此外,因为本发明实施例涉及到拉链式哈希表、红黑树和出错记录链表这三个全局数据结构,而且申请内存和释放内存都是异步的,需要对临界资源进行互斥保护。
相应的,在本实施例的一个可选的实施方式中,还可以包括:在处理内存申请请求时,对操作的第一目标内存块进行互斥保护;和/或,在处理内存释放请求时,对操作的第二目标内存块进行互斥保护。
进一步的,基于本发明实施例在内存池在Mcwill基站三层中进行了试运行,运行结果良好,能够排查出代码中出现的写越界等情况的发生。长期运行时,避免了内存碎片的生成,提高了系统的稳定性和性能。
其中,在Mcwill基站三层系统中,开发的环境为c++,通过重载new和delete,将内存池的申请和释放内存的操作替换为之前的系统原生API函数,能够减少上层应用的修改。
首先运行内存使用量估计功能,打开对应的编译宏功能开关,编译更换基站的版本,让基站在多用户台下持续运行较长一段时间,可以估算出基站所需要的内存量。
根据估算量对内存池进行初始化,在估计量基础上加上一定的偏差值,防止异常情况的发生。其中32字节以下的内存块数量为30000个,32-64个字节的内存块数量为8000个,64-128个字节内存块的数量为500个,128-512个字节内存块的数量为100个,512-1024个字节内存块的数量为30个。
程序正常运行后,基站功能上没有出现问题。在多用户的条件下进行长时间的测试,查看问题记录链表,发现确实有写越界的情况,根据当时记录的log信息,分析了该内存块前后的相邻内存,根据其诊断数据快速找到了申请内存的位置,再查看其内存的使用,很快找到了内存越界的问题点,并且出现了内存越界的情况,此时系统仍然运行正常,不会造成连续不可恢复的问题。
实施例三
图3为本发明实施例三提供的一种内存池构建装置的结构示意图,如图3所示,所述装置包括:内存块参数确定模块310、内存申请模块320、内存控制块关联模块330、内存控制块链表构建模块340以及红黑树构建模块350,其中:
内存块参数确定模块310,用于确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据所述内存块种类构建哈希节点数组,其中,不同内存块种类对应不同内存块大小,不同哈希节点对应不同的内存块种类;
内存申请模块320,用于根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,并根据计算得到的内存总量申请内存;
内存控制块关联模块330,用于将与各所述内存块种类分别对应的所述内存划分为与所述内存块数量匹配的内存块,并申请与所述内存块对应的内存控制块与所述内存块相关联;
内存控制块链表构建模块340,用于将与相同内存块种类对应的内存控制块相连接,构建内存控制块链表,并将不同内存控制块链表的链表头写入对应的哈希节点中;
红黑树构建模块350,用于构建红黑树,以存储与已占用内存对应的内存控制块。
本发明实施例提供了一种内存池构建装置,在内存池构建过程中,通过预先确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据确定的内存块种类以及内存块数量构建内存池,可以尽可能避免由于内存池初始化过程中构建的内存块种类以及与内存块种类对应的内存块数量不合理,而造成的内存资源浪费的问题,提高了内存的使用率,此外,通过构建一个红黑树代替链表来存储与已占用内存块对应的内存控制块,可以降低检索对应内存控制块的时间复杂度,进一步优化了内存池的性能。
在上述各实施例的基础上,所述内存块参数确定模块,可以包括:
内存申请信息统计单元,用于统计系统在设定时间段内,设定负载下记录的内存申请信息;
参数确定单元,用于根据所述内存申请信息,确定至少两个内存块种类,以及与所述内存块种类对应的内存块数量;其中,所述内存申请信息包括申请内存大小。
在上述各实施例的基础上,所述内存申请信息统计单元,具体可以用于:
将与内存池模式对应的内存申请接口的第一申请接口函数替换为系统原生的第二申请接口函数;将与内存池模式对应的内存释放接口的第一释放接口函数替换为系统原生的第二释放接口函数;在所述第一申请接口函数中添加统计功能,用于记录所述申请内存大小;对系统在设定时间段内,设定负载下记录的所述申请内存大小的总数量进行统计;
其中,所述第一申请接口函数与所述第二申请接口函数之间通过不同编译宏进行区分,所述第一释放接口函数与所述第二释放接口函数之间通过不同编译宏进行区分。
在上述各实施例的基础上,所述内存申请模块,具体可以包括:
当前内存块种类获取单元,用于依次获取一个内存块种类作为当前内存块种类;
初始内存块大小获取单元,用于获取与所述当前内存块种类对应的初始内存块大小;
实际内存块大小计算单元,用于根据所述初始内存块大小、链表控制信息占用的内存大小以及链表控制信息与所述初始内存块之间的保护内存块大小,计算得到实际内存块大小;
内存总量计算单元,用于根据所述实际内存块大小,以及与所述当前内存块种类对应的内存块数量,计算的得到与所述当前内存块种类对应的内存总量;
返回执行单元,返回触发所述当前内存块种类获取单元执行操作,直至完成对全部内存块种类的处理。
在上述各实施例的基础上,所述实际内存块大小计算单元,可以进一步具体用于:
根据所述初始内存块大小、链表控制信息占用的内存大小、链表控制信息与所述初始内存块之间的保护内存块大小以及所述初始内存块首尾添加的魔数占用的内存大小,计算得到实际内存块大小。
在上述各实施例的基础上,还可以包括:
出错记录链表构建模块,用于构建出错记录链表,以存储与内存使用过程中的出错内存块对应的内存控制块。
在上述各实施例的基础上,所述内存控制块可以包括:前向指针、后向指针、父指针、内存块存储地址、哈希节点地址以及出错诊断数据。
上述内存池构建装置可执行本发明任意实施例所提供的内存池构建方法,具备执行内存池构建方法相应的功能模块和有益效果。
实施例四
图4为本发明实施例四提供的一种内存分配装置的结构示意图,使用通过本发明实施例所述的内存池构建装置所构建的内存池,如图4所示,所述装置包括:内存申请请求处理模块410、第一目标内存控制块获取模块420、内存块地址返回模块430、内存控制块摘除模块440以及第二目标内存控制块加入模块450,其中:
内存申请请求处理模块410,用于在获取与内存申请请求对应的目标申请内存大小后,根据所述目标申请内存大小,在所述内存池中的哈希节点数组中查找对应的第一目标哈希节点,并在所述第一目标哈希节点中获取第一目标链表头;
第一目标内存控制块获取模块420,用于根据所述第一目标链表头查找对应的第一目标内存控制块链表,并在所述第一目标内存控制块链表中,获取对应的第一目标内存控制块;
内存块地址返回模块430,用于将所述第一目标内存控制块从所述第一目标内存控制块链表中摘下后,将所述第一目标内存控制块加入红黑树中,并返回与所述第一目标内存控制块关联的第一目标内存块的地址;
内存控制块摘除模块440,用于在获取与内存释放请求对应的内存释放地址后,将在所述红黑树中查找到的,与所述内存释放地址对应的第二目标内存控制块从所述红黑树中摘下;
第二目标内存控制块加入模块450,用于如果确定与内存释放地址对应的第二目标内存块不存在写越界,则在与所述第二目标内存控制块对应的第二目标哈希节点中获取第二目标链表头后,根据所述第二目标链表头查找对应的第二目标内存控制块链表,并在所述第二目标内存控制块链表中,加入所述第二目标内存控制块。
本发明实施例提供了一种内存分配装置,在内存池构建过程中,通过预先确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据确定的内存块种类以及内存块数量构建内存池,可以尽可能避免由于内存池初始化过程中构建的内存块种类以及与内存块种类对应的内存块数量不合理,而造成的内存资源浪费的问题,提高了内存的使用率,此外,通过构建一个红黑树代替链表来存储与已占用内存块对应的内存控制块,可以降低检索对应内存控制块的时间复杂度,进一步优化了内存池的性能。
在上述各实施例的基础上,所述装置还可以包括:出错记录链表加入模块,用于在获取与内存释放请求对应的释放地址后,将在所述红黑树中查找到的,与所述释放地址对应的第二目标内存控制块从所述红黑树中摘下之后,如果确定与内存释放地址对应的第二目标内存块存在写越界,则将所述第二目标内存控制块加入出错记录链表中。
在上述各实施例的基础上,出错记录链表加入模块,可以具体用于:
根据与所述第二目标内存控制块对应的第二目标哈希节点,确定与所述第二目标内存块对应的目标释放内存大小;根据所述目标释放内存大小以及所述内存释放地址,在所述第二目标内存块的魔数存储位置中读取对应的待验证数据;如果所述待验证数据与预存的魔数值不匹配,则确定与内存释放地址对应的第二目标内存块存在写越界。
在上述各实施例的基础上,还可以包括,互斥保护模块,用于:
在处理内存申请请求时,对操作的第一目标内存块进行互斥保护;和/或
在处理内存释放请求时,对操作的第二目标内存块进行互斥保护。
上述内存分配装置可执行本发明任意实施例所提供的内存分配方法,具备执行内存分配方法相应的功能模块和有益效果。
实施例五
图5为本发明实施例五提供的一种计算机设备的结构示意图。图5示出了适于用来实现本发明实施方式的示例性计算机设备12的框图。图5显示的计算机设备12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图5所示,计算机设备12以通用计算设备的形式表现。计算机设备12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
计算机设备12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机设备12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机设备12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图5未显示,通常称为“硬盘驱动器”)。尽管图5中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如CD-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
计算机设备12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机设备12交互的设备通信,和/或与使得该计算机设备12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,计算机设备12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机设备12的其它模块通信。应当明白,尽管图5中未示出,可以结合计算机设备12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
处理单元16通过运行存储在系统存储器28中的程序,从而执行各种功能应用以及数据处理,例如实现本发明实施例所提供的内存池构建方法。也即,所述处理单元执行所述程序时实现:确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据所述内存块种类构建哈希节点数组,其中,不同内存块种类对应不同内存块大小,不同哈希节点对应不同的内存块种类;根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,并根据计算得到的内存总量申请内存;将与各所述内存块种类分别对应的所述内存划分为与所述内存块数量匹配的内存块,并申请与所述内存块对应的内存控制块与所述内存块相关联;将与相同内存块种类对应的内存控制块相连接,构建内存控制块链表,并将不同内存控制块链表的链表头写入对应的哈希节点中;构建红黑树,以存储与已占用内存块对应的内存控制块。
又例如:实现本发明实施例所提供的内存分配方法。也即,所述处理单元执行所述程序时实现:在获取与内存申请请求对应的目标申请内存大小后,根据所述目标申请内存大小,在所述内存池中的哈希节点数组中查找对应的第一目标哈希节点,并在所述第一目标哈希节点中获取第一目标链表头;根据所述第一目标链表头查找对应的第一目标内存控制块链表,并在所述第一目标内存控制块链表中,获取对应的第一目标内存控制块;将所述第一目标内存控制块从所述第一目标内存控制块链表中摘下后,将所述第一目标内存控制块加入红黑树中,并返回与所述第一目标内存控制块关联的第一目标内存块的地址;在获取与内存释放请求对应的内存释放地址后,将在所述红黑树中查找到的,与所述内存释放地址对应的第二目标内存控制块从所述红黑树中摘下;如果确定与内存释放地址对应的第二目标内存块不存在写越界,则在与所述第二目标内存控制块对应的第二目标哈希节点中获取第二目标链表头后,根据所述第二目标链表头查找对应的第二目标内存控制块链表,并在所述第二目标内存控制块链表中,加入所述第二目标内存控制块。
实施例六
本发明实施例六提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本申请所有发明实施例提供的内存池构建方法:也即,该程序被处理器执行时实现:确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据所述内存块种类构建哈希节点数组,其中,不同内存块种类对应不同内存块大小,不同哈希节点对应不同的内存块种类;根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,并根据计算得到的内存总量申请内存;将与各所述内存块种类分别对应的所述内存划分为与所述内存块数量匹配的内存块,并申请与所述内存块对应的内存控制块与所述内存块相关联;将与相同内存块种类对应的内存控制块相连接,构建内存控制块链表,并将不同内存控制块链表的链表头写入对应的哈希节点中;构建红黑树,以存储与已占用内存块对应的内存控制块。
或者,实现如本申请所有发明实施例提供的内存分配方法:也即,该程序被处理器执行时实现:在获取与内存申请请求对应的目标申请内存大小后,根据所述目标申请内存大小,在所述内存池中的哈希节点数组中查找对应的第一目标哈希节点,并在所述第一目标哈希节点中获取第一目标链表头;根据所述第一目标链表头查找对应的第一目标内存控制块链表,并在所述第一目标内存控制块链表中,获取对应的第一目标内存控制块;将所述第一目标内存控制块从所述第一目标内存控制块链表中摘下后,将所述第一目标内存控制块加入红黑树中,并返回与所述第一目标内存控制块关联的第一目标内存块的地址;在获取与内存释放请求对应的内存释放地址后,将在所述红黑树中查找到的,与所述内存释放地址对应的第二目标内存控制块从所述红黑树中摘下;如果确定与内存释放地址对应的第二目标内存块不存在写越界,则在与所述第二目标内存控制块对应的第二目标哈希节点中获取第二目标链表头后,根据所述第二目标链表头查找对应的第二目标内存控制块链表,并在所述第二目标内存控制块链表中,加入所述第二目标内存控制块。
可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (13)
1.一种内存池构建方法,其特征在于,包括:
确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据所述内存块种类构建哈希节点数组,其中,不同内存块种类对应不同内存块大小,不同哈希节点对应不同的内存块种类;
根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,并根据计算得到的内存总量申请内存;
将与各所述内存块种类分别对应的所述内存划分为与所述内存块数量匹配的内存块,并申请与所述内存块对应的内存控制块与所述内存块相关联;
将与相同内存块种类对应的内存控制块相连接,构建内存控制块链表,并将不同内存控制块链表的链表头写入对应的哈希节点中;
构建红黑树,以存储与已占用内存块对应的内存控制块。
2.根据权利要求1所述的方法,其特征在于,确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,包括:
统计系统在设定时间段内,设定负载下记录的内存申请信息;
根据所述内存申请信息,确定至少两个内存块种类,以及与所述内存块种类对应的内存块数量;
其中,所述内存申请信息包括申请内存大小。
3.根据权利要求2所述的方法,其特征在于,统计系统在设定时间段内,设定负载下记录的内存申请信息,包括:
将与内存池模式对应的内存申请接口的第一申请接口函数替换为系统原生的第二申请接口函数;
将与内存池模式对应的内存释放接口的第一释放接口函数替换为系统原生的第二释放接口函数;
在所述第一申请接口函数中添加统计功能,用于记录所述申请内存大小;
对系统在设定时间段内,设定负载下记录的所述申请内存大小的总数量进行统计;
其中,所述第一申请接口函数与所述第二申请接口函数之间通过不同编译宏进行区分,所述第一释放接口函数与所述第二释放接口函数之间通过不同编译宏进行区分。
4.根据权利要求1所述的方法,其特征在于,根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,包括:
依次获取一个内存块种类作为当前内存块种类;
获取与所述当前内存块种类对应的初始内存块大小;
根据所述初始内存块大小、链表控制信息占用的内存大小以及链表控制信息与所述初始内存块之间的保护内存块大小,计算得到实际内存块大小;
根据所述实际内存块大小,以及与所述当前内存块种类对应的内存块数量,计算的得到与所述当前内存块种类对应的内存总量;
返回执行依次获取一个内存块种类作为当前内存块种类的操作,直至完成对全部内存块种类的处理。
5.根据权利要求4所述的方法,其特征在于,根据所述初始内存块大小、链表控制信息占用的内存大小以及链表控制信息与所述初始内存块之间的保护内存块大小,计算得到实际内存块大小,进一步包括:
根据所述初始内存块大小、链表控制信息占用的内存大小、链表控制信息与所述初始内存块之间的保护内存块大小以及所述初始内存块首尾添加的魔数占用的内存大小,计算得到实际内存块大小。
6.根据权利要求1-5任一项所述的方法,其特征在于,还包括:
构建出错记录链表,以存储与内存使用过程中的出错内存块对应的内存控制块。
7.根据权利要求6所述的方法,其特征在于,所述内存控制块包括:前向指针、后向指针、父指针、内存块存储地址、哈希节点地址以及出错诊断数据。
8.一种内存分配方法,使用如权利要求1-7任一项所述的方法构建的内存池,其特征在于,包括:
在获取与内存申请请求对应的目标申请内存大小后,根据所述目标申请内存大小,在所述内存池中的哈希节点数组中查找对应的第一目标哈希节点,并在所述第一目标哈希节点中获取第一目标链表头;
根据所述第一目标链表头查找对应的第一目标内存控制块链表,并在所述第一目标内存控制块链表中,获取对应的第一目标内存控制块;
将所述第一目标内存控制块从所述第一目标内存控制块链表中摘下后,将所述第一目标内存控制块加入红黑树中,并返回与所述第一目标内存控制块关联的第一目标内存块的地址;
在获取与内存释放请求对应的内存释放地址后,将在所述红黑树中查找到的,与所述内存释放地址对应的第二目标内存控制块从所述红黑树中摘下;
如果确定与内存释放地址对应的第二目标内存块不存在写越界,则在与所述第二目标内存控制块对应的第二目标哈希节点中获取第二目标链表头后,根据所述第二目标链表头查找对应的第二目标内存控制块链表,并在所述第二目标内存控制块链表中,加入所述第二目标内存控制块。
9.根据权利要求8所述的方法,其特征在于,在获取与内存释放请求对应的释放地址后,将在所述红黑树中查找到的,与所述释放地址对应的第二目标内存控制块从所述红黑树中摘下之后,还包括:
如果确定与内存释放地址对应的第二目标内存块存在写越界,则将所述第二目标内存控制块加入出错记录链表中。
10.根据权利要求9所述的方法,其特征在于,确定与内存释放地址对应的第二目标内存块存在写越界,包括:
根据与所述第二目标内存控制块对应的第二目标哈希节点,确定与所述第二目标内存块对应的目标释放内存大小;
根据所述目标释放内存大小以及所述内存释放地址,在所述第二目标内存块的魔数存储位置中读取对应的待验证数据;
如果所述待验证数据与预存的魔数值不匹配,则确定与内存释放地址对应的第二目标内存块存在写越界。
11.根据权利要求10所述的方法,其特征在于,还包括:
在处理内存申请请求时,对操作的第一目标内存块进行互斥保护;和/或
在处理内存释放请求时,对操作的第二目标内存块进行互斥保护。
12.一种内存池构建装置,其特征在于,包括:
内存块参数确定模块,用于确定与系统运行状态关联的至少两个内存块种类以及与所述内存块种类对应的内存块数量,并根据所述内存块种类构建哈希节点数组,其中,不同内存块种类对应不同内存块大小,不同哈希节点对应不同的内存块种类;
内存申请模块,用于根据与所述内存块种类对应的内存块数量,计算与各所述内存块种类分别对应的内存总量,并根据计算得到的内存总量申请内存;
内存控制块关联模块,用于将与各所述内存块种类分别对应的所述内存划分为与所述内存块数量匹配的内存块,并申请与所述内存块对应的内存控制块与所述内存块相关联;
内存控制块链表构建模块,用于将与相同内存块种类对应的内存控制块相连接,构建内存控制块链表,并将不同内存控制块链表的链表头写入对应的哈希节点中;
红黑树构建模块,用于构建红黑树,以存储与已占用内存对应的内存控制块。
13.一种内存分配装置,使用如权利要求12所述的装置构建的内存池,其特征在于,包括:
内存申请请求处理模块,用于在获取与内存申请请求对应的目标申请内存大小后,根据所述目标申请内存大小,在所述内存池中的哈希节点数组中查找对应的第一目标哈希节点,并在所述第一目标哈希节点中获取第一目标链表头;
第一目标内存控制块获取模块,用于根据所述第一目标链表头查找对应的第一目标内存控制块链表,并在所述第一目标内存控制块链表中,获取对应的第一目标内存控制块;
内存块地址返回模块,用于将所述第一目标内存控制块从所述第一目标内存控制块链表中摘下后,将所述第一目标内存控制块加入红黑树中,并返回与所述第一目标内存控制块关联的第一目标内存块的地址;
内存控制块摘除模块,用于在获取与内存释放请求对应的内存释放地址后,将在所述红黑树中查找到的,与所述内存释放地址对应的第二目标内存控制块从所述红黑树中摘下;
第二目标内存控制块加入模块,用于如果确定与内存释放地址对应的第二目标内存块不存在写越界,则在与所述第二目标内存控制块对应的第二目标哈希节点中获取第二目标链表头后,根据所述第二目标链表头查找对应的第二目标内存控制块链表,并在所述第二目标内存控制块链表中,加入所述第二目标内存控制块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710462336.3A CN109144712A (zh) | 2017-06-19 | 2017-06-19 | 内存池构建、内存分配方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710462336.3A CN109144712A (zh) | 2017-06-19 | 2017-06-19 | 内存池构建、内存分配方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109144712A true CN109144712A (zh) | 2019-01-04 |
Family
ID=64803998
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710462336.3A Pending CN109144712A (zh) | 2017-06-19 | 2017-06-19 | 内存池构建、内存分配方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109144712A (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110413521A (zh) * | 2019-07-24 | 2019-11-05 | 杭州迪普信息技术有限公司 | 一种堆内存的写越界检测方法和装置 |
CN110489425A (zh) * | 2019-08-26 | 2019-11-22 | 上海达梦数据库有限公司 | 一种数据访问方法、装置、设备及存储介质 |
CN110928682A (zh) * | 2019-11-13 | 2020-03-27 | 国微集团(深圳)有限公司 | 外部设备访问计算机内存的方法 |
CN111191082A (zh) * | 2019-12-23 | 2020-05-22 | 宁波港信息通信有限公司 | 数据管理方法、装置、计算机设备和存储介质 |
CN111708638A (zh) * | 2020-06-18 | 2020-09-25 | 网易(杭州)网络有限公司 | 内存分配方法、装置、设备及存储介质 |
CN112000482A (zh) * | 2020-08-25 | 2020-11-27 | 北京金山云网络技术有限公司 | 一种内存管理的方法、装置、电子设备及存储介质 |
CN112463355A (zh) * | 2020-10-22 | 2021-03-09 | 北京航空航天大学 | 基于哈希的用户态内存申请固定缓存方法 |
CN112463214A (zh) * | 2019-09-09 | 2021-03-09 | 北京京东振世信息技术有限公司 | 数据处理方法及装置、计算机可读存储介质以及电子设备 |
CN113867969A (zh) * | 2021-11-30 | 2021-12-31 | 深圳华云信息系统有限公司 | 一种内存分块方法、装置、电子设备及存储介质 |
WO2022213875A1 (zh) * | 2021-04-08 | 2022-10-13 | 华为技术有限公司 | 一种内存扩展方法以及相关设备 |
WO2023092997A1 (zh) * | 2021-11-23 | 2023-06-01 | 上海商汤智能科技有限公司 | 图像特征点选取方法及装置、设备、存储介质和程序产品 |
CN116627359A (zh) * | 2023-07-24 | 2023-08-22 | 成都佰维存储科技有限公司 | 内存管理方法、装置、可读存储介质及电子设备 |
-
2017
- 2017-06-19 CN CN201710462336.3A patent/CN109144712A/zh active Pending
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110413521B (zh) * | 2019-07-24 | 2023-01-24 | 杭州迪普信息技术有限公司 | 一种堆内存的写越界检测方法和装置 |
CN110413521A (zh) * | 2019-07-24 | 2019-11-05 | 杭州迪普信息技术有限公司 | 一种堆内存的写越界检测方法和装置 |
CN110489425A (zh) * | 2019-08-26 | 2019-11-22 | 上海达梦数据库有限公司 | 一种数据访问方法、装置、设备及存储介质 |
CN112463214B (zh) * | 2019-09-09 | 2023-11-03 | 北京京东振世信息技术有限公司 | 数据处理方法及装置、计算机可读存储介质以及电子设备 |
CN112463214A (zh) * | 2019-09-09 | 2021-03-09 | 北京京东振世信息技术有限公司 | 数据处理方法及装置、计算机可读存储介质以及电子设备 |
CN110928682A (zh) * | 2019-11-13 | 2020-03-27 | 国微集团(深圳)有限公司 | 外部设备访问计算机内存的方法 |
CN110928682B (zh) * | 2019-11-13 | 2023-06-09 | 深圳国微芯科技有限公司 | 外部设备访问计算机内存的方法 |
CN111191082A (zh) * | 2019-12-23 | 2020-05-22 | 宁波港信息通信有限公司 | 数据管理方法、装置、计算机设备和存储介质 |
CN111191082B (zh) * | 2019-12-23 | 2023-09-05 | 宁波港信息通信有限公司 | 数据管理方法、装置、计算机设备和存储介质 |
CN111708638A (zh) * | 2020-06-18 | 2020-09-25 | 网易(杭州)网络有限公司 | 内存分配方法、装置、设备及存储介质 |
CN111708638B (zh) * | 2020-06-18 | 2023-09-26 | 网易(杭州)网络有限公司 | 内存分配方法、装置、设备及存储介质 |
CN112000482A (zh) * | 2020-08-25 | 2020-11-27 | 北京金山云网络技术有限公司 | 一种内存管理的方法、装置、电子设备及存储介质 |
CN112000482B (zh) * | 2020-08-25 | 2024-03-05 | 北京金山云网络技术有限公司 | 一种内存管理的方法、装置、电子设备及存储介质 |
CN112463355A (zh) * | 2020-10-22 | 2021-03-09 | 北京航空航天大学 | 基于哈希的用户态内存申请固定缓存方法 |
WO2022213875A1 (zh) * | 2021-04-08 | 2022-10-13 | 华为技术有限公司 | 一种内存扩展方法以及相关设备 |
WO2023092997A1 (zh) * | 2021-11-23 | 2023-06-01 | 上海商汤智能科技有限公司 | 图像特征点选取方法及装置、设备、存储介质和程序产品 |
CN113867969A (zh) * | 2021-11-30 | 2021-12-31 | 深圳华云信息系统有限公司 | 一种内存分块方法、装置、电子设备及存储介质 |
CN116627359A (zh) * | 2023-07-24 | 2023-08-22 | 成都佰维存储科技有限公司 | 内存管理方法、装置、可读存储介质及电子设备 |
CN116627359B (zh) * | 2023-07-24 | 2023-11-14 | 成都佰维存储科技有限公司 | 内存管理方法、装置、可读存储介质及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109144712A (zh) | 内存池构建、内存分配方法及装置 | |
US20240104020A1 (en) | Methods and systems for handling data received by a state machine engine | |
US9934034B2 (en) | Instruction insertion in state machine engines | |
EP3825841A1 (en) | Method and device for parallel computation of a network model | |
US20220269645A1 (en) | Memory mat as a register file | |
US20170228232A1 (en) | Arithmetic and control unit, arithmetic and control method, program and parallel processor | |
US20080126739A1 (en) | Parallel Execution of Operations for a Partitioned Binary Radix Tree on a Parallel Computer | |
CN105468298B (zh) | 一种基于日志结构合并树的键值存储方法 | |
US11550512B2 (en) | Analytics, algorithm architecture, and data processing system and method | |
CN103092742A (zh) | 程序日志记录优化方法和系统 | |
CN110489407A (zh) | 数据补采方法、装置、计算机设备及存储介质 | |
CN108427728A (zh) | 元数据的管理方法、设备及计算机可读介质 | |
CN109408393A (zh) | 应用测试方法、装置及设备和计算机可读存储介质 | |
CN113313247B (zh) | 基于数据流架构的稀疏神经网络的运算方法 | |
CN104731907A (zh) | 基于nosql的数据存储方法 | |
CN109783283A (zh) | 一种硬件检测信息的处理方法、装置及终端设备 | |
WO2024060452A1 (zh) | 信号路径自动提取方法、系统、设备和存储介质 | |
CN110347613A (zh) | 多租户固态盘中实现raid的方法、控制器及多租户固态盘 | |
US11287996B2 (en) | Method, device and computer program product for storing data | |
CN114490302B (zh) | 一种基于大数据分析的威胁行为分析方法及服务器 | |
CN104054076A (zh) | 数据存储方法、数据库存储节点故障处理方法及装置 | |
CN108111390A (zh) | 联系人管理方法、设备及存储介质 | |
CN108287760A (zh) | 终端设备控制方法及装置、终端设备及计算机可读存储介质 | |
CN104598171B (zh) | 基于元数据的阵列重建方法及装置 | |
CN109739857A (zh) | 高并发下的数据分布式写入方法、装置、终端及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20190104 |
|
WD01 | Invention patent application deemed withdrawn after publication |