实际问题
在多个线程频繁进行小块内存的申请和释放的情况,多个进程向内核申请内存,带来的进程之间激烈竞争,大大减少了工作效率,同时小块内存带来的内存碎片问题会降低内存的使用效率。
设计思路
1.每个线程有自己独立的一块内存,小的内存块到这上面去切。
2.线程需求的内存块大小不同,为其划分不同的大小内存块,这些内存块是切好的自由链表,并且按照哈希桶的方式存储,这样线程thread_cache就能轻松的为线程获取对应大小的内存块。每个线程都有其私有的thread_cache
3.在thread_cache之上有公有的central_cache,central_cache同样是哈希桶结构,每个桶里有一块或几块固定大小的内存块,这些内存块有在其内被切成自由链表,thread没有内存向central申请,thread闲置内存过多,向central退还。 central在进程内只有唯一一份。
4.pagecache,最底层,同样是哈希桶结构,负责向系统申请内存,并将申请到的指针转化为页号(64和32转化不同),同时负责向central发放内存,并回收小块的页将其合并为大块内存。
基础结构见下图(手绘拙劣)
设计主体
1.定长内存池+线程池
用于摆脱系统申请malloc和缓解批量线程问题。
定长内存池,线程池实现方法很多就不赘述了。
class ObjectPool {
public:
//内存申请
T* New()
{
//返回的指针
T* obj = nullptr;
//判断自由链表是否为空
if (_freeList)
{
void* next = *((void**)_freeList);
obj = (T*)_freeList;
_freeList = next;
}
else {
//申请空间,并且一小块一小块的给
if (_remain < sizeof(T))
{
_remain =