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

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程