`
febird
  • 浏览: 254280 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

memory pool 的高效实现

    博客分类:
  • C++
 
阅读更多

memory pool

malloc可以分配任意大小的内存,因此,在malloc内部,保存了一些簿记信息(至少有一个包含内存块尺寸的信息)。调用free时,可以正确释放。

为了减少这些簿记开销,可以使用memory pool

根据使用情境,可以分为两种:

1. 只分配固定大小的内存块,速度最快(normal path10条机器指令)。

2. 可分配不同大小的内存块,速度稍慢,但比malloc快得多,也无簿记开销。

以下将分别说明

mpool

mpool可分配不同尺寸的内存。大多数时刻,都在内部分配。

销毁mpool时,会自动释放在mpool中未释放的内存。

mpool内部有一个包含多个不同尺寸fixed_mpoolarray,根据请求分配的内存大小,直接索引到相应的fixed_mpool来分配一个单元(cell)。

通过定义宏FEBIRD_MPOOL_ALLOW_BIG_BLOCK,就允许大于max_cell_size的内存分配。在这种情况下,使用标准的malloc分配内存,分配出去的内存有额外簿记(用双向链表串起来),以便在销毁mpool时自动释放。

mpool graph

 

fixed_mpool

尺寸固定的内存池,一旦创建,该内存池只能分配固定尺寸的内存单元(cell)。这在很多情况下都适用,例如链表结点、树节点、图结点、自定义的结构、等等。

用于stlmap/set/list再适合不过了——但是不能用于vector/deque等需要分配可变尺寸的容器。

fixed_mpool内部的多个chunk使用数组,类似std::vectoriNextChunk相当于vector.sizenChunks相当于vector.capacity,每次空间不够时扩张一倍。使用数组,而不是链表,有以下好处:

1. 有助于对齐——如果chunk_allocator是对齐(对齐>=32时)分配的,而chunk使用链表组织,就会在chunk开始处预留一个chunk头部,这会导致不对齐。

2. 如果cell_size也刚好较大且整除chunk_size,使用链表就会浪费将近一个cellcell_size – chunk_header_size)。

3. 如果不把连接信息保存在chunk header,就需要另外分配chunk结点,而分配chunk结点又需要其它内存分配函数。

空闲表使用单链表,因此,理论上每个cell最小必须能容纳一个指针,32位系统式4字节,64位系统式8字节,实现中使用8字节作为最小值。

0
0
分享到:
评论

相关推荐

    Memory Pool内存管理

    在标题“Memory Pool内存管理”中,我们关注的是如何有效地管理和使用内存资源,通过内存池来提高系统效率。 内存池的工作原理是预先一次性申请一大块连续的内存空间,然后将这块内存分割成若干个固定大小的小块,...

    C++内存池完整代码memory_pool.zip

    在"memory_pool.zip"这个压缩包中,我们可以预期包含了一个实现C++内存池的源码项目。"Makefile"是用于编译和构建项目的配置文件,它定义了如何将源代码文件编译成可执行程序或库。我们可以通过运行`make`命令来编译...

    linyanx-memory-pool-master.rar

    "linyanx-memory-pool-master"是一个针对Linux平台实现的内存池项目,它采用了SALB(Size-Aligned Local Block)思想,旨在提供一种高效且灵活的内存管理方案。 SALB思想的核心是将内存按照特定大小的块进行划分,...

    Fast Efficient Fixed-Sized Memory Pool

    固定大小内存池(Memory Pool)的核心思想是将内存分割成固定大小的块或区域(称为池),而不是使用通用的内存管理系统。这种策略对于需要快速分配和回收大量相同大小对象的场景,例如游戏引擎,具有显著的性能优势...

    Super-memory-pool.rar_super

    “Super memory pool”很可能是一个头文件或源代码文件,包含了内存池的实现,可能包括内存块的管理结构,分配和释放内存的函数等。“TestPrj.txt”则可能是测试项目的说明,指导用户如何构建和运行测试,以验证内存...

    C++ Memory Pool for Apache 2-开源

    内存池(Memory Pool)是一种优化内存分配策略的技术,它在Apache服务器中扮演着至关重要的角色。本文将深入探讨如何在C++编程环境中,利用内存池技术来提升Apache模块的性能。 内存池的基本原理是预先一次性分配一...

    Tomcat设置服务启动参数

    为了确保Tomcat能够高效稳定地运行,合理配置其启动参数至关重要,尤其是与内存相关的参数。本文将详细介绍如何在Tomcat中设置启动参数,并探讨这些参数的具体含义及其最佳实践。 #### 二、Tomcat启动参数概述 在...

    memory_pool

    在`memory_pool-main`这个项目中,我们可以推测它可能是一个简单的内存池实现,包含一个主函数`main`来演示如何使用内存池进行内存分配和释放。源代码可能会包含一个内存池类,提供分配、释放和初始化等方法。通过...

    MemoryPool 实用的例子程序

    在提供的文件列表中,我们看到有 `MemPoolMgr.cpp`、`MemPool.cpp`、`MemPoolMgr.h`、`MemPool.h` 这几个文件,这很可能是实现内存池的一个小型库。`MemPoolMgr` 可能是内存池管理器类,负责整体的内存管理和分配...

    一种Linux多线程应用下内存池的设计与实现.pdf

    Hongyang, "Design and Implementation of Memory Pool under Multi-thread of Linux", Journal of Computer Science and Technology, vol. 27, no. 4, pp. 741-752, 2012. [2] M. K. Singh, "Memory Pool: A ...

    ib_fmr_pool.rar_space

    标题中的"ib_fmr_pool.rar_space"暗示了我们讨论的主题是关于Linux内核的一个用户空间算法接口,特别是与IBM Foreign Memory Region(FMR)池相关的实现。在Linux系统中,Foreign Memory Regions允许用户空间程序...

    Memory Pools V1.2

    内存池(Memory Pool)是一种内存管理技术,常用于优化系统资源的分配与释放,提高程序运行效率。在软件开发中,尤其是系统级编程和嵌入式领域,内存池扮演着重要角色。Memory Pools V1.2 可能是这个内存池管理库的...

    tmem.zip_memory

    这个“tmem.zip_memory”压缩包包含的“tmem.c”源代码文件很可能是实现这种内存管理功能的一个关键部分。 Xen是一款开源的类型一(bare-metal)hypervisor,它允许在一个物理主机上同时运行多个操作系统实例,即...

    demo_of_xerces-c++_MemoryManagement

    Xerces-C++内存管理的核心是内存池(Memory Pool)机制。内存池是一种优化内存分配和释放的技术,它预先分配一大块连续的内存空间,并以固定大小的小块分发给请求者,从而避免了频繁的系统调用,提高了内存分配和...

    C 语言实现的内存池 mpool.c : 适用于Windows和Linux

    当C/C++程序频繁分配内存,或者管理很多大块内存的时候,我们就需要一个简洁高效的内存池(memory pool)。很多语言提供了这个基础设施,这里我提供一个C语言的版本mpool.c:原始的mpool仅仅提供Unix/Linux的版本,...

    malloc 内存管理内幕

    1. **内存池(Memory Pool)算法**:为了有效解决内存碎片问题,引入了Memory Pool算法。该算法通过预先分配一定数量的固定大小内存块,形成一个内存池。当用户申请内存时,直接从内存池中分配合适的内存块,而无需...

    C语言实现完整功能的内存池

    4. **内存池初始化和销毁**:`init_memory_pool`用于在程序启动时预分配内存,`destroy_memory_pool`在程序结束时释放所有内存。 5. **内存碎片问题**:为了达到“内存0碎片”的标准,内存池需要有策略地管理内存,...

    13、线程池ForkJoinPool实战及其工作原理分析(1).pdf

    - **实现方式**: 可以利用`ForkJoinPool`来实现多线程版本的归并排序。 - **代码示例**: ```java public class ParallelMergeSort { private final int[] arrayToSort; private final int threshold; public ...

    内存池源代码--在给定buffer上实现内存管理机制

    在压缩包文件"memory pool"中,可能包含了实现内存池的源代码示例,包括内存池结构体定义、内存分配和释放函数,以及相关管理算法的实现。通过分析和学习这些代码,可以更深入地理解内存池的工作机制,并在实际项目...

    Memory:Hoa \ Memory库

    1. **内存池(Memory Pool)**:内存池是一种优化策略,通过预先分配一大块内存,然后从中分配小块内存给程序使用,减少了频繁的内存申请和释放操作,从而降低系统开销。 2. **智能指针(Smart Pointers)**:类似...

Global site tag (gtag.js) - Google Analytics