CN111309289B - 一种内存池管理组件 - Google Patents

一种内存池管理组件 Download PDF

Info

Publication number
CN111309289B
CN111309289B CN201911133817.5A CN201911133817A CN111309289B CN 111309289 B CN111309289 B CN 111309289B CN 201911133817 A CN201911133817 A CN 201911133817A CN 111309289 B CN111309289 B CN 111309289B
Authority
CN
China
Prior art keywords
memory
pool
thread
space
memory pool
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201911133817.5A
Other languages
English (en)
Other versions
CN111309289A (zh
Inventor
张海荣
高鹏
李思昌
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Financial Futures Information Technology Co ltd
Original Assignee
Shanghai Financial Futures Information Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shanghai Financial Futures Information Technology Co ltd filed Critical Shanghai Financial Futures Information Technology Co ltd
Priority to CN201911133817.5A priority Critical patent/CN111309289B/zh
Publication of CN111309289A publication Critical patent/CN111309289A/zh
Application granted granted Critical
Publication of CN111309289B publication Critical patent/CN111309289B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation 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/5016Allocation 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation 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/5022Mechanisms to release resources
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/50Indexing scheme relating to G06F9/50
    • G06F2209/5011Pool
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/50Indexing scheme relating to G06F9/50
    • G06F2209/5018Thread allocation
    • YGENERAL 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
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE 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/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System (AREA)

Abstract

本发明公开了一种内存池管理组件,具备低延时、高并发的特点,并且能够支持水平扩展。其技术方案为:内存池管理组件包括单线程内存池、多线程内存池以及基于内存池的分配器,实现了低延时、高并发、可扩展的内存分配。一方面使用了内存局部存储技术,实现了可支持多线程高性能访问的块内存池,是相应金融软件实现的基础;另一方面实现了固定内存分配器,固定内存分配器支持内存池管理组件中的任意内存池,具有灵活、可扩展的特点,是相应内存数据库实现的基础。

Description

一种内存池管理组件
技术领域
本发明涉及内存管理技术,具体涉及支持水平扩展的低延时、高并发的内存池管理组件,尤其可应用于金融交易软件领域。
背景技术
金融交易软件通常伴随着频繁且大量的数据交互,因此内存的申请和释放操作十分频繁。传统的malloc/free和new/delete在堆上申请和释放内存都有一定的额外开销,默认的内存管理函数还考虑到多线程的应用,开销因而进一步增加。如果应用程序频繁地在堆上分配和释放内存,则会导致性能的损失,同时系统中会出现大量的内存碎片,降低内存的利用率。
因此,如何解决例如金融交易软件中的应用程序频繁分配和释放内存导致性能损失和内存利用率降低的问题,是目前业界亟需研究的课题。
发明内容
以下给出一个或多个方面的简要概述以提供对这些方面的基本理解。此概述不是所有构想到的方面的详尽综览,并且既非旨在指认出所有方面的关键性或决定性要素亦非试图界定任何或所有方面的范围。其唯一的目的是要以简化形式给出一个或多个方面的一些概念以为稍后给出的更加详细的描述之序。
本发明的目的在于解决上述问题,提供了一种内存池管理组件,具备低延时、高并发的特点,并且能够支持水平扩展。
本发明的技术方案为:本发明揭示了一种内存池管理组件,其中,包括单线程内存池、多线程内存池、和基于内存池的分配器,基于内存池的分配器进一步包括系统内存分配模块和固定内存分配器,其中:
单线程内存池,用于申请至少一个整块内存空间并为应用程序分配指定大小的内存块,其中每一个内存空间在其整个生命周期中只被单一一个线程所使用,其中单线程内存池在存续期间不会释放内存空间,优先在所申请的内存空间中做内存块的分配和释放操作;
多线程内存池,用于为不同的线程申请对应的不同的内存空间,其中每一个内存空间归属于一个独立的线程,不同线程之间的内存访问相互独立,当一个线程有内存申请操作时,优先在线程归属的内存池中分配和释放;
系统内存分配模块,预先一次性申请一内存空间作为单线程内存池或多线程内存池并在内存池大小需要动态扩展时调用,且为该内存池定义分配和释放内存块的成员函数;
固定内存分配器,对单线程内存池或多线程内存池内的内存空间进行二次分配,采用固定大小的内存单元,应用程序采用指定的编号,在无需内存地址指针的情况下通过固定内存分配器对外提供的接口直接访问对应的内存地址。
根据本发明的内存池管理组件的一实施例,单线程内存池中的所有内存空间分为当前内存、空闲内存和已分配的内存,其中当前内存是单线程内存池最近一次向应用程序分配内存所使用的内存空间,空闲内存是已被单线程内存池释放的内存空间,其余的内存空间都是已分配的内存。
根据本发明的内存池管理组件的一实施例,单线程内存池中的每一个内存空间包含一个引用计数和多个内存块,其中引用计数位于内存空间的头部,引用计数的数值是对应内存空间实际为应用程序分配的内存块的数量,每一内存块包含头指针和数据域,所有内存块的头指针均指向当前内存空间的头部且用于释放内存块时更新引用计数的数值。
根据本发明的内存池管理组件的一实施例,单线程内存池配置为当创建单线程内存池时不申请内存空间,设置当前内存为空NULL,标记可用内存起始位置的已使用空间为0。
根据本发明的内存池管理组件的一实施例,单线程内存池配置为当应用程序首次向单线程内存池申请内存分配时,单线程内存池首先申请一块连续的内存空间,其中当前内存的指针指向申请得到的内存空间的起始地址,已分配内存大小为内存块的头指针大小与所申请的内存空间大小之和,即第一个内存块的大小;
当前内存空间的头部所维护的引用计数随着内存分配次数递增,为每次内存申请分配的内存块的头指针指向当前内存的起始地址,用于后续管理引用计数,单线程内存池返回给应用程序的地址为内存块的数据域的起始地址,后续的内存分配根据已使用空间大小在剩余空间中连续分配,其中当剩余空间不足以分配所需内存大小时,单线程内存池优先将之前已申请但已不使用的空闲内存分配给应用程序,若不存在空闲内存,单线程内存池则重新申请内存,且当前内存随之转移到新申请的内存中。
根据本发明的内存池管理组件的一实施例,单线程内存池配置为当首次申请得到的内存释放后,单线程内存池根据应用程序传入的地址找到内存块的头指针,根据头指针修改引用计数,引用计数随着应用程序每次调用内存释放操作递减,此时已分配内存大小0,单线程内存池不会将当前内存加入到空闲内存表中,后续应用程序向单线程内存池申请内存分配时将从该当前内存开始分配内存。
根据本发明的内存池管理组件的一实施例,多线程内存池所使用的线程局部存储技术为每一个线程分配独立的线程局部数据域,线程局部数据域通过全局保存且唯一的线程数据存储键绑定。
根据本发明的内存池管理组件的一实施例,多线程内存池配置为当应用程序首次向多线程内存池申请内存分配时,多线程内存池为当前线程分配了一个线程局部数据,多线程内存池申请内存空间时通过加锁操作以保证线程安全,应用程序向多线程内存池申请分配内存时,多线程内存池首先寻找该应用程序线程所对应的线程局部数据域,若不存在则为当前线程重新分配内存空间。
根据本发明的内存池管理组件的一实施例,多线程内存池配置为当首次申请得到的内存释放后,线程通过所分配的地址释放对应的内存块,引用计数随着内存释放的操作递减,其中当引用计数降低至0时,若释放与申请内存的操作由同一线程发起,则用于标记可分配内存起始地址的使用空间被重置为0。
根据本发明的内存池管理组件的一实施例,固定内存分配器每次向所依赖的内存池所申请的内存空间为一内存大块,每个内存大块的地址使用数组容器保存在固定内存分配器中,一个内存大块包含一个用于记录内存块使用信息的位图以及一系列固定大小的内存块,每个内存块包含有指向下一个空闲内存地址的指针域以及该内存块保存的数据,固定内存分配器使用头指针保存当前空闲内存的头地址,分配与释放内存时修改对应内存块的指针域以维护内存块之间的链式关系。
根据本发明的内存池管理组件的一实施例,固定内存分配器配置为当应用程序向固定内存分配器申请分配内存时,固定内存分配器将向所依赖的内存池中申请分配一内存块,其大小为位图所占空间以及指定数量且格式化大小的内存单元所占空间之和,位图中将已分配的内存单元对应的标识位置设置为1,固定内存分配器将头指针指向的地址分配给应用程序,头指针向后移动一个节点。
根据本发明的内存池管理组件的一实施例,固定内存分配器配置为当应用程序释放向固定内存分配器申请的内存时,固定内存分配器维护的分配计数递减,位图中将已释放的内存单元对应的标识位置设置为0,释放后的内存单元被重新连接到链表的头部,固定内存分配器的头指针指向释放的内存,其中当整个固定内存分配器析构时,固定内存分配器将向所依赖的内存池释放所有已申请的内存。
本发明对比现有技术有如下的有益效果:本发明的内存池管理组件包括单线程内存池和多线程内存池以及基于内存池的分配器,实现了低延时、高并发、可扩展的内存分配。一方面使用了内存局部存储技术,实现了可支持多线程高性能访问的块内存池,是相应金融软件实现的基础;另一方面实现了固定内存分配器,固定内存分配器支持本发明内存池管理组件中的任意内存池,具有灵活、可扩展的特点,是相应内存数据库实现的基础。
附图说明
在结合以下附图阅读本公开的实施例的详细描述之后,能够更好地理解本发明的上述特征和优点。在附图中,各组件不一定是按比例绘制,并且具有类似的相关特性或特征的组件可能具有相同或相近的附图标记。
图1示出了本发明的内存池管理组件的一实施例中的单线程内存池的结构示意图。
图2示出了本发明的单线程内存池构建后的状态的示意图。
图3示出了应用程序首次向单线程内存池申请内存分配(alloc)时的单线程内存池的状态示意图。
图4示出了应用程序将首次申请得到的内存释放(free)后的单线程内存池的状态示意图。
图5示出了本发明的内存池管理组件的一实施例中的多线程内存池的结构示意图。
图6示出了多线程内存池创建时的状态示意图。
图7示出了应用程序首次向系统申请内存分配后的多线程内存池的状态示意图。
图8示出了应用程序释放(free)首次申请的内存后的多线程内存池的状态示意图。
图9示出了本发明的内存池管理组件的一实施例中的固定内存分配器的结构示意图。
图10示出了固定内存分配器初始化完成时的状态示意图。
图11示出了固定内存分配器首次向应用程序分配一个单元的内存后的固定内存分配器的状态示意图。
图12示出了应用程序释放向固定内存分配器申请的内存后的固定内存分配器的状态示意图。
图13示出了本发明的内存池管理组件的一实施例的原理。
具体实施方式
以下结合附图和具体实施例对本发明作详细描述。注意,以下结合附图和具体实施例描述的诸方面仅是示例性的,而不应被理解为对本发明的保护范围进行任何限制。
图13示出了本发明的内存池管理组件的一实施例的原理,请参见图13,本实施例的内存池管理组件包括:单线程内存池、多线程内存池以及基于内存池的分配器。其中基于内存池的分配器包块系统内存分配模块(例如通过C++函数来实现)和固定内存分配器。
单线程内存池(block memory pool)用于向系统申请至少一个整块内存空间并为应用程序分配指定大小的内存块(block),其中每一内存空间在其整个生命周期中只被一个线程使用。
由于单线程内存池中的内存空间在其整个生命周期只被一个线程使用,因而不需要考虑互斥访问的问题,这种内存池性能更好。
单线程内存池的结构如图1所示,图1中的每块内存(memory)表示单线程内存池向系统申请的整块内存。内存可大致分为三类:内存池最近一次向应用程序分配内存所使用的内存空间称为当前内存(current memory),已被内存池释放的内存空间称为空闲内存(empty memory),其余是已分配的内存(used memory)。
每块内存空间的大小为10M(10M仅为示例)与内存头部记录的引用计数长度之和。每块内存包含一个引用计数(reference count)及若干个内存块(block),引用计数位于每块内存空间的头部(block mem pool head),其值大小等于对应内存空间后面实际为应用程序分配的内存块的数量。每个内存块又包含有头指针(head)和数据域(data),所有内存块的头指针都指向当前整块内存空间的头部,用于释放内存块时更新引用计数。
图2表示单线程内存池构建后的状态,单线程内存池创建时并不会向系统申请内存,此时当前内存为NULL,标记可用内存起始位置的已使用空间(used size)为0。
图3表示应用程序首次向单线程内存池申请内存块分配(alloc)时内存池的状态。应用程序调用内存块分配(alloc)函数后,单线程内存池首先向系统申请一块大小为最大块尺寸(10M)与内存头(pool head)所占空间之和的连续的内存空间,当前内存的指针(cur_mem)指向申请得到的该连续的内存空间的起始地址,此时已分配内存大小为块头指针(block head)大小与所申请的内存空间大小(alloc size)之和,也即第一个内存块(block 1)的大小。
当前内存空间的头部维护的引用计数随着内存分配次数递增,为每次内存申请分配的内存块的头指针指向当前内存的起始地址,用于后续管理引用计数。单线程内存池返回给应用程序的地址为内存块的数据域起始地址(block data),后续的内存分配可以根据已使用空间大小在剩余空间(unallocated space)连续分配。当剩余空间不足以分配所需内存大小时,单线程内存池会优先将之前已申请但已无使用的空闲内存(empty memory)分配给应用程序,若不存在空闲内存,单线程内存池将向系统重新申请内存,当前内存随之转移到新申请的内存中。
图4为应用程序将首次申请得到的内存块释放(free)后的单线程内存池的状态。单线程内存池根据应用程序传入的地址找到内存块的头指针,根据头指针修改引用计数,引用计数随着应用程序每次调用free操作递减,此时已分配内存大小为0。由于是当前内存,单线程内存池不会将该内存加入到空闲内存表中,后续应用程序调用内存块分配(alloc)函数以向单线程内存池申请内存分配时将从该内存开始分配内存。
本发明的单线程内存池的特点是每次向系统申请固定大小的内存,单线程内存池在存续期间不会释放内存,而是优先在申请的内存空间内做内存分配及释放操作。单线程内存池销毁时也只会释放空闲内存及引用计数为零的当前内存,不会释放已分配的内存。
多线程内存池有可能被多个线程共享,因此则需要在每次分配和释放内存时加锁,这种内存池使用更加广泛。多线程内存池用于为不同的线程申请对应的不同的内存空间,其中每一个内存空间归属于一个独立的线程,不同线程之间的内存访问相互独立,当一个线程有内存申请操作时,优先在线程归属的内存池中分配和释放。
本发明内存池组件中的多线程内存池在组件内部称为md mem pool,当只存在一个应用程序线程时这种内存池与前文所述的单线程内存池类似,区别在于多线程内存池引入了线程局部存储(TLS)技术,同时支持多线程访问,具有高并发的特点。
线程局部存储(Thread Local Storage,TLS),是一种用于将数据与一个正在执行的指定线程关联起来的技术。一般而言,进程中的全局变量与函数内定义的静态(static)变量,被各个线程共享,一个线程对其进行修改,所有线程都将受到影响,这就引发了线程安全问题。如果使用线程同步,就会产生大量的额外开销,同步代码的复杂性也使维护变得困难。
在一个线程内部的各个函数调用都能访问,但其它线程不能访问的变量称为线程局部静态变量,它的实现机制就是TLS。TLS通过建立一个全局表,使用当前线程ID去查询相应的数据,每个线程都维护有自己独立的数据备份。在linux中,pthread库就有实现这种机制的接口,包括pthread_key_create,pthread_key_delete,pthread_getspecific,pthread_setspecific。本发明内存池组件使用的TLS技术就是对pthread库的进一步封装。
基于以上原理,本发明的多线程内存池的结构如图5所示,
如图5所示,多线程内存池使用线程局部存储技术,为每一个线程(thread)分配独立的线程局部数据域(thread local data),该线程局部数据域通过全局保存且唯一的线程数据存储键(thread local key)绑定。每个线程局部数据域的结构与单线程的线程池基本相同,线程池对用户内存分配与释放的处理也基本相同。多线程内存池在每块内存空间的头部(block mem pool head)还保存了线程号(thread id),用于释放内存的相关操作。
图6表示多线程内存池创建时的状态,多线程内存池首先维护了用于线程数据存储键(thread local key),应用程序调用内存块分配(alloc)函数进行内存分配前,多线程池不会向系统申请空间。
图7表示应用程序首次向系统申请内存分配后的多线程内存池的状态,多线程内存池为当前线程分配了一个线程局部数据(thread local data),由于不存在空闲内存,多线程内存池向系统申请了大小为10M与内存头部所占空间之和的内存。线程局部数据中的当前内存指针(curr_mem)指向刚创建的内存,引用计数与内存块(block)的其它操作与单线程内存池基本相同。多线程内存池向系统申请内存空间时加锁以保证线程安全。应用程序向多线程内存池申请分配内存时,多线程内存池会首先寻找该应用程序线程对应的线程局部数据域,若不存在则为当前线程重新分配内存空间。
图8为应用程序释放(free)首次申请的内存后线程池的状态。虽然多线程内存池在应用程序申请内存时为每个线程分配独立的内存,但其它线程也可以通过分配的地址释放对应的内存块。引用计数随着内存释放的操作递减,当引用计数降低至0时,若释放与申请的操作由同一线程发起,用于标记可分配内存起始地址的使用空间(used size)也被重置为0。
本发明的多线程内存池的特点是使用内存局部存储技术实现了并发访问,与系统内存分配函数不同的是,多线程内存池只需要在内存不足时才需要加锁并向系统申请内存,其余时间无需多余的线程同步操作,保证了多线程使用时的性能。
从内存单元大小角度可以分为一下两类:
1.固定内存池:应用程序每次从内存池中分配出来的内存单元大小事先确定,是固定不变的。固定内存池维护简单,性能更高。
2.可变内存池:每次从内存池中分配出来的内存单元大小可以按需变化。
基于内存池的分配器包括系统内存分配模块和固定内存分配器。
系统内存分配模块例如通过C++函数来实现,用于预先一次性申请适当大小的内存作为一个单线程内存池或多线程内存池,并为这个内存池类或结构体定义一些分配和释放内存块的成员函数,之后应用程序自己对内存的分配和释放则可以通过这个内存池类及其成员函数来完成。只有当内存池大小需要动态扩展时,才需要再调用系统内存分配模块,其它时间对内存的操作都不需要调用系统内存分配模块。
固定内存分配器用于对组件内的单线程内存池或多线程内存池中的内存空间进行二次分配。固定内存分配器本身并不直接向系统申请内存,而是借用其依赖的内存池申请内存。
固定内存分配器的结构示意图如图9所示,固定内存分配器每次向所依赖的内存池申请的内存空间称为一个内存大块(chunk),每个chunk的地址使用数组容器保存在固定内存分配器中。一个chunk包含一个记录内存块(block)使用信息的位图(bitmap)以及一系列固定大小的内存块。固定内存固定内存分配器可以支持指定大小的内存单元,但在使用时会对单元大小(unit size)按8个字节对齐。每个内存块包含有指向下一个空闲内存地址的指针域(next)以及该块保存的数据(data)。固定内存分配器使用一个头指针(mem head)保存当前空闲内存的头地址,分配与释放内存时修改对应内存块的next指针以维护内存块之间的链式关系。
图10表示固定内存分配器初始化完成时的状态,固定内存分配器根据构造参数向依赖的内存池申请一块内存,其大小为内存单元大小(mem unit size)与最大单元数量的乘积及位图大小之和。内存申请完后构建单元的链表关系,每个节点的next指针都指向下一节点,固定内存分配器的内存头指针(mem head)指向第一个内存单元的起始地址。
图11表示固定内存分配器首次向应用程序分配一个单元的内存后的固定内存分配器的状态。应用程序向固定内存分配器申请分配内存时,固定内存分配器将向所依赖的内存池申请分配一块内存,其大小为位图所占空间以及指定数量且格式化大小的内存单元所占空间之和,位图中将已分配的内存单元对应的标识位置设置为1,固定内存分配器将原标识可用内存起始地址的头指针(mem head)指向的地址分配给应用程序,头指针向后移动一个节点。
图12表示应用程序释放向固定内存分配器申请的内存后的固定内存分配器的状态。固定内存分配器维护的分配计数递减,位图中将已释放的内存单元对应的标识位置设置为0,释放后的内存单元被重新连接到链表的头部,固定内存分配器头指针指向归还的内存。整个固定内存分配器析构时,固定内存分配器将向所依赖的内存池释放所有已申请的内存。
固定内存分配器的特点是采用了固定大小的内存单元,它对外提供了get接口,可以通过指定的编号(id)直接访问对应的内存地址,无需该地址的指针。此外,固定内存分配器还提供了遍历接口,以访问固定内存分配器保存的所有对象。固定内存分配器是实现高性能内存数据库的基础。
总的来说,本发明的内存池管理组件,覆盖了金融软件领域的各种使用场景,具有低延时(内存池技术相对于系统内存分配实现了性能大幅提升)、高并发(提供了线程安全的内存池,使用线程局部存储技术,同时支持多线程的使用)以及支持水平扩展(实现了一种固定内存分配器,可在使用时灵活指定其依赖的内存池类型)的特点。
尽管为使解释简单化将上述方法图示并描述为一系列动作,但是应理解并领会,这些方法不受动作的次序所限,因为根据一个或多个实施例,一些动作可按不同次序发生和/或与来自本文中图示和描述或本文中未图示和描述但本领域技术人员可以理解的其他动作并发地发生。
本领域技术人员将进一步领会,结合本文中所公开的实施例来描述的各种解说性逻辑板块、模块、电路、和算法步骤可实现为电子硬件、计算机软件、或这两者的组合。为清楚地解说硬件与软件的这一可互换性,各种解说性组件、框、模块、电路、和步骤在上面是以其功能性的形式作一般化描述的。此类功能性是被实现为硬件还是软件取决于具体应用和施加于整体系统的设计约束。技术人员对于每种特定应用可用不同的方式来实现所描述的功能性,但这样的实现决策不应被解读成导致脱离了本发明的范围。
结合本文所公开的实施例描述的各种解说性逻辑板块、模块、和电路可用通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或其它可编程逻辑器件、分立的门或晶体管逻辑、分立的硬件组件、或其设计成执行本文所描述功能的任何组合来实现或执行。通用处理器可以是微处理器,但在替换方案中,该处理器可以是任何常规的处理器、控制器、微控制器、或状态机。处理器还可以被实现为计算设备的组合,例如DSP与微处理器的组合、多个微处理器、与DSP核心协作的一个或多个微处理器、或任何其他此类配置。
结合本文中公开的实施例描述的方法或算法的步骤可直接在硬件中、在由处理器执行的软件模块中、或在这两者的组合中体现。软件模块可驻留在RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可移动盘、CD-ROM、或本领域中所知的任何其他形式的存储介质中。示例性存储介质耦合到处理器以使得该处理器能从/向该存储介质读取和写入信息。在替换方案中,存储介质可以被整合到处理器。处理器和存储介质可驻留在ASIC中。ASIC可驻留在用户终端中。在替换方案中,处理器和存储介质可作为分立组件驻留在用户终端中。
在一个或多个示例性实施例中,所描述的功能可在硬件、软件、固件或其任何组合中实现。如果在软件中实现为计算机程序产品,则各功能可以作为一条或更多条指令或代码存储在计算机可读介质上或藉其进行传送。计算机可读介质包括计算机存储介质和通信介质两者,其包括促成计算机程序从一地向另一地转移的任何介质。存储介质可以是能被计算机访问的任何可用介质。作为示例而非限定,这样的计算机可读介质可包括RAM、ROM、EEPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁存储设备、或能被用来携带或存储指令或数据结构形式的合意程序代码且能被计算机访问的任何其它介质。任何连接也被正当地称为计算机可读介质。例如,如果软件是使用同轴电缆、光纤电缆、双绞线、数字订户线(DSL)、或诸如红外、无线电、以及微波之类的无线技术从web网站、服务器、或其它远程源传送而来,则该同轴电缆、光纤电缆、双绞线、DSL、或诸如红外、无线电、以及微波之类的无线技术就被包括在介质的定义之中。如本文中所使用的盘(disk)和碟(disc)包括压缩碟(CD)、激光碟、光碟、数字多用碟(DVD)、软盘和蓝光碟,其中盘(disk)往往以磁的方式再现数据,而碟(disc)用激光以光学方式再现数据。上述的组合也应被包括在计算机可读介质的范围内。
提供对本公开的先前描述是为使得本领域任何技术人员皆能够制作或使用本公开。对本公开的各种修改对本领域技术人员来说都将是显而易见的,且本文中所定义的普适原理可被应用到其他变体而不会脱离本公开的精神或范围。由此,本公开并非旨在被限定于本文中所描述的示例和设计,而是应被授予与本文中所公开的原理和新颖性特征相一致的最广范围。

Claims (12)

1.一种内存池管理组件,其特征在于,包括单线程内存池、多线程内存池、和基于内存池的分配器,基于内存池的分配器进一步包括系统内存分配模块和固定内存分配器,其中:
单线程内存池,用于申请至少一个整块内存空间并为应用程序分配指定大小的内存块,其中每一个内存空间在其整个生命周期中只被单一一个线程所使用,其中单线程内存池在存续期间不会释放内存空间,优先在所申请的内存空间中做内存块的分配和释放操作;
多线程内存池,用于为不同的线程申请对应的不同的内存空间,其中每一个内存空间归属于一个独立的线程,不同线程之间的内存访问相互独立,当一个线程有内存申请操作时,优先在线程归属的内存池中分配和释放;
系统内存分配模块,预先一次性申请一内存空间作为单线程内存池或多线程内存池并在内存池大小需要动态扩展时调用,且为该内存池定义分配和释放内存块的成员函数;
固定内存分配器,对单线程内存池或多线程内存池内的内存空间进行二次分配,采用固定大小的内存单元,应用程序采用指定的编号,在无需内存地址指针的情况下通过固定内存分配器对外提供的接口直接访问对应的内存地址。
2.根据权利要求1所述的内存池管理组件,其特征在于,单线程内存池中的所有内存空间分为当前内存、空闲内存和已分配的内存,其中当前内存是单线程内存池最近一次向应用程序分配内存所使用的内存空间,空闲内存是已被单线程内存池释放的内存空间,其余的内存空间都是已分配的内存。
3.根据权利要求2所述的内存池管理组件,其特征在于,单线程内存池中的每一个内存空间包含一个引用计数和多个内存块,其中引用计数位于内存空间的头部,引用计数的数值是对应内存空间实际为应用程序分配的内存块的数量,每一内存块包含头指针和数据域,所有内存块的头指针均指向当前内存空间的头部且用于释放内存块时更新引用计数的数值。
4.根据权利要求3所述的内存池管理组件,其特征在于,单线程内存池配置为当创建单线程内存池时不申请内存空间,设置当前内存为空NULL,标记可用内存起始位置的已使用空间为0。
5.根据权利要求4所述的内存池管理组件,其特征在于,单线程内存池配置为当应用程序首次向单线程内存池申请内存分配时,单线程内存池首先申请一块连续的内存空间,其中当前内存的指针指向申请得到的内存空间的起始地址,已分配内存大小为内存块的头指针大小与所申请的内存空间大小之和,即第一个内存块的大小;
当前内存空间的头部所维护的引用计数随着内存分配次数递增,为每次内存申请分配的内存块的头指针指向当前内存的起始地址,用于后续管理引用计数,单线程内存池返回给应用程序的地址为内存块的数据域的起始地址,后续的内存分配根据已使用空间大小在剩余空间中连续分配,其中当剩余空间不足以分配所需内存大小时,单线程内存池优先将之前已申请但已不使用的空闲内存分配给应用程序,若不存在空闲内存,单线程内存池则重新申请内存,且当前内存随之转移到新申请的内存中。
6.根据权利要求5所述的内存池管理组件,其特征在于,单线程内存池配置为当首次申请得到的内存释放后,单线程内存池根据应用程序传入的地址找到内存块的头指针,根据头指针修改引用计数,引用计数随着应用程序每次调用内存释放操作递减,此时已分配内存大小0,单线程内存池不会将当前内存加入到空闲内存表中,后续应用程序向单线程内存池申请内存分配时将从该当前内存开始分配内存。
7.根据权利要求6所述的内存池管理组件,其特征在于,多线程内存池所使用的线程局部存储技术为每一个线程分配独立的线程局部数据域,线程局部数据域通过全局保存且唯一的线程数据存储键绑定。
8.根据权利要求7所述的内存池管理组件,其特征在于,多线程内存池配置为当应用程序首次向多线程内存池申请内存分配时,多线程内存池为当前线程分配了一个线程局部数据,多线程内存池申请内存空间时通过加锁操作以保证线程安全,应用程序向多线程内存池申请分配内存时,多线程内存池首先寻找该应用程序线程所对应的线程局部数据域,若不存在则为当前线程重新分配内存空间。
9.根据权利要求8所述的内存池管理组件,其特征在于,多线程内存池配置为当首次申请得到的内存释放后,线程通过所分配的地址释放对应的内存块,引用计数随着内存释放的操作递减,其中当引用计数降低至0时,若释放与申请内存的操作由同一线程发起,则用于标记可分配内存起始地址的使用空间被重置为0。
10.根据权利要求9所述的内存池管理组件,其特征在于,固定内存分配器每次向所依赖的内存池所申请的内存空间为一内存大块,每个内存大块的地址使用数组容器保存在固定内存分配器中,一个内存大块包含一个用于记录内存块使用信息的位图以及一系列固定大小的内存块,每个内存块包含有指向下一个空闲内存地址的指针域以及该内存块保存的数据,固定内存分配器使用头指针保存当前空闲内存的头地址,分配与释放内存时修改对应内存块的指针域以维护内存块之间的链式关系。
11.根据权利要求10所述的内存池管理组件,其特征在于,固定内存分配器配置为当应用程序向固定内存分配器申请分配内存时,固定内存分配器将向所依赖的内存池中申请分配一内存块,其大小为位图所占空间以及指定数量且格式化大小的内存单元所占空间之和,位图中将已分配的内存单元对应的标识位置设置为1,固定内存分配器将头指针指向的地址分配给应用程序,头指针向后移动一个节点。
12.根据权利要求11所述的内存池管理组件,其特征在于,固定内存分配器配置为当应用程序释放向固定内存分配器申请的内存时,固定内存分配器维护的分配计数递减,位图中将已释放的内存单元对应的标识位置设置为0,释放后的内存单元被重新连接到链表的头部,固定内存分配器的头指针指向释放的内存,其中当整个固定内存分配器析构时,固定内存分配器将向所依赖的内存池释放所有已申请的内存。
CN201911133817.5A 2019-11-19 2019-11-19 一种内存池管理组件 Active CN111309289B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911133817.5A CN111309289B (zh) 2019-11-19 2019-11-19 一种内存池管理组件

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911133817.5A CN111309289B (zh) 2019-11-19 2019-11-19 一种内存池管理组件

Publications (2)

Publication Number Publication Date
CN111309289A CN111309289A (zh) 2020-06-19
CN111309289B true CN111309289B (zh) 2023-04-25

Family

ID=71152465

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911133817.5A Active CN111309289B (zh) 2019-11-19 2019-11-19 一种内存池管理组件

Country Status (1)

Country Link
CN (1) CN111309289B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112100089B (zh) * 2020-07-30 2023-08-01 重庆兰德适普信息科技有限公司 内存管理方法
CN112380017B (zh) * 2020-11-30 2024-04-09 成都虚谷伟业科技有限公司 一种基于松散内存释放的内存管理系统
CN113032156B (zh) * 2021-05-25 2021-10-15 北京金山云网络技术有限公司 内存分配方法和装置、电子设备和存储介质
CN114489592A (zh) * 2021-12-24 2022-05-13 杭州加速科技有限公司 一种内存管理库的实现方法及内存模型
CN115729716B (zh) * 2023-01-10 2023-05-09 云和恩墨(北京)信息技术有限公司 多线程内存管理方法及系统、计算机设备、存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101799773A (zh) * 2010-04-07 2010-08-11 福州福昕软件开发有限公司 并行计算的内存访问方法
CN108132842A (zh) * 2017-12-15 2018-06-08 天津津航计算技术研究所 一种嵌入式软件内存管理系统
CN109460302A (zh) * 2017-05-05 2019-03-12 第四范式(北京)技术有限公司 用于数据流式计算的内存管理系统及其方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6820183B2 (en) * 2001-01-05 2004-11-16 International Business Machines Corporation Methods, systems, and computer program products for memory pool management using variable size sub-pools

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101799773A (zh) * 2010-04-07 2010-08-11 福州福昕软件开发有限公司 并行计算的内存访问方法
CN109460302A (zh) * 2017-05-05 2019-03-12 第四范式(北京)技术有限公司 用于数据流式计算的内存管理系统及其方法
CN108132842A (zh) * 2017-12-15 2018-06-08 天津津航计算技术研究所 一种嵌入式软件内存管理系统

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
刘娟 ; 唐玄 ; .一种跨平台内存池的设计与实现.蚌埠学院学报.2017,(第02期),全文. *
许健 ; 于鸿洋 ; .一种Linux多线程应用下内存池的设计与实现.电子技术应用.2012,(第11期),全文. *

Also Published As

Publication number Publication date
CN111309289A (zh) 2020-06-19

Similar Documents

Publication Publication Date Title
CN111309289B (zh) 一种内存池管理组件
US9355028B2 (en) Data-storage device and flash memory control method
US10747673B2 (en) System and method for facilitating cluster-level cache and memory space
EP2985702B1 (en) Data processing method and device, and computer system
US20110246742A1 (en) Memory pooling in segmented memory architecture
US7673105B2 (en) Managing memory pages
US20120079212A1 (en) Architecture for sharing caches among multiple processes
CN103577345A (zh) 提高由多个系统共享的存储高速缓存灵活性的方法和结构
CN111240588B (zh) 一种持久性内存对象存储系统
WO2017050064A1 (zh) 共享内存数据库的内存管理方法及装置
CN107408132B (zh) 跨越多个类型的存储器移动分层数据对象的方法和系统
JP2011191835A (ja) 計算機システムおよびアプリケーションプログラムの実行方法
Iwabuchi et al. Metall: A persistent memory allocator enabling graph processing
US20130318086A1 (en) Distributed file hierarchy management in a clustered redirect-on-write file system
US20220129174A1 (en) Method, device and computer program product for storage management
CN102541982A (zh) 一种组织和访问元数据文件日志的方法
US10282371B1 (en) Object storage device with probabilistic data structure
US10877881B2 (en) In-place garbage collection of a sharded, replicated distributed state machine based on mergeable operations
US11055184B2 (en) In-place garbage collection of a sharded, replicated distributed state machine based on supersedable operations
US20110252070A1 (en) System and Method for Appending Metadata to Objects
CN106293510B (zh) 一种面向多虚拟存储系统的数据共享方法及系统
KR20120082176A (ko) 데이터베이스 관리 시스템의 데이터 처리 방법 및 시스템
US6691121B1 (en) Method and apparatus for online and dynamic extension of IMS data entry databases
CN116257359A (zh) 数据处理方法及装置、存储介质及电子设备
CN114327769B (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
GR01 Patent grant
GR01 Patent grant