高并发内存池 -- 内存池介绍+问题,定长内存池原理+代码 ...

打印 上一主题 下一主题

主题 949|帖子 949|积分 2847

目录
高并发内存池
介绍
tcmalloc
本项目
内存池
池化技能
比喻
内存碎片问题
外碎片
内碎片
锁竞争
malloc
定长内存池
介绍
特点
实现
申请内存
分配内存
开释内存
管理开释后的内存
对象属性
可移植性

代码
fixed_length_memorypool.hpp
helper.hpp
test_Fixed_length.cpp


高并发内存池

介绍

   tcmalloc

  tcmalloc(Thread-Caching Malloc)是Google开源的高效内存分配库,设计用于优化多线程环境下的内存分配性能
  
      
  • 它与标准的malloc和free提供相似的功能,但专注于多线程性能优化,通过减少锁争用和提升缓存掷中率来提高分配效率  

    本项目

  此项目是将tcmalloc最核心的框架简化出来模拟实现
  
      
  • 借鉴了源码和其他资料,模拟出的简化版的内存池  
  • 目的是学习和借鉴优秀技能
  

  
内存池

   池化技能

  是一种通过重复利用资源来提高体系性能、低落体系负载的技能
  
  
      
  • 先申请过量资源,然后进行管理,为后续使用做预备  
  • 而不是到需要使用的时候再申请
  池化广泛用于需要频仍分配和开释资源的场景
  
      
  • 比如内存分配、数据库连接和线程管理
  比喻

  就像你找父母要米饭钱
  
      
  • 假如没有池化技能,吃一顿饭就要一次钱,买个东西就要一次钱,很麻烦  
  • 假如引入池化技能,先估算好大概开销,然后每周/每个月才要一次钱,通过这样的方式,可以把钱存到微信/付出宝,每次用钱就从这里面取,这样就简化了资金的管理,提高了使用效率
  
内存池的设计旨在通过减少频仍的体系调用来提高内存分配和开释的效率,尤其在需要频仍分配小块内存的场景下


  • 但内存池的效率也会受到几个常见因素的影响
内存碎片问题

   外碎片

  

  
      
  • 虽然申请空间时大概是连续申请的,但因为开释空间的时机随机,所以就导致东一块西一块的内存被开释,而不能凑出一块连续的大空间  
  • 当后续有其他进程需要申请大空间时,大概总的空闲空间大小是够的,但都是一块一块的碎片,那么谁人进程就申请不出来连续的大空间
    内碎片

  因为内存对齐等问题,导致分配的内存块大于实际需求
  
      
  • 那么未使用的那部门内存就会被浪费
    锁竞争

  多线程环境下,多个线程大概同时访问和操作内存池,导致锁竞争
  
      
  • 频仍地锁定和解锁会明显低落内存池的性能  
  • 锁竞争会增长线程等待时间,低落整体分配速度,特别是当多线程并发访问量高时
  本项目旨在并发环境下比malloc更高效
  
      
  • 所以为每个线程单独分配了缓存区,以减少线程之间的锁争用
  
   malloc

  虽然动态申请内存都是在堆上开辟空间,但我们不会直接去堆上获取
  
      
  • 因为会有上面介绍的各种问题  
  • 所以,c/c++会借助malloc()和free( )来管理内存
  

  
      
  • malloc实际就是一个内存池  
  malloc有许多种方案可以实现,差别平台下差别
  
      


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表