高并发内存池介绍
一、池化技术
所谓 “ 池化技术 ” ,就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申
请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。
在计算机中,有很多使用 “ 池 ” 这种技术的地方,除了内存池,还有连接池、线程池、对象池等。以服务器上的线程池为例,它的主要思想是:先启动若干数量的线程,让它们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程又进入睡眠状态。
二、项目原型
原型是 Google 开源的一个 tcmalloc 项目,全称 thread cache malloc,即线程缓存 malloc,实现了高效的多线程内存管理,也就是说对比 malloc,在单线程情况下可能不会有大差别,但是多线程情况下就比 malloc 跟高效。
三、高并发内存池三个模块
高并发内存池主要关心三个问题:性能问题,多线程环境下锁竞争问题,内存碎片问题。
对于三个问题就有三个模块来解决:
1、线程缓存 thread cache
每一个线程独有,用于256KB以内的内存分配,由于每个线程都有一个 thread cache,所以申请时不用加锁,这也是高效之处。
2、中心缓存 cenctral cache
若 thread cache 中内存不够,会到中心缓存申请内存。
机制:
(1)多线程均衡调度内存,适当减少大线程缓存内存补足小线程缓存内存
(2)虽然存在锁竞争,但是由于本质是哈希桶,要满足同时有两个线程没有内存并且向同一个桶要内存才会发生线程安全问题。所以竞争并不激烈。
3、页缓存 page cache
页缓存的存储单位是页(4KB),中心缓存内存不够了就去找页缓存,页缓存也会回收中心缓存释放的页,页号连续的就会合并,缓解内存碎片问题。