极高效内存池实现 (cpu-cache)

1.内存池的目的

  提高程序的效率

  减少运行时间

  避免内存碎片

2.原理

  要解决上述两个问题,最好的方法就是内存池技术。具体方法就是,申请内存 :大小固定,提前申请,重复利用。

3.使用场合

  长时间运行的服务程序

  对速度要求高的程序

  对稳定性要求高的程序

4.内存池不能满足所有的需求

  内存池是不能够满足所有人的需求的,那么考虑到通用性,健壮性,需要考虑到,当申请内存块 大小不在内存池 中的情况

或者内存池中已经没有内存块了,所采取的措施:直接使用系统的申请,释放函数。

内存池的设计 :

  内存池中有很多内存块,内存池中有很多链表,每一个链表中存储一种固定大小的内存块,例如128字节链表中存储的是大小都为

128字节的内存块,依次类推,内存池中维护了很多个这样的链表。

  这里我们要解决的第一个问题是,当我们申请内存是,首先要找到对应大小的链表,如果设计可以避免这个查找过程。

      从内存链表中申请内存过程中,不需要查找,直接返回可用内存(链表可轻松实现)

解释释放内存的时候,如何快速的把内存块放回到对应的链表中

下面针对上述问题做依次设计:

首先在数据结构上进行申请的研究:

为了能满足上面的申请,释放可以快读定位到链表,我们需要维护额外的数据结构才可以达到目标,思路如下:

在申请内存的时候需要多申请一部分作为系统使用,系统使用的内存结构中,包含了该内存块所属的内存链表指针,这样就可以

快速度的释放内存。

有了这个特殊的结构设计以后,我们就可以不通过查找定位到内存上。

看下面的图:

首先考虑我们申请内存的过程:

char* p = new char[100];

实际上我们给出的输入数据就是 100个字节的数据,如果我可以 MemeoryList* p = _listIndex[100];

这样就可以直接的定位到对应的链表了。

如何结合 CPU-cache实现更加高度的内存池呢 ?

点击这里观看视频

时间: 2024-10-25 01:44:18

极高效内存池实现 (cpu-cache)的相关文章

一种高效快速的内存池实现(附源码)

此算法灵感来自于apache内存池实现原理,不过读者如果没有看过apache内存池实现也无关系,因为本算法相对apache内存池算法更为简单而且易懂,个人认为某些场合也更为高效,或许真正到了apache服务器上性能不如,但是这套设计思想应该还是可以借鉴到更多场合的. 我们在调用malloc函数时,操作系统内部会查找一个所谓的空闲链表,当找到足够大的空闲空间时会将内存分割并返回一部分会用户,当然在很大的项目里面有可能会出现链表所有节点都找不到空闲空间的情形,此时操作系统便会不断搜索内存碎片,然后组

【源码剖析】MemoryPool —— 简单高效的内存池 allocator 实现

什么是内存池?什么是 C++ 的 allocator? 内存池简单说,是为了减少频繁使用 malloc/free new/delete 等系统调用而造成的性能损耗而设计的.当我们的程序需要频繁地申请和释放内存时,频繁地使用内存管理的系统调用可能会造成性能的瓶颈,嗯,是可能,毕竟操作系统的设计也不是盖的(麻麻说把话说太满会被打脸的(⊙v⊙)).内存池的思想是申请较大的一块内存(不够时继续申请),之后把内存管理放在应用层执行,减少系统调用的开销. 那么,allocator 呢?它默默的工作在 C++

关于CPU Cache:程序猿需要知道的那些

天下没有免费的午餐,本文转载于:http://cenalulu.github.io/linux/all-about-cpu-cache/ 先来看一张本文所有概念的一个思维导图: 为什么要有CPU Cache 随着工艺的提升最近几十年CPU的频率不断提升,而受制于制造工艺和成本限制,目前计算机的内存主要是DRAM并且在访问速度上没有质的突破.因 此,CPU的处理速度和内存的访问速度差距越来越大,甚至可以达到上万倍.这种情况下传统的CPU通过FSB直连内存的方式显然就会因为内存访问的等待, 导致计算

关于CPU Cache -- 程序猿需要知道的那些事

/ 本文将介绍一些作为程序猿或者IT从业者应该知道的CPU Cache相关的知识 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/linux/all-about-cpu-cache/ 先来看一张本文所有概念的一个思维导图 为什么要有CPU Cache 随着工艺的提升最近几十年CPU的频率不断提升,而受制于制造工艺和成本限制,目前计算机的内存主要是DRAM并且在访问速度上没有质的突破.因此,

内存池架构

TBOX的内存管理模型,参考了linux kernel的内存管理机制,并在其基础上做了一些改进和优化. 内存整体架构 large_pool 整个内存分配的最底层,都是基于large_pool的大块内存分配池,类似于linux的基于page的分配管理,不过有所不同的是,large_pool并没有像linux那样使用buddy算法进行(2^N)*page进行分配,这样如果需要2.1m的内存,需要分配4m的内存块,这样力度太大,非常浪费. 因此large_pool内部采用N*page的基于page_s

Nginx系列三 内存池的设计

Nginx的高性能的是用非常多细节来保证,epoll下的多路io异步通知.阶段细分化的异步事件驱动,那么在内存管理这一块也是用了非常大心血.上一篇我们讲到了slab分配器,我们能够能够看到那是对共享内存的管理的优化.Nginx在进程内也实现了自己的内存池,目的在于降低内存碎片,降低向操作系统的申请次数,减低模块开发难度.Nginx实现的内存池实际上非常easy: Nginx内存池的管理是分大内存和小内存的,详细说来.Nginx在向系统初始化内存池后,当我们调用ngx_palloc申请小内存后,再

从Java视角理解CPU缓存(CPU Cache)

从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CPU的频率和内存总线的频率在同一个级别, 访问内存只比访问CPU寄存器慢一点儿. 由于内存的发展都到技术及成本的限制, 现在获取内存中的一条数据大概需要200多个CPU周期(CPU cycles), 而CPU寄存器一般情况下1个CPU周期就够了. CPU缓存 网页浏览器为了加

c++内存池实现

利用C/C++开发大型应用程序中,内存的管理与分配是一个需要认真考虑的部分.本文描述了内存池设计原理并给出内存池的实现代码,代码支持Windows和Linux,多线程安全.内存池设计过程中需要考虑好内存的分配与释放问题,其实也就是空间和时间的矛盾.有的内存池设计得很巧妙,内存分配与需求相当,但是会浪费过多的时间去查找分配与释放,这就得不偿失:实际使用中,我们更多的是关心内存分配的速度,而不是内存的使用效率.基于此,本文按照如下思想设计实现内存池.主要包含三个结构:StiaticMemory, M

内存管理之内存池概述(转)

原文链接:http://www.xiaoyaochong.net/wordpress/index.php/2013/08/10/%E5%BC%95%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E4%B9%8B%E5%86%85%E5%AD%98%E6%B1%A0%E6%A6%82%E8%BF%B0/ 在我们编写代码的过程中,不可避免的要和内存打交道,在申请释放不太频繁的情况下,通常让系统进行内存管理即可.但是,直接使用系统调用malloc/free.new/delet