跟着卷卷龙一起学 Camera-- 内存池浅析 06
综合前面讲的方案,这里讲一下线程局部存储应用于内存池的方案。
有了线程局部存储问题就简单了,我们可以将内存池声明为线程局部存储,这样每个线程都只会操作属于自己的内存池,这样就再也不会有锁竞争问题了。虽然这里给出了线程局部存储的设计,但并不是说加锁的方案就比不上线程局部存储方案,还是那句话,一切要看使用场景,如果加锁的方案够用,那么我们就没有必要绞尽脑汁的去用其它方案,因为加锁的方案更简单,代码也更容易维护。从图中我们就可以看到每个线程局部存储定义的线程池,都有其自己所维护的内存大小。且两两之间是相互独立的。
除了线程安全,这里还有一个非常有趣的问题,那就是如果线程 A 申请的对象被线程 B 拿去释放,我们的内存池该怎么处理呢?
这个问题之所以有趣是因为我们必须知道该内存属于哪个线程的局部存储,但申请的内存本身并不能告诉你这样的信息。这里其实用 mmap 表就可以解决。
总结
内存池是高性能服务器中常见的一种优化技术,在这里我们介绍了三种实现方法,值的注意的是,内存池实现没有统一标准,一切都要根据具体场景定制,因此我们可以看到内存池设计是有针对性的,当然其反面就是不具备通用性。有的方法可以让线程安全但是代码复杂度增加了,有的方案不涉及线程安全,也就没必要考虑复杂的方法了。
版权声明: 本文为 InfoQ 作者【卷卷龙】的原创文章。
原文链接:【http://xie.infoq.cn/article/a70a763637abeab06a16e37e7】。文章转载请联系作者。
评论