《C++实战项目-高并发内存池》7.大块内存的申请与释放
Yupureki:个人主页✨个人专栏:《C》 《算法》《Linux系统编程》《高并发内存池》Yupureki的简介:目录1. 大块内存的申请2. 大块内存的释放完整项目链接https://github.com/Yupureki-code/ConcurrentMemoryPool1. 大块内存的申请ThreadCache和CentralCache内部能够存储的最大内存块为256kb。如果进程申请了超过256kb的内存块时应该越级直接向PageCache申请这个判断应该在最开始的向ThreadCache申请资源环节进行static void* ConcurrentAlloc(size_t size) { if (size MAX_BYTES)//大于256kb { size_t alignSize SizeClass::RoundUp(size); size_t kpage alignSize PAGE_SHIFT; PageCache::GetInstance()-_pageMtx.lock(); Span* span PageCache::GetInstance()-NewSpan(kpage);//直接向PageCache申请 span-_objSize size; PageCache::GetInstance()-_pageMtx.unlock(); void* ptr (void*)(span-_pageId PAGE_SHIFT); return ptr; } else { // 通过TLS 每个线程无锁的获取自己的专属的ThreadCache对象 if (pTLSThreadCache nullptr) { static ObjectPoolThreadCache tcPool; //pTLSThreadCache new ThreadCache; pTLSThreadCache tcPool.New(); } //cout std::this_thread::get_id() : pTLSThreadCache endl; return pTLSThreadCache-Allocate(size); } }同时PageCache内部能够存储的最大页数为128因此有两种情况内存块大于256kb 小于 128 * 8 kb则可以在PageCache内部拿如果大于128 * 8 kb那么说明PageCache也做不到应该越级向系统申请因此当PageCache收到这个请求后也应该做特殊对待// 获取一个K页的span Span* PageCache::NewSpan(size_t k) { assert(k 0); // 大于128 page的直接向堆申请 if (k NPAGES-1) { void* ptr SystemAlloc(k); //Span* span new Span; Span* span _spanPool.New(); span-_pageId (PAGE_ID)ptr PAGE_SHIFT; span-_n k; _idSpanMap[span-_pageId] span; return span; } ....... }2. 大块内存的释放当进程释放这个大块内存后原来是向PageCache申请的现在也应该直接向PageCache释放static void ConcurrentFree(void* ptr) { Span* span PageCache::GetInstance()-MapObjectToSpan(ptr); size_t size span-_objSize; if (size MAX_BYTES)//释放大块内存 { PageCache::GetInstance()-_pageMtx.lock(); PageCache::GetInstance()-ReleaseSpanToPageCache(span); PageCache::GetInstance()-_pageMtx.unlock(); } else { assert(pTLSThreadCache); pTLSThreadCache-Deallocate(ptr, size); } }同时PageCache最大只能存储128页的内存块因此如果大于128 * 8 kb的大小应该直接向系统释放void PageCache::ReleaseSpanToPageCache(Span* span) { // 大于128 page的直接还给堆 if (span-_n NPAGES-1) { void* ptr (void*)(span-_pageId PAGE_SHIFT); SystemFree(ptr); //delete span; _spanPool.Delete(span); return; } ...... }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414266.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!