高并发内存池 - 整体框架设计

高并发内存池 - 整体框架设计

高并发内存池 - 整体框架设计

项目 gitee 链接: 高并发内存池项目
项目 github 链接: 高并发内存池项目

现代很多的开发环境都是多核多线程,在申请内存的场景下,必然存在激烈的锁竞争问题。malloc本⾝其实已经很优秀,那么我们项⽬的原型tcmalloc就是在多线程⾼并发的场景下更胜⼀筹,所以这次我们实现的内存池需要考虑以下⼏⽅⾯的问题。

  1. 性能问题。
  2. 多线程环境下,锁竞争问题。(这也是这个项目优于malloc的关键原因)
  3. 内存碎⽚问题。

concurrent memory pool 主要由以下3个部分构成:

  1. thread cache:线程缓存是每个线程独有的,⽤于⼩于 256KB 的内存的的分配,线程从这⾥申请内存不需要加锁,每个线程独享⼀个 cache ,这也就是这个并发线程池⾼效的地⽅。

  2. central cache:中⼼缓存是所有线程所共享,thread cache 是按需从central cache 中获取的对象。central cache 合适的时机回收thread cache中的对象,避免⼀个线程占⽤了太多的内存,⽽其他线程的内存吃紧,达到内存分配在多个线程中更均衡的按需调度的⽬的。central cache 是存在竞争的,所以从这⾥取内存对象是需要加锁,⾸先这⾥⽤的是桶锁,其次只有 thread cache 的没有内存对象时才会找central cache,所以这⾥竞争不会很激烈。
    不会很激烈。

  3. page cache:⻚缓存是在central cache 缓存上⾯的⼀层缓存,存储的内存是以⻚为单位存储及分配的,central cache 没有内存对象时,从 page cache分配出⼀定数量的 page ,并切割成定⻓⼤⼩的⼩块内存,分配给 central cache 。当⼀个 span 的⼏个跨度⻚的对象都回收以后, page cache 会回收 central cache 满⾜条件的 span 对象,并且合并相邻的⻚,组成更⼤的⻚,缓解内存碎⽚的问题。