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

系统中的malloc怎么分配内存

mallocC 标准库中的一个函数,用于动态分配内存。

malloc 是通过向操作系统申请内存来实现的。

内存分配的基本原理

  • malloc 函数从堆中分配内存。堆是一个动态内存区域,用于在程序运行时分配和释放内存。
  • 当程序首次调用 malloc 时,它会请求操作系统分配一块较大的内存区域,这个区域被称为内存池(memory pool)。之后的内存分配请求会从这个内存池中划分出一部分内存来满足需求,而不是每次都向操作系统申请内存,这样可以减少系统调用的开销,提高内存分配的效率。

内存分配算法

  • 首次适应算法(First Fit :在内存池中查找第一个足够大的空闲内存块来满足分配请求。这种方法简单,但可能会导致内存碎片较多。
  • 最佳适应算法(Best Fit :在内存池中查找最小的且足够大的空闲内存块来满足分配请求。这种方法可以减少内存浪费,但查找过程可能较慢。
  • 伙伴系统算法(Buddy System :将内存块按大小分成不同的组,当需要分配内存时,从合适的组中划分出一块内存。如果当前组中没有足够的内存块,则向上合并直至找到合适的内存块。这种方法可以有效减少内存碎片,但实现相对复杂。

内存分配的具体过程

  1. 申请内存池 :当程序启动时,malloc 会向操作系统申请一块较大的内存区域作为内存池。在 Linux 系统中,通常使用 brksbrk 系统调用,通过调整进程的程序崩溃指针(program break)来增加数据段的大小,从而获得更多的内存空间。在 Windows 系统中,通常使用 VirtualAllocHeapAlloc 等函数来分配内存。
  2. 管理内存池malloc 使用一定的数据结构来管理内存池中的空闲内存块。常见的数据结构包括链表、位图等。空闲内存块的信息(如大小、起始地址等)被记录下来,以便后续的内存分配和回收操作。
  3. 分配内存 :当程序调用 malloc 请求分配内存时,malloc 会在内存池的空闲内存块中查找合适的块来满足请求。根据所采用的内存分配算法,找到合适的空闲内存块后,将其从空闲列表中移除,并返回该块的起始地址给用户。
  4. 内存回收 :当程序调用 free 函数释放内存时,malloc 会将释放的内存块重新加入到空闲列表中,以便后续的内存分配请求可以重用这些内存。如果内存池中有多个相邻的空闲内存块,malloc 可能会将它们合并为一个更大的空闲块,以减少内存碎片。

GNU C 库中的 malloc 实现

GNU C 库(glibc)中,malloc 的实现是一种比较复杂的内存分配器,称为 ptmalloc。主要特点如下:

  • 内存池管理ptmalloc 将内存池划分为多个 arena(区域),每个 arena 管理一部分内存。在多线程环境下,每个线程可能会有自己的 arena,这样可以减少线程之间的竞争,提高内存分配的并发性能。
  • 分块管理 :将内存块按照大小分为不同的 bin(桶),每个 bin 中存放着一定范围大小的空闲内存块。当分配内存时,会根据请求的大小选择合适的 bin 来查找空闲块;当释放内存时,会将内存块放入合适的 bin 中。
  • 快速分配和释放 :对于小内存块(小于 512 字节),ptmalloc 使用专门的快速 binfast bin)来管理,以加快分配和释放的速度。快速 bin 中的内存块大小相同,分配时直接取出,释放时直接放入,不需要合并和分裂操作。

推荐一下

https://github.com/0voice

相关文章:

  • 第一月第四周
  • RAG框架精选2
  • 学习笔记—C++—string(练习题)
  • kotlin知识体系(六) : Flow核心概念与与操作符指南
  • 利用OLED打印调试信息: 控制PC13指示灯点灯的实验
  • C++在VR/AR图形处理开发中的实战应用
  • 如何在 Go 中创建和部署 AWS Lambda 函数
  • 2025-2030:视频联网平台的六大技术演进趋势
  • 关于隔离2:ADC芯片
  • 【每天一个知识点】医学领域的模式识别
  • Linux网络UDP与TCP
  • node.js|环境部署|源码编译高版本的node.js
  • 深度学习4——深度神经网络训练
  • 全同态加密医疗数据分析集python实现
  • Matlab 复合模糊PID
  • 云梦数字化系统 介绍
  • Oracle--SQL基本语法
  • 缓存 --- 内存缓存 or 分布式缓存
  • 【1】云原生,kubernetes 与 Docker 的关系
  • 代码随想录算法训练营第五十三天 | 105.有向图的完全可达性 106.岛屿的周长
  • “棉花糖爸爸”陈生梨:女儿将落户到贵州纳雍
  • “你是做什么的?”——人们能否对工作说不?
  • 儿童阅读空间、残疾人友好书店……上海黄浦如何打造城市书房
  • 长安汽车辟谣抛弃华为,重奖百万征集扩散不实内容的背后组织
  • 上海奉贤这所九年一贯制学校将迎首批新生,有何特色?
  • 信心从何而来|当消博会展商遇上关税战