高并发内存池 - 整体框架设计
高并发内存池 - 整体框架设计
项目 gitee 链接: 高并发内存池项目
项目 github 链接: 高并发内存池项目
现代很多的开发环境都是多核多线程,在申请内存的场景下,必然存在激烈的锁竞争问题。malloc本⾝其实已经很优秀,那么我们项⽬的原型tcmalloc就是在多线程⾼并发的场景下更胜⼀筹,所以这次我们实现的内存池需要考虑以下⼏⽅⾯的问题。
- 性能问题。
- 多线程环境下,锁竞争问题。(这也是这个项目优于
malloc的关键原因) - 内存碎⽚问题。
concurrent memory pool 主要由以下3个部分构成:
thread cache:线程缓存是每个线程独有的,⽤于⼩于 256KB 的内存的的分配,线程从这⾥申请内存不需要加锁,每个线程独享⼀个 cache ,这也就是这个并发线程池⾼效的地⽅。
central cache:中⼼缓存是所有线程所共享,thread cache 是按需从central cache 中获取的对象。central cache 合适的时机回收thread cache中的对象,避免⼀个线程占⽤了太多的内存,⽽其他线程的内存吃紧,达到内存分配在多个线程中更均衡的按需调度的⽬的。central cache 是存在竞争的,所以从这⾥取内存对象是需要加锁,⾸先这⾥⽤的是桶锁,其次只有 thread cache 的没有内存对象时才会找central cache,所以这⾥竞争不会很激烈。
不会很激烈。page cache:⻚缓存是在central cache 缓存上⾯的⼀层缓存,存储的内存是以⻚为单位存储及分配的,central cache 没有内存对象时,从 page cache分配出⼀定数量的 page ,并切割成定⻓⼤⼩的⼩块内存,分配给 central cache 。当⼀个 span 的⼏个跨度⻚的对象都回收以后, page cache 会回收 central cache 满⾜条件的 span 对象,并且合并相邻的⻚,组成更⼤的⻚,缓解内存碎⽚的问题。
