[项目][CMP][Central Cache]详细讲解

2024-09-07 08:12

本文主要是介绍[项目][CMP][Central Cache]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.设计&结构
  • 2.申请内存
  • 3.释放内存
  • 4.框架


1.设计&结构

  • Central Cache也是一个哈希桶结构,它的哈希桶的映射关系跟Thread Cache是一样的
  • 不同的是它的每个哈希桶位置挂的是SpanList链表结构(带头双向循环链表)不过每个映射桶下面的span中的大内存块被按映射关系切成了一个个小内存块对象挂在span的自由链表中
    • 8Byte映射位置下面挂的是span中的页被切成8Byte大小的对象的自由链表
    • 256KB位置的span中的页被切成256KB大小对象的自由链表
      请添加图片描述

2.申请内存

  • 当Thread Cache中没有内存时,就会批量的向Central Cache申请一些内存对象
    • 这里的批量获取对象的数量使用了类似网络tcp协议拥塞控制的慢开始算法
    • Central Cache也有一个哈希映射的spanlist,spanlist中挂着span,从span中取出对象给Thread Cache,这个过程是需要加锁的,不过这里使用的是一个桶锁,尽可能提高效率
  • Central Cache映射的spanlist中所有span的都没有内存以后,则需要向Page Cache申请一个新的span对象,拿到span以后将span管理的内存按大小切好作为自由链表链接到一起,然后从span中取对象给Thread Cache
  • Central Cache中挂的span中use_count记录分配了多少个对象出去,分配一个对象给Thread Cache,就++use_count

3.释放内存

  • 当Thread Cache过长或者线程销毁,则会将内存释放回Central Cache中
  • 释放回来时-- use_count,当use_count减到0时则表示所有对象都回到了span,则将span释放回Page CachePage Cache中会对前后相邻的空闲页进行合并

4.框架

// 单例
class CentralCache
{
public:static CentralCache *GetInstance(){return &_sInit;}// 从Central Cache获取一定数量的对象给Thread Cache// start, end 输出型参数,带回地址size_t FetchRangeObj(void *&start, void *&end, size_t batchNum, size_t alignSize);// 获取一个非空的spanSpan *GetOneSpan(SpanList &list, size_t size);// 将一定数量的对象释放到span跨度void ReleaseListToSpans(void *start, size_t alignSize);
private:CentralCache(){}CentralCache(const CentralCache &) = delete;
private:SpanList _spanLists[NFREELIST];static CentralCache _sInit;
};

这篇关于[项目][CMP][Central Cache]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144537

相关文章

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my