首页 > 其他分享 >glibc函数malloc的工作原理

glibc函数malloc的工作原理

时间:2024-06-11 23:28:27浏览次数:33  
标签:malloc 函数 mmap glibc ----------------------- brk 内存 分配

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)来管理小块内存的分配和释放,以减少频繁的系统调用带来的开销。内存池是一种缓存策略,通过预先分配一大块内存,然后在其中管理多个小块内存的分配。
  2. 大于128 KB的内存分配
    • 对于大于128 KB的内存分配请求,glibc的内存分配器通常会使用mmap系统调用。mmap可以直接从内核请求一块内存区域,并将其映射到进程的虚拟地址空间。与brk不同,mmap分配的内存区域不必是连续的,且可以独立于堆的管理。使用mmap的一个好处是,当内存被释放时,内核可以立即回收这些内存。

brk 和 mmap 的区别

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

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

标签:malloc,函数,mmap,glibc,-----------------------,brk,内存,分配
From: https://blog.csdn.net/2303_77208351/article/details/139577059

相关文章

  • 第五章:多态、抽象类、虚函数、虚函数表
    一、虚函数:1.1虚函数的概念:被virtual修饰的类成员函数称为虚函数。通过重写虚函数,可以实现多态。        1.2如何重写虚函数:派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表类型完全相同),称子类的虚函数重......
  • 仿函数&模板特化
    仿函数基本介绍仿函数的本质就是一个类,此类中运算符重载了括号()!所以它使用起来和函数很相似,就叫做仿函数在标准库的优先级队列的类模板中有一个缺省参数叫less,这个less就是一个仿函数,它会将优先级队列变成大堆,在算法库的sort函数默认是升序,其实就是用的less......
  • CH06_函数
    CH06_函数概述作用:将一段可复用的代码封装起来,减少代码重复。一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。函数的定义函数的定义一般主要有5个步骤:返回值类型函数名参数列表函数体语句返回值语法:返回值类型函数名(参数列表){函数体语句......
  • MFC案例:利用SetTimer函数编写一个“计时器”程序
    一、希望达成效果    利用基于对话框的MFC项目,做一个一方面能够显示当前时间;另一方面在点击开始按钮时进行读秒计时,计时结果动态显示,当点击结束时读秒结束并保持最后结果。二、编程步骤及相关代码、注释   1、启动VS->创建新项目->MFC应用-项目名称:MFCtimer->......
  • 静态数据成员/静态成员函数/运算符重载
    搭建一个货币的场景,创建一个名为RMB的类,该类具有整型私有成员变量yuan(元)、jiao(角)和fen(分),并且具有以下功能:(1)重载算术运算符+和-,使得可以对两个RMB对象进行加法和减法运算,并返回一个新的RMB对象作为结果。(2)重载关系运算符>,判断一个RMB对象是否大于另一个RMB......
  • wimlib API 提供了一系列用于处理 Windows 映像文件(.wim 文件)的函数和数据结构,使开发
    wimlibAPI提供了一系列用于处理Windows映像文件(.wim文件)的函数和数据结构,使开发人员能够在其应用程序中集成对WIM文件的创建、修改和提取功能。以下是一些常见的wimlibAPI:WIM文件的创建和初始化:wimlib_create_new_wim():创建一个新的WIM文件。wimlib_open_wim():......
  • C程序函数调用&系统调用
    理解程序的执行我们要知道CPU可以自由地访问寄存器、内存。另外,程序是由操作系统执行的,所以操作系统能够控制程序的所有执行情况,限制程序的行为。程序地执行过程:程序是一个二进制文件,包含程序的代码指令、代码中的文本信息等(参考C语言的程序的各种段)执行一个程序后,会将这个二......
  • 箭头函数
    基本用法ES6允许使用“箭头”(=>)定义函数。varf=v=>v;varf=function(v){returnv;};如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。varf=()=>5;//等同于varf=function(){return5};varsum=(num1,num2)=>nu......
  • C# 字段 属性 方法 构造函数 索引器 事件 嵌套类型 常量 运算符重载
    字段声明字段字段初始化静态字段常量字段只读字段字段的访问然而属性声明属性自动实现的属性只读属性只写属性属性的逻辑处理属性的访问修饰符属性和字段的区别属性的用途总结索引器索引器的基本语法使用索引器索引器的关键点语法参数访问和设置异常处理性能重载使用......
  • 如果引用另一个文件函数
    提问Rust如果引用另一个文件函数回答使用pubpubfnfib(n:u32)->u32{returnifn<2{n}else{fib(n-1)+fib(n-2)}}参考https://rustwiki.org/zh-CN/book/ch07-05-separating-modules-into-different-files.html#:~:text=Rust......