当前位置: 首页 > news >正文

【C/C++】内存相关

内存相关

1 ptmalloc

ptmalloc是GNU C Library(glibc)中的默认内存分配器,广泛用于Linux系统。以下是对ptmalloc的详细解析:

一、概述

  • 起源:ptmalloc起源于Doug Lea的malloc实现,并由Wolfram Gloger进行改进,以支持多线程。
  • 目标:ptmalloc的主要目标是为多线程应用程序提供高效的内存分配和释放。
  • 名称含义:“pt”代表“pthreads”,指的是POSIX线程库,表明其支持多线程的特性。

二、特点

  1. 多线程支持:ptmalloc通过为每个线程提供本地缓存(称为线程缓存或tcache)来减少线程之间的竞争,提高内存分配的速度。
  2. 内存分割:将内存分为小块(small bins)和大块(large bins),以便更有效地管理不同大小的内存请求。
  3. 动态分配区:ptmalloc引入了动态分配区(dynamic arena)的概念,与主分配区(main arena)一起通过环形链表进行管理。每个分配区利用互斥锁实现线程对该分配区的访问互斥。
  4. 内存管理策略:预先向操作系统申请并持有一块内存供用户malloc,同时管理已使用和空闲的内存。用户执行free时,会将回收的内存管理起来,并通过策略决定是否交还给操作系统。

三、数据结构

ptmalloc中主要的数据结构包括:

  • malloc_state(Arena header):描述了一个分配区的状态,包括bins、top chunk、last remainder chunk等信息。
  • heap_info(Heap Header):每个堆都有自己的堆Header,用于管理堆的信息。
  • malloc_chunk:是内存块(chunk)的基本组织单元,用于描述每个内存块的状态和大小。每个chunk都有自己的header,包括prev_size(前一个chunk的大小,如果前一个chunk是空闲的)、size(当前chunk的大小,包括开销)、以及用于链表管理的指针(fd、bk等)。

四、内存分配与释放

  1. 内存分配

    • 线程首先尝试从自己的线程缓存中满足内存请求。
    • 如果线程缓存无法满足,则尝试从全局的bins中查找合适的内存块。
    • 如果bins中也找不到合适的内存块,则考虑从top chunk中分配或扩展top chunk。
    • 对于大块内存请求,可能会直接使用mmap()从操作系统申请内存。
  2. 内存释放

    • 释放的内存块首先被加入到unsorted bin中。
    • 根据内存块的大小,可能会被合并到small bins、large bins或fast bins中。
    • 如果内存块足够大或空闲时间过长,可能会被交还给操作系统。

五、优缺点

  • 优点

    • 成熟稳定,与GNU C库紧密集成。
    • 支持多线程,通过线程缓存减少锁竞争。
    • 通过bins和top chunk等机制提高内存分配和释放的效率。
  • 缺点

    • 在高并发场景下,仍然可能存在锁竞争问题。
    • 与其他先进的内存分配器(如tcmalloc、jemalloc)相比,性能可能不是最优的。

六、总结

ptmalloc作为glibc中的默认内存分配器,在Linux系统中扮演着重要角色。它通过一系列机制来提高内存分配和释放的效率,并支持多线程应用程序。然而,随着技术的发展和应用场景的变化,ptmalloc也需要不断优化和改进以适应新的需求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 最接近的三数之和
  • 【Linux】Vim 使用教程
  • C# .net6使用Hangfire
  • 手写new
  • 勒索防御第一关 亚信安全AE防毒墙全面升级 勒索检出率提升150%
  • 技术周总结 2024.07.08~07.14(算法,Python,Java,Scala,PHP)
  • 【Linux网络】poll{初识poll / poll接口 / poll vs select / poll开发多客户端echo服务器}
  • ABC分析模型详解
  • MetaGPT和LangGraph对比
  • 10款性价比高的销售管理信息系统推荐
  • Qt实现MDI应用程序
  • 如何在gitee上创建远程仓库?
  • 对于GPT-5在一年半后发布的期待!
  • 数据库管理-第218期 服务器内存(20240711)
  • 【C语言】移位操作详解 - 《凌波微步 ! 》
  • 《深入 React 技术栈》
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • C语言笔记(第一章:C语言编程)
  • learning koa2.x
  • Python_OOP
  • Redis的resp协议
  • SpriteKit 技巧之添加背景图片
  • VUE es6技巧写法(持续更新中~~~)
  • Vultr 教程目录
  • Yeoman_Bower_Grunt
  • 开源地图数据可视化库——mapnik
  • 前端面试之闭包
  • 前嗅ForeSpider教程:创建模板
  • 数据结构java版之冒泡排序及优化
  • 携程小程序初体验
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 原生JS动态加载JS、CSS文件及代码脚本
  • Mac 上flink的安装与启动
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 数论-逆元
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • ###C语言程序设计-----C语言学习(6)#
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (20)docke容器
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (SERIES12)DM性能优化
  • (二)linux使用docker容器运行mysql
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)项目管理杂谈-我所期望的新人
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .Net 8.0 新的变化
  • .NET(C#) Internals: as a developer, .net framework in my eyes