首页 > 其他分享 >模块二:central cache实现

模块二:central cache实现

时间:2024-11-11 08:49:16浏览次数:3  
标签:span thread cache 链表 内存 模块 central size

一、central cache介绍

结构也是一个哈希桶,大小划分和 thread cache哈希桶一样,区别在于挂的不是自由链表而是 span 链表,里面连接了许多 span

二、span介绍

1、实现思路

span 就是 central cache 向 page cache 申请的大块内存,由一个个页(大小4KB)组成。

span 链表是一个带头双向循环链表,用于管理一个哈希桶里面所有的 span,当 thread cache 内存不够了就会拿出一个非空的 span,按照需求(thread cache 需要的小块内存大小和按照一定算法会给 thread cache 返回几个小块内存大小的内存块,如果缺一个就返回一个会导致频繁向中心缓存申请降低效率)把一个 span 分割成固定大小个数的连续内存块返回给 thread cache

2、代码实现

(1)算法确定中心缓存返回个数 static size_t NumMoveSize(size_t size)

中心思想:大块内存我给少一点,你缺一个我就最多给你两个,小块内存申请频繁就多给你几个。

(2)Span 结构体

由于 central cache 申请的 span 是从 page cache 里面申请的,所以组成单位是页,为了便于 page cache 回收内存碎片,所以要记录一个 span 的开头页号和保存的页数,还有带头双向链表的结构,为了之后回收一个完整的 span,还要实时记录 thread cache 用了多少小内存块(用了就++,用完还回来了就--,到0就代表全部回收回来了,就会在返回给 page cache 回收内存碎片),一个 span 其实是被切割成对应大小的小内存块(8,16,24 byte....)就要在自由链表管理这些内存块。

(3)Span 链表结构体

要管理好一个哈希桶对应的一个 span 链表就要有头指针,指定位置插入删除,由于去中心缓存的一个桶里面取内存有线程安全问题,所以每一个桶或者链表要有一个锁。

三、cenctral cache实现

central cache 必须只能有一个,所以是单例模式,这里我实现的是饿汉模式。定义私有静态对象 static CentralCache _sInst;

1、函数介绍

这个阶段声明三个函数(只实现两个,获取一个非空 span 涉及到 page cache)

(1)返回单例模式对象 static CentralCache* GetInstance()

return &_sInst;

(2)获取一个非空 span Span* GetOneSpan(SpanList& list, size_t size)

之后实现

(3)从中心缓存中尽量取出指定个数和大小的内存块 size_t FetchRangeObj(void*& start, void*& end, size_t fetchNum, size_t size)

先通过内存块大小 size 找到桶号

再从桶对应的 span 链表里面取出一个非空的 span

最后获取 fetchNum 个内存块,获取方法:

2、代码实现

四、thread cache向中心缓存申请内存

void* FetchFromCentralCache(size_t index, size_t size)

注意这里使用了 central cache 里面的函数,由于是单例模式,要先全局声明单例模式静态对象!!!!

1、具体实现步骤

(1)thread cache 内存块不够向 central cache 申请一个大小 size 的内存块,但是会根据慢开始反馈调节算法返回多个内存块

(2)确定具体返回几个内存块之后调用 CentralCache 里面的 FetchRangeObj 函数获取范围[start, end]的内存块,并得到实际返回的内存块个数(毕竟 span 的自由链表里面有几个内存块不确定)

(3)开始处理返回的范围[start, end]内存块

若实际返回只有一个内存块,就直接返回 start

若实际返回有多个内存块,就把范围 [start + 1, end]的内存块以自由链表形式链入 thread cache 对应桶对应的自由链表里面,最后返回 start

2、代码实现

标签:span,thread,cache,链表,内存,模块,central,size
From: https://blog.csdn.net/qhy850716/article/details/143671307

相关文章

  • 黑马PM- B端产品-客服模块设计
    语料库管理机器人智能客服人工客服功能设计客服系统数据管理及基础设置......
  • WIFI模块中AP模式和STA模式是什么
    1.AP模式(AccessPoint):AP模式即无线接入点模式,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。功能:在AP模式下,设备充当无线网络的中心节点,负责管理无线网络,包括广播SSID(服务集标识符),管理连接的客户端设备,以及提供数据传输的中继点。客......
  • Java Pom 两个模块需要互相引用怎么办
    JavaPOM模块化是什么在Java项目中,特别是在使用Maven作为构建工具时,"POM模块化"是一个重要的概念,它指的是将大型项目拆分成多个更小、更易于管理的模块(或称为子项目)。每个模块都有自己的pom.xml文件,该文件定义了模块的构建配置,包括依赖关系、插件、目标平台等。1.1POM(P......
  • Java Pom 两个模块需要互相引用
    JavaPOM模块化是什么在Java项目中,特别是在使用Maven作为构建工具时,"POM模块化"是一个重要的概念,它指的是将大型项目拆分成多个更小、更易于管理的模块(或称为子项目)。每个模块都有自己的pom.xml文件,该文件定义了模块的构建配置,包括依赖关系、插件、目标平台等。1.1POM(P......
  • Python decimal模块用法
    decimal模块:decimal意思为十进制,这个模块提供了十进制浮点运算支持1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。    在Python中,将变量声明为 Decimal 类型通常用于需要高精度和小数运算的场合。Decimal 类型属于 deci......
  • 非制冷红外探测器驱动模块设计与非均匀校正实现
     文章目录第一章 非制冷红外探测器性能简介第二章非制冷红外探测器驱动模块设计第三章非制冷红外探测器驱动模块状态机设计第四章非制冷红外探测器非均匀校正参数的获取与存储第五章OOC参数和两点校正KB参数的上电加载使用总结第一章 非制冷红外探测器性能简介......
  • MOGANET-SA模块
    paper`importtorch.nnasnnimporttorchimporttorch.nn.functionalasFdefbuild_act_layer(act_type):"""Buildactivationlayer."""ifact_typeisNone:returnnn.Identity()assertact_typein['GELU','ReL......
  • 轨迹联邦用到的具体公式 + 轨迹模块的设计
    轨迹数据+roadnetwork数据在这个LightTR框架中,输入的轨迹数据和路网数据通过以下几个模块进行计算和处理:1.局部轨迹预处理(LocalTrajectoryPreprocessing)首先,对输入的原始轨迹数据进行地图匹配(MapMatching)。地图匹配会将GPS记录的轨迹点投影到道路网络中的具体道路片......
  • 7天用Go从零实现分布式缓存GeeCache(学习)(2)
    参考:https://geektutu.com/post/geecache-day2.html//Cache是一个LRU缓存(最近最少使用缓存),它不是并发安全的。typeCachestruct{maxBytesint64//缓存的最大字节数nbytesint64//当前缓......
  • 鸿蒙HarmonyOS证书的安全管家:Device Certificate Kit中的证书管理模块
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在华为鸿蒙HarmonyOS的世界里,设备的安全......