[项目][CMP][项目介绍及知识铺垫]详细讲解

2024-09-05 06:52

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

目录

  • 1.这个项目做的是什么?
  • 2.此项目涉及知识面
  • 3.什么是内存池?
    • 1.池化技术
    • 2.内存池
    • 3.内存池主要解决的问题
  • 4.理解malloc


1.这个项目做的是什么?

  • 实现一个高并发内存池,参考原型为Google的一个开源项目tcmalloc(Thread-Caching Malloc)
    • 线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)
  • 此项目是把tcmalloc最核心的框架简化后拿出来,模拟实现出一个自己的高并发内存池,以供学习
  • tcmalloc源代码

2.此项目涉及知识面

  • C/C++、数据结构(链表、哈希桶)、操作系统内存管理、单例模式、多线程、互斥锁

3.什么是内存池?

1.池化技术

  • 程序先向系统申请过量的资源,然后自己管理,以备不时之需
  • 之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,使用时就会变得非常方便快捷,大大提高程序运行效率
  • 计算机中,很多使用"池"这种技术的地方,比如内存池、连接池、线程池、对象池等

2.内存池

  • 内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取
  • 同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池
  • 当程序退出(或者特定时间)时,内存池才将之前申请的内存真正释放

3.内存池主要解决的问题

  • 内存池主要解决效率问题,其次如果作为系统的内存分配器的角度,还需要解决一下内存碎片的问题

  • 什么是内存碎片?(外碎片)

    • 如下图
    • 此时有384byte空间,但是因为要申请超过256byte的空间却申请不出来,因为这两块空间碎片化,不连续了
      请添加图片描述
  • 内存碎片

    • 外碎片
      • 一些空闲的连续内存区域太小,这些内存空间不连续,以至于合计的内存足够,但是不能满足一些的内存分配申请需求。
    • 内碎片
      • 由于一些对齐的需求,导致分配出去的空间中一些内存无法被利用

4.理解malloc

  • C/C++中要动态申请内存都是通过malloc去申请内存,但是我们实际不是直接去堆获取内存的,而malloc就是一个内存池

  • malloc()相当于向操作系统"批发"了一块较大的内存空间,然后"零售"给程序用,当全部"售完"或程序有大量的内存需求时,再根据实际需求向操作系统"进货"

  • malloc的实现方式有很多种,一般不同编译器平台用的都是不同的

    • 比如Windows的vs系列用的微软自己写的一套
    • Linux gcc用的glibc中的ptmalloc
      请添加图片描述
  • 一文了解,Linux内存管理,malloc、free 实现原理

  • malloc()背后的实现原理 – 内存池

  • malloc的底层实现(ptmalloc)

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



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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

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

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 编辑器项目模式分类工程