自己的关于内存池的个人小笔记:
对于一个项目来说,不断的动态分配释放内存,无疑是个糟蹋CPU性能的举措。
<以下代码仅个人思路,属个人程序针对性设计,并不代表任何情况>
</pre><pre name="code" class="cpp">
#include <boost/lockfree/spsc_queue.hpp>
struct memory_pkt
{
int size;
void* data;
};
/**
* 【说明】:包容量10000 和 内存块大小100/1000 根据自身情况定。
* 当然这种模式有个确定就是启动程序时会慢,但运行过程还是会起到良好的效果。
* 无阻塞模式的生产和消费,适用于生产消费模型
* (以下程序未经编译,可能存在小BUG,个人思路如此。)
*/
class spsc_memory_pkt
{
public:
spsc_memory_pkt();
~spsc_memory_pkt();
private:
typedef boost::lockfree::spsc_queue<memory_pkt, boost::lockfree::capacity<10000> > spsc_mem_queue;
spsc_mem_queue m_mem_pkt100;
spsc_mem_queue m_mem_pkt1000;
public:
inline void* popPkt(int len)
{
memory_pkt pkt;
if(len <= 100)
{
if(!m_mem_pkt100.empty())
{
m_mem_pkt100.pop(pkt);
return pkt.data;
}
len = 100;
}
else if(len <= 1000)
{
if(!m_mem_pkt1000.empty())
{
m_mem_pkt1000.pop(pkt);
return pkt.data;
}
len = 1000;
}
return new char[len];
}
inline void pushPkt(void* data, int len)
{
if(len <= 100)
{
memory_pkt pkt = {100, data};
if(m_mem_pkt100.push(pkt))
{
return;
}
}
else if(len <= 1000)
{
memory_pkt pkt = {1000, data};
if(m_mem_pkt1000.push(pkt))
{
return;
}
}
delete[] data;
}
};
inline spsc_memory_pkt::spsc_memory_pkt()
{
for (int i = 0; i < 10000; ++i)
{
memory_pkt pkt;
pkt.data = new char[100];
pkt.size = 100;
m_mem_pkt100.push(pkt);
}
for (int i = 0; i < 10000; ++i)
{
memory_pkt pkt;
pkt.data = new char[1000];
pkt.size = 1000;
m_mem_pkt1000.push(pkt);
}
}
inline spsc_memory_pkt::~spsc_memory_pkt()
{
//...释放队列中的内存。。。
}
对于内存池,运用模式:
①单线程模式,最简介、也很实用,我们事先分配好很多内存块放入内存池的队列中,当用的时候,从内存池中弹出一块内存直接用,在不够的时候在分配一块出来,当然设计这个内存池内存容量和内存块大小要取决于你的项目所要消耗的内存包大小而定。内存池当然是一种牺牲内存赢取时间的举措,尤其对于一个服务器开发显得尤为重要。更值一提的是在多线程中内存池更是一种重要性能优化的方法,因为多线程多个线程同时new和delete资源时是很耗CPU的,所以下面就是两种多线程模式的内存池方式。
②spsc模式(消费者-生产者一对一模式)的运用,我更推荐用boost中的lockfree::spsc_queue模式来存放我们的的内存块。首先boost中无锁队列速率要比自己加锁的构造出来的队列效率要高很多(不信可以自测,当然也要比boost::lockfree::queue,多线程模式队列也快)。当然有利必有弊,任何选择都得满足自己的情况,它需要指定容量,这个稍微是个小缺憾。言归正传说道内存池,一个线程只负责从池中取内存,另一线程只负责将内存归还。
③mpmc模式,也很简单,线程之间访问内存池时加个锁,相比之下用boost中的lockfree::queue更佳。
个人感觉 对于一个程序项目的管理型优化,内存池是个值得关注的焦点,欢迎大家给与项目性能话题的意见(语言C++)。