当前位置: 首页 > news >正文

【lesson9】高并发内存池Page Cache层释放内存的实现

文章目录

  • 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->_pageId+span->_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 + 页数,在该场景中也就是1992+11 = 2003,所以我们应该向后找2003页的span看有没有。
假设有
在这里插入图片描述
合并两span
在这里插入图片描述
然后也继续往后合,直到不能合了为止
不能合情况:
1.后面对应的页号不存在
2.后面的页号正在使用
3.和后面的span加起来页数超过128

http://www.lryc.cn/news/293563.html

相关文章:

  • Java基础面试题-6day
  • 【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件
  • 二级C语言笔试2
  • 如何计算两个指定日期相差几年几月几日
  • 再识C语言 DAY13 【递归函数(超详细)】
  • 【Linux】权限管理
  • 地理坐标系、空间坐标系、epsg查询网站
  • docker 容器指定主机网段
  • 零基础Vue框架上手;git,node,yarn安装
  • 十分钟学会用springboot制作微信小程序富文本编辑器
  • 【BBF系列协议】TR181-1 TR069的设备数据模型
  • Elasticsearch(简称ES)性能优化 实践
  • 《跨越阶层,小白选专业的逻辑:揭秘家庭背景与个人发展的秘密联系》
  • Python调用pyspark报错整理
  • 快递员的烦恼 - 华为OD统一考试
  • css1基础选择器
  • 【C语言】内联函数总结
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItemGroup组件
  • 【Linux多线程编程】互斥锁及其使用
  • RabbitMQ_00000
  • 【linux】docker下homeassistant和nodered安装及配置
  • Qt扩展-muParser数学公式解析
  • 【Matplotlib】figure方法之图形的保存
  • 数据库管理-第142期 DBA?DBA!(20240131)
  • react 之 zustand
  • leetcode-回文链表
  • Pinia:一个Vue的状态管理库
  • 2024 Flutter 重大更新,Dart 宏(Macros)编程开始支持,JSON 序列化有救
  • 云计算概述(云计算类型、技术驱动力、关键技术、特征、特点、通用点、架构层次)(二)
  • 物流平台架构设计与实践