[项目][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

相关文章

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.