模块二:central cache实现

一、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、代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/11413.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

D-FINE:在DETRs模型中将回归任务重新定义为细粒度分布优化

晚上回家看到一篇新颖的研究内容, 也是目标检测相关的《D-FINE: REDEFINE REGRESSION TASK IN DETRS AS FINE-GRAINED DISTRIBUTION REFINEMENT》 ,原文地址在这里,如下所示: 如果想进一步了解相关的研究工作建议移步阅读原英文论…

数据结构 ——— 链式二叉树oj题:单值二叉树

目录 题目要求 手搓一个单值二叉树 代码实现 题目要求 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false 手搓一个单值二叉树 代码演示: // 数据类…

使用Windbg排查C++软件安装包安装时被安全防护软件拦截导致安装线程堵塞卡住的问题

目录 1、问题描述 2、初步分析 3、将Windbg附加到安装包进程上进行分析 4、在Windbg中查看相关变量的值,并设置断点进行动态调试 4.1、在Windbg中查看相关变量的值 4.2、在Windbg中使用bp命令设置断点进行动态调试 5、腾讯电脑管家已经退出,但其…

一键直达Windows11精简版下载地址:附快速安装教程!

许多用户想知道Windows11精简版下载地址在哪里?这里系统之家小编将给大家分享最新的Windows11精简版系统下载地址,方便大家下载与安装。该版本系统删除大量不必要的组件和功能,让系统运作速度变得更快更流畅,但没有过度精简&#…

Mesh网格

Mesh(网格) 定义:Mesh 是一个包含顶点、三角形、顶点法线、UV坐标、颜色和骨骼权重等数据的对象。它定义了3D模型的几何形状。 功能: 顶点(Vertices):构成3D模型的点。 三角形(Triangles)&…

【机器学习】28. 强化学习(Bellman, Q-learning, DQN, 优先级经验回放)

强化学习 定义强化学习的核心要素马尔可夫决策过程价值函数Bellman 方程Q Learning深度Q学习算法 (DQN)DQN 的核心思想DQN 的工作流程经验回放:(随机抽样)目标网络:损失函数 优先级经验回放(Pri…

大数据-217 Prometheus 安装配置 启动服务 监控服务

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

利用RANSAC算法拟合平面并生成包围框的点云处理方法,点云聚类、质心坐标、倾斜角度、点云最小外接矩形

该代码用于分析和处理点云数据,通过对点云数据进行裁剪、平面拟合和生成包围框来提取特定区域的特征并发布结果。主要使用了RANSAC算法来识别并拟合平面,从而提取平面的法向量,接着根据该平面计算出该区域的最小矩形包围框(Boundi…

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝

大佬们好呀,这一次讲解的是二叉树的深度搜索,大佬们请阅 1.前言 ⼆叉树中的深搜(介绍) 深度优先遍历(DFS,全称为DepthFirstTraversal),是我们树或者图这样的数据结构中常⽤的⼀种…

深入解析DHCP带来了什么功能,服务器回应到底是用广播还是单播呢?

前言 不知道大家在看到这个图的时候第一时间想到的是什么,【好复杂】【看不懂】【终端数好多】,这里不看整体的结构怎么样,来看看终端数量都非常的多,终端要与网络中进行通信,势必需要IP地址,从最开始学习到…

<项目代码>YOLOv8 棉花识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

知乎日报前三周总结

目录 前言 首页 网络请求 上拉加载 详情页 加载WebView 左右滑动 主页与详情页同步更新 总结 前言 在这几周进行了知乎日报的仿写,这篇博客来总结一下前三周仿写的内容 首页 首页的界面如图所示,其实就是一个导航栏和一个数据视图组成的&#…

小白快速上手 labelimg:新手图像标注详解教程

前言 本教程主要面向初次使用 labelimg 的新手,详细介绍了如何在 Windows 上通过 Anaconda 创建和配置环境,并使用 labelimg 进行图像标注。 1. 准备工作 在开始本教程之前,确保已经安装了 Anaconda。可以参考我之前的教程了解 Anaconda 的…

【算法】【优选算法】二分查找算法(上)

目录 一、二分查找简介1.1 朴素二分模板1.2 查找区间左端点模版1.3 查找区间右端点模版 二、leetcode 704.⼆分查找2.1 二分查找2.2 暴力枚举 三、Leetcode 34.在排序数组中查找元素的第⼀个和最后⼀个位置3.1 二分查找3.2 暴力枚举 四、35.搜索插⼊位置4.1 二分查找4.2 暴力枚…

自己构建ARM平台DM8镜像

??? 为什么不使用官方提供的docker版本,测试有问题,分析函数不能使用,报错。 自己构建ARM平台的dm8镜像,参考 https://gitee.com/xlongfu/dm-docker/tree/master,发现一些问题 首先…

Linux之实战命令73:at应用实例(一百零七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

万字长文解读【深度学习面试——训练(DeepSpeed、Accelerate)、优化(蒸馏、剪枝、量化)、部署细节】

🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总万字长文解读…

C++ | Leetcode C++题解之第554题砖墙

题目&#xff1a; 题解&#xff1a; class Solution { public:int leastBricks(vector<vector<int>>& wall) {unordered_map<int, int> cnt;for (auto& widths : wall) {int n widths.size();int sum 0;for (int i 0; i < n - 1; i) {sum wi…

DDei在线设计器V1.2.42版发布

V1.2.42版 新特性&#xff1a; 1.快捷编辑框可以映射到主控件的多个属性上&#xff0c;从而实现快速编辑。 2.跟随图形的支持范围增加&#xff0c;从仅支持线控件到支持所有控件 2.新增控件双击回调函数EVENT_CONTROL_DBL_CLICK&#xff0c;可以用于覆盖默认的快速编辑逻辑…