深圳做模板网站的公司,做婚礼网站的公司,个人站长和企业网站,拍卖网站模板当Page Cache接收了一个来自Central Cache的Span#xff0c;根据Span的起始页的_pageId来对前一页所对应的Span进行查找#xff0c;并判断该Span#xff0c;是否处于使用状态#xff0c;从而看是否可以合并#xff0c;如果可以合并继续向前寻找。
当该Span前的空闲Span查…当Page Cache接收了一个来自Central Cache的Span根据Span的起始页的_pageId来对前一页所对应的Span进行查找并判断该Span是否处于使用状态从而看是否可以合并如果可以合并继续向前寻找。
当该Span前的空闲Span查找完毕后就根据当前Span的_pageIdSpan中的页数_n来向后查找后一页的Span是否为空闲状态如果为空闲状态就继续向后合并。
这样就可以将切小的内存合并成大的Span再次申请内存时可以再从大Span中切分出小的这样一来就大大减少了内存碎片提高了空间的利用效率。
// 释放空闲span回到Pagecache并合并相邻的span
void PageCache::ReleaseSpanToPageCache(Span* span)
{//将Central不用的Span进行回收//同时查找该Span的前后页是否属于空闲状态while (1){PAGE_ID prevId span-_pageId - 1;auto ret _idSpanMap.find(prevId);if (ret _idSpanMap.end())//没有找到说明没有该页号直接break{break;}Span* prevspan ret-second;if (prevspan-_isUse true)//如果前面的页处于使用状态直接break{break;}if (span-_n prevspan-_n 128){break;}span-_pageId prevspan-_pageId;span-_n prevspan-_n;_spanList[prevspan-_n].Erase(prevspan);delete prevspan;}while (1){PAGE_ID nextId span-_pageId span-_n;auto ret _idSpanMap.find(nextId);if (ret _idSpanMap.end())//没有找到说明没有该页号直接break{break;}Span* nextspan ret-second;if (nextspan-_isUse true)//如果前面的页处于使用状态直接break{break;}if (span-_n nextspan-_n 128){break;}span-_n nextspan-_n;_spanList[nextspan-_n].Erase(nextspan);delete nextspan;}if (span-_n 128){int x 0;}_spanList[span-_n].PushFront(span);span-_isUse false;_idSpanMap[span-_pageId] span;_idSpanMap[span-_pageId span-_n - 1] span;
}
至此一个完整的申请回收逻辑就完成了博主也对整个代码进行了测试和改动可以完成正常内存申请释放的功能以及对内存碎片的回收利用。后面博主还会对代码进行进一步的优化和改进从而对其中一些不足之处进行补充。