广州公司建站,新冠止咳药哪个效果好,深汕特别合作区公共事业局,网站建设管理工作情况的通报文章目录 Page Cache层释放内存的流程Page Cache层释放内存的实现 Page Cache层释放内存的流程
如果central cache释放回一个span#xff0c;则依次寻找span的前后page id的没有在使用的空闲span#xff0c;看是否可以合并#xff0c;如果合并继续向前寻找。这样就可以将切… 文章目录 Page Cache层释放内存的流程Page Cache层释放内存的实现 Page Cache层释放内存的流程
如果central cache释放回一个span则依次寻找span的前后page id的没有在使用的空闲span看是否可以合并如果合并继续向前寻找。这样就可以将切小的内存合并收缩成大的span减少内存碎片。
Page Cache层释放内存的实现
void PageCache::ReleaseSpanToPageCache(Span* span)
{// 对span前后的页尝试进行合并缓解内存碎片问题//补充点1:向前合并的逻辑介绍while (1){PAGE_ID prevId span-_pageId - 1;auto ret _idSpanMap.find(prevId);// 前面的页号没有不合并了if (ret _idSpanMap.end()){break;}// 前面相邻页的span在使用不合并了Span* prevSpan ret-second;if (prevSpan-_isUse true){break;}// 合并出超过128页的span没办法管理不合并了if (prevSpan-_n span-_n NPAGES-1){break;}span-_pageId prevSpan-_pageId;span-_n prevSpan-_n;_spanLists[prevSpan-_n].Erase(prevSpan);delete prevSpan;}// 向后合并//补充点2:向后合并的逻辑介绍while (1){PAGE_ID nextId span-_pageId span-_n;auto ret _idSpanMap.find(nextId);if (ret _idSpanMap.end()){break;}Span* nextSpan ret-second;if (nextSpan-_isUse true){break;}if (nextSpan-_n span-_n NPAGES-1){break;}span-_n nextSpan-_n;_spanLists[nextSpan-_n].Erase(nextSpan);delete nextSpan;}_spanLists[span-_n].PushFront(span);span-_isUse false;_idSpanMap[span-_pageId] span;_idSpanMap[span-_pageIdspan-_n-1] span;
}
补充点1:向前合并的逻辑介绍 向前合并代码
while (1){PAGE_ID prevId span-_pageId - 1;auto ret _idSpanMap.find(prevId);// 前面的页号没有不合并了if (ret _idSpanMap.end()){break;}// 前面相邻页的span在使用不合并了Span* prevSpan ret-second;if (prevSpan-_isUse true){break;}// 合并出超过128页的span没办法管理不合并了if (prevSpan-_n span-_n NPAGES-1){break;}span-_pageId prevSpan-_pageId;span-_n prevSpan-_n;_spanLists[prevSpan-_n].Erase(prevSpan);delete prevSpan;}我们假设Central Cache还回来了一个3页的span _pageid 2000
而我们向前合并就是要找前面_pageid为1999的span 假设1999有且没被使用
合并两个span 然后继续往前合直到不能合了为止 不能合情况 1.前面对应的页号不存在 2.前面的页号正在使用 3.和前面的span加起来页数超过128
补充点2:向后合并的逻辑介绍 向后合并代码
while (1){PAGE_ID nextId span-_pageId span-_n;auto ret _idSpanMap.find(nextId);if (ret _idSpanMap.end()){break;}Span* nextSpan ret-second;if (nextSpan-_isUse true){break;}if (nextSpan-_n span-_n NPAGES-1){break;}span-_n nextSpan-_n;_spanLists[nextSpan-_n].Erase(nextSpan);delete nextSpan;}前面已经向前合并了那么之后我们就要看看向后还能不能合并 我们向后合并也是 现在的span的_pageid 页数在该场景中也就是199211 2003所以我们应该向后找2003页的span看有没有。 假设有 合并两span 然后也继续往后合直到不能合了为止 不能合情况 1.后面对应的页号不存在 2.后面的页号正在使用 3.和后面的span加起来页数超过128