高并发内存池

实际问题

在多个线程频繁进行小块内存的申请和释放的情况,多个进程向内核申请内存,带来的进程之间激烈竞争,大大减少了工作效率,同时小块内存带来的内存碎片问题会降低内存的使用效率。

设计思路

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 =
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值