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

相关文章

Python中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

python项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻