glibc函数malloc的工作原理

简介: glibc函数malloc的工作原理

glibc提供了malloc函数来动态分配内存,我们只知道调用malloc会返回给我们一个指针,指向一块内存空间或NULL,那么malloc的工作原理是什么呢?

概述:

1.小于128kB的空间,使用内存池(在堆上)或brk或sbrk系统调用在堆上分配

2.大于128kB的空间,使用mmap在文件映射区分配

+-----------------------+ High Address
|       栈 (Stack)      |
|-----------------------|
|                       |
|       映射区域        |
|       (mmap)          |
|                       |
|-----------------------|
|        堆 (Heap)      |
|-----------------------|
|        BSS段          |
|-----------------------|
|        数据段         |
|-----------------------|
|        代码段         |
+-----------------------+ Low Address

详细介绍

内存分配机制

  1. 小于128 KB的内存分配
  • 对于小于128 KB的内存分配请求,glibc的内存分配器通常会使用brk系统调用来增加程序的堆(heap)空间。堆是从进程的虚拟内存空间中分配的连续内存区域。通过brksbrk系统调用,内存分配器可以调整程序数据段(data segment)的大小,从而增加或减少堆的大小。
  • 此外,glibc还可能使用内存池(memory pool,也叫arena)来管理小块内存的分配和释放,以减少频繁的系统调用带来的开销。内存池是一种缓存策略,通过预先分配一大块内存,然后在其中管理多个小块内存的分配。
  1. 大于128 KB的内存分配
  • 对于大于128 KB的内存分配请求,glibc的内存分配器通常会使用mmap系统调用。mmap可以直接从内核请求一块内存区域,并将其映射到进程的虚拟地址空间。与brk不同,mmap分配的内存区域不必是连续的,且可以独立于堆的管理。使用mmap的一个好处是,当内存被释放时,内核可以立即回收这些内存。

brk 和 mmap 的区别

  • brk/sbrk
  • 优点:管理简单,分配连续的内存区域。
  • 缺点:堆的大小受限于进程的内存布局,调整堆大小可能会受到其他内存段的限制。
  • mmap
  • 优点:可以分配任意大小的内存区域,不需要是连续的。适用于大块内存的分配,可以避免堆空间的碎片化。
  • 缺点:开销稍大,因为需要进行内核态的系统调用。

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

目录
相关文章
|
1天前
|
机器学习/深度学习 C语言
详细解读C语言math.h中常用函数
详细解读C语言math.h中常用函数
|
1天前
|
C语言
C语言刷题(函数)
C语言刷题(函数)
|
1天前
|
编译器 程序员 Serverless
|
1天前
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法
|
1天前
|
C语言
C语言prinf函数
C语言prinf函数
10 4
|
2天前
|
C语言
【海贼王编程冒险 - C语言海上篇】库函数怎样模拟实现?
【海贼王编程冒险 - C语言海上篇】库函数怎样模拟实现?
5 1
|
2天前
|
C语言
【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
|
2天前
|
存储 C语言
【C语言基础篇】字符串处理函数(三)strcat的介绍及模拟实现
【C语言基础篇】字符串处理函数(三)strcat的介绍及模拟实现
|
2天前
|
C语言
【C语言基础篇】字符串处理函数(二)strcpy的介绍及模拟实现
【C语言基础篇】字符串处理函数(二)strcpy的介绍及模拟实现
|
2天前
|
C语言
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现