【项目日记(三)】内存池的整体框架设计

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:项目日记-高并发内存池⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你做项目
  🔝🔝
开发环境: Visual Studio 2022


在这里插入图片描述

项目日记

  • 1. 前言
  • 2. 内存池整体结构一览
  • 3. 线程缓存结构详解
  • 4. 中心缓存结构详解
  • 5. 页缓存结构详解
  • 6. 总结

1. 前言

由于本项目是模拟学习tcmalloc
的优秀的思想以及巧妙的结构,所
以本项目只会把源项目的精华部分
拿出来学习,请大家耐心看完

本章重点:

本篇文章着重讲解本项目的大致
框架结构,以及每一层小结构的内
部的部分细节,这篇文章不会有很多
的代码演示,但至关重要!!!


2. 内存池整体结构一览

首先,我们采用了三层缓存结构来
实现不同的功能,每一层结构都互
相紧密联系:

  • ThreadCache(线程缓存结构)

线程缓存是每一个线程独享的结构,线程申请和释放内存都在这个缓存中进行,只能用于小于256KB的内存分配.整个线程缓存结构是不用加锁的

  • CentralCache(中心缓存结构)

中心缓存是所有线程所共享的,thread cache是按需从central cache中获取的对象。central cache会在合适的时机回收thread cache中的对象,避免一个线程占用了太多的内存,而其他线程的内存吃紧,达到内存分配在多个线程中更均衡的按需调度的目的。central cache是存在竞争的,所以从这里取内存对象是需要加锁,首先这里用的是桶锁,其次只有thread cache的没有内存对象时才会找central cache,所以这里竞争不会很激烈

  • PageCache(页缓存结构)

页缓存是在central cache缓存上面的一层缓存,存储的内存是以页为单位存储及分配的,central cache没有内存对象时,从page cache分配出一定数量的page,并切割成定长大小的小块内存,分配给central cache。当一个span的几个跨度页的对象都回收以后,page cache会回收central cache满足条件的span对象,并且合并相邻的页,组成更大的页,缓解内存碎片的问题

看到这儿你可能一脸懵逼,但是没关系
这里的所有内容都会在后面一一讲解

三层缓存的大致结构:

在这里插入图片描述


3. 线程缓存结构详解

线程缓存结构实际上是一个哈希桶,
数组的下标代表这个桶中存放的小
块内存的字节数是多少,桶中存放
小块儿内存,就是定长池中的自由链表

在这里插入图片描述

申请内存的步骤:

申请内存时,比如申请8字节大小内存
会先去8字节对应的哈希桶中查看有
没有小块儿内存,如果有,则直接返回
给外部,若对应的桶无小块儿内存,再去
中心缓存中拿内存!

释放内存的步骤:

释放内存时,比如释放的内存大小是16
字节,那么这块儿返回来的空间就会挂
在16字节对应的哈希桶中,当满足某种
条件时,线程缓存中的小块儿内存会还
给中心缓存(最开始的内存是中心缓存给的)


4. 中心缓存结构详解

中心缓存结构本质也是一个哈希桶,
并且它的数组下标和线程缓存是相同
的,但是哈希桶中存储的内容不同,中
心缓存中存储的是一个span结构,span
就是一个结构体,它负责管理大块内存

在这里插入图片描述
对span的简单介绍:

我们默认系统的一页内存是8KB,
span管理的大块儿内存实际上是
大页内存,可能是一页,两页内存,
这个大页内存会被切分为小块儿的
内存,8字节对应的哈希桶中会切分
为8字节的小块儿内存,这样可以很
方便的将小块儿内存分配给线程缓存!

span的来源与去向讲解:

中心缓存的span实际上是由页缓存分配
的,并且在一个span满足某种条件时,会
把此span还给页缓存,并且span是一个
双链表结构,一个哈希桶桶中可能有多个
span,下面是span的大致成员变量:

//管理多个连续页的大块内存跨度结构,centralcache的哈希桶中链接的就是这种结构
class SpanData
{
public:size_t _n = 0;//此span中的页数SpanData* _next = nullptr;SpanData* _prev = nullptr;size_t _useCount = 0;//span中切分好的小对象有几个被使用了void* _freeList = nullptr;//切分好的小块内存的自由链表
};

5. 页缓存结构详解

页缓存结构的本质也是一个哈希桶,
但它的数组下标含义与前两层不同,
它的下标代表这个哈希桶中存放的
span一共有多少页内存!

在这里插入图片描述

span的来源与去向讲解:

页缓存中的span和中心缓存中的
span结构体是一样的,但页缓存中的
span是直接从系统中申请的大块儿
空间,并且这个span会直接分配给中
心缓存去切分为小块儿内存后被使用

向页缓存申请span的基本步骤:

当线程缓存的哈希桶中没有小块儿内存了,并且中心缓存对应的哈希桶中页没有span了,这时会来页缓存申请span回去做切分使用,假设申请的span是5页大小,那么就会去页缓存的五号桶中查看是否有span,若有span就直接返回若没有span,则需要去6到128号桶中寻找是否存在span,假设100号桶中有span,那么会将这个100页的大span切分为一个5页的小span和一个95页的大span,再将这个5页的span返回给中心缓存,这个95页的span重新挂到页缓存的95号桶中!假如6到128号桶都没有span,则会向系统申请一个128页的大块儿空间,再来切分成小span返回!


6. 总结

这整个三层结构的设计是十分巧妙的,
在线程缓存中是不需要加锁的,因为每
个线程独享这个结构,这也是这个项目
比较快的原因之一,在中心缓存中也不
需要完全加锁,而是使用桶锁,只有当不同
的线程进入到同一个桶时才会有锁互斥!

当然这个项目的巧妙之处远不止如此
我将在后面的代码实现中,一边讲解
原理,一边带大家编码,这才能真正带大家
了解到这个项目的精髓与值得学习之处!!!

🔎 下期预告:自由链表和span结构实现🔍

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s的对外服务---ingress

service的作用体现在两个方面: 集群内部:不断追踪pod的变化。他会更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制。 集群外部:类似负载均衡器,把流量IP端口,不涉及转发url(http、htt…

如何本地部署虚VideoReTalking

环境: Win10专业版 VideoReTalking 问题描述: 如何本地部署虚VideoReTalking 解决方案: VideoReTalking是一个强大的开源AI对嘴型工具,它是我目前使用过的AI对嘴型工具中效果最好的一个!它是由西安电子科技大学、…

医学图像的数据增强技术 --- 切割-拼接数据增强(CS-DA)

医学图像的新型数据增强技术 CS-DA 核心思想自然图像和医学图像之间的关键差异CS-DA 步骤确定增强后的数据数量 代码复现 CS-DA 核心思想 论文链接:https://arxiv.org/ftp/arxiv/papers/2210/2210.09099.pdf 大多数用于医学分割的数据增强技术最初是在自然图像上开…

H5嵌入小程序适配方案

时间过去了两个多月,2024已经到来,又老了一岁。头发也掉了好多。在这两个月时间里都忙着写页面,感觉时间过去得很快。没有以前那么轻松了。也不是遇到了什么难点技术,而是接手了一个很烂得项目。能有多烂,一个页面发起…

Vue2移动端项目使用$router.go(-1)不生效问题记录

目录 1、this.$router.go(-1) 改成 this.$router.back() 2、存储 from.path,使用 this.$router.push 3、hash模式中使用h5新增的onhashchange事件做hack处理 4、this.$router.go(-1) 之前添加一个 replace 方法 问题背景 : 在 Vue2 的一个移动端开发…

tag 标签

tag 标签 在使用 Git 版本控制的过程中,会产生大量的版本。如果我们想对某些重要版本进行记录,就可以给仓库历史中的某一个commit 打上标签,用于标识。 在本章中,我们将会学习如何列出已有的标签、如何创建和删除新的标签、以及…

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中,graph[i] 是一个列…

数学建模学习笔记||层次分析法

评价类问题 解决评价类问题首先需要想到一下三个问题 我们评价的目标是什么我们为了达到这个目标有哪几种可行方案评价的准则或者说指标是什么 对于以上三个问题,我们可以根据题目中的背景材料,常识以及网上收集到的参考资料进行结合,从而筛…

问题:Feem无法发送信息OR无法连接(手机端无法发给电脑端)

目录 前言 问题分析 资源、链接 其他问题 前言 需要在小米手机、华为平板、Dell电脑之间传输文件,试过安装破解的华为电脑管家、小米的MIUI文件传输等,均无果。(小米“远程管理”ftp传输倒是可以,但速度太慢了,且…

js实现九九乘法表

效果图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script type"text/javascript">// 输出乘法口诀表// document.write () 空格 " " 换行…

java黑马学习笔记

数组 变量存在栈中&#xff0c;变量值存放在堆中。 数组反转 public class test{public static void main(String[] args){//目标&#xff1a;完成数组反转int[] arr {10,20,30,40,50};for (int i 0,j arr.length - 1;i < j;i,j--){int tep arr[j]; //后一个值赋给临时…

微前端-无界wujie

无界微前端方案基于 webcomponent 容器 iframe 沙箱&#xff0c;能够完善的解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户的核心诉求。 主项目安装无界 vue2项目&#xff1a;npm i wujie-vue2 -S vue3项目…

wayland(xdg_wm_base) + egl + opengles 最简实例

文章目录 前言一、ubuntu 下相关环境准备1. 获取 xdg_wm_base 依赖的相关文件2. 查看 ubuntu 上安装的opengles 版本3. 查看 weston 所支持的 窗口shell 接口种类二、xdg_wm_base 介绍三、egl_wayland_demo1.egl_wayland_demo2_0.c2.egl_wayland_demo3_0.c3. xdg-shell-protoco…

深耕文档型数据库12载,SequoiaDB再开源

1月15日&#xff0c;巨杉数据库举行SequoiaDB新特性及开源项目发布活动。本次活动回顾了巨杉数据库深耕JSON文档型数据库12年的发展历程与技术演进&#xff0c;全面解读了SequoiaDB包括在高可用、安全、实时、易用性四个方向的技术特性&#xff0c;宣布了2024年面向技术社区的开…

Qt事件过滤

1.相关说明 监控鼠标进入组件、出组件、点击组件、双击组件的事件&#xff0c;需要重写eventFilter函数 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&…

Vue——计算属性

文章目录 计算属性computed 计算属性 vs methods 方法计算属性完整写法 综合案例&#xff1a;成绩案例 计算属性 概念&#xff1a;基于现有的数据&#xff0c;计算出来的新属性。依赖的数据变化&#xff0c;自动重新计算 语法: ①声明computed配置项中&#xff0c;一个计算属性…

Mac NTFS 磁盘读写工具选哪个好?Tuxera 还是 Paragon?

在使用 Mac 电脑时&#xff0c;我们经常需要读写 NTFS 格式的硬盘或 U 盘。然而&#xff0c;由于 Mac 系统不支持 NTFS 格式的读写&#xff0c;因此我们需要借助第三方工具来实现这个功能。而在市场上&#xff0c;Tuxera 和 Paragon 是两款备受推崇的 Mac NTFS 磁盘读写工具。那…

C++入门学习(八)sizeof关键字

sizeof 是 C 和 C 中的一个运算符&#xff0c;用于确定特定类型或对象的内存大小&#xff08;以字节为单位&#xff09;。 1、查看数据类型占据内存大小 #include <iostream> using namespace std; int main() {short a 1;int b 1;long c 1;long long d 1;cout<…

超级菜鸟怎么学习数据分析?

如果你有python入门基础&#xff0c;在考虑数据分析岗&#xff0c;这篇文章将带你了解&#xff1a;数据分析人才的薪资水平&#xff0c;数据人应该掌握的技术栈。 首先来看看&#xff0c;我在搜索数据分析招聘时&#xff0c;各大厂开出的薪资&#xff1a; 那各大厂在数据领域…

论文阅读_CogTree_推理的认知树

英文名称: From Complex to Simple: Unraveling the Cognitive Tree for Reasoning with Small Language Models中文名称: 从复杂到简单&#xff1a;揭示小型语言模型推理的认知树链接: http://arxiv.org/abs/2311.06754v1代码: https://github.com/alibaba/EasyNLP作者: Junbi…