malloc内存分配与free内存释放的原理

时间:2022-09-08 09:38:21

malloc内存分配与free内存释放的原理

前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂。

  后来室友买了本深入理解计算机系统的书,原来上面有讲malloc的原理,遂看了,先明白理论,在看代码就理解比较快了= =

  1.问题的引入:

   为什么要使用malloc,主要是因为在代码中,为了节约内存,很多数据都是动态生成的,所以会用malloc,对应于C++中的new,底层还是调用malloc.

  2.碎片的问题:

   会有内部碎片与外部碎片的问题,内部碎片难以消除(因为字对齐之类的问题),而外部碎片是可以消除的(如果不消除的话,外部的内存块越来越小,虽然数量多了,但是利用率会急剧下降!)

  3.需要解决的问题:

  malloc内存分配与free内存释放的原理

  4.隐式的空闲链表:

  一个简单的堆块,这里只有头部,下面为了优化,还会使用尾部。

  malloc内存分配与free内存释放的原理

  隐式的空闲链表:

  malloc内存分配与free内存释放的原理

  这样就把用链表的方法把堆空间给联系起来了。特点明显,实现简单,但分配时查询空堆块是线性时间的。

  5.放置以分配的块:

    1)、首次适配:从链表开始寻找适合的空堆块,直到找到为止

    2)、下一次适配:从上一次的分配点开始找,直到找到适合的空堆块为止

    3)、最佳适配:查询整个链表,找到最合适(浪费最小)的空堆块

  6.分割空闲块:

    当前的分配的空堆块比所需要的空间大很多的时候,如果不分割,就会照成内部碎片过大,利用率下降。

    当需要3个字节的空间时,首次适配找到了满足条件的第二个堆块,但堆块过大,所以分割成两个16字节的堆块。

    malloc内存分配与free内存释放的原理

  7.获取额外的堆存储器:

   当链表中不能满足申请要求的堆块空间的时候,1)通过合并相邻的堆块空间,形成单个尽量大的堆块空间 2)实在没有其他办法了,分配器通过sbrk函数向内核申请格外的堆空间,分配器将堆空间插入到链表中,然后提供给申请空间的块。

  8.合并

  malloc内存分配与free内存释放的原理

  如果,在如上的情况下,合并两个块,由于当前块不知道上一个块的情况,它要通过遍历整个链表才能知道上一个堆块的空间是否为空,这样将花费线性的时间来合并与当前相邻的空闲堆块。有个类似双向链表的方法(不过不是真正的双向链表,只是可以加一个信息量,直接就可以知道上一个堆块的情况)

  malloc内存分配与free内存释放的原理

  上一个堆块的情况就容易知道了,下面有四种情况:

  malloc内存分配与free内存释放的原理

  malloc内存分配与free内存释放的原理

  这样,堆块合并的问题就解决了。

参考:深入理解计算机系统

 
 

malloc内存分配与free内存释放的原理的更多相关文章

  1. SQL SERVER 内存分配及常见内存问题(2)——DMV查询

    原文:SQL SERVER 内存分配及常见内存问题(2)--DMV查询 内存动态管理视图(DMV): 从sys.dm_os_memory_clerks开始. SELECT [type] , SUM(v ...

  2. SQL SERVER 内存分配及常见内存问题(1)——简介

    原文:SQL SERVER 内存分配及常见内存问题(1)--简介 一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解 ...

  3. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...

  4. rt-thread中动态内存分配之小内存管理模块方法的一点理解

    @2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...

  5. 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

    1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...

  6. C程序的内存分配及动态内存

    1.程序内存的分配 一个由C/C++编译的程序占用的内存分为以下几个部分:1)栈区(stack) — 由编译器自动分配释放 , 存放为运行函数而分配的局部变量. 函数参数. 返回数据. 返回地址等. ...

  7. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  8. SQL SERVER 内存分配及常见内存问题 简介

    一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解SQL SERVER与windows是如何协调.共享内存.并且SQ ...

  9. C++_类和动态内存分配1—动态内存和类

    静态类成员 num_strings成员声明为静态存储类.静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象共享一个静态成员.num_strings成员可以 ...

随机推荐

  1. Opencv人头跟踪检测

    //-------------------------------------人头检测------------------------------------- int main(){     //V ...

  2. SharePoint自动化系列——Content Type相关timer jobs一键执行

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 背景: 在SharePoint Central Administration->Monito ...

  3. 由于本公司项目需要,现急需拥有微软MCSE证书的人才,一经录用,待遇从优!

    志鸿科技于1988年在香港创办,从事资讯科技服务,为本地及跨国金融企业提供各种合适的企业应用软件及方案,并于2000年6月30日在香港联合交易所创业板成功上市 (股票代号8048),香港长江实业.新加 ...

  4. Java程序员面试题集(71-85)(转)

    转:http://blog.csdn.net/jackfrued/article/details/17566627 Java程序员面试题集(71-85) 摘要:这一部分主要包括了UML(统一建模语言) ...

  5. POJ2796(单调栈)

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12987   Accepted: 3639 Case T ...

  6. 项目启动log4j相关警告问题

    在项目启动时出现了下面的警告: log4j:WARN custom level class [xxxxx] not found. 出现这个错误,不是log4j的问题,也是slf4j的问题,问题是因为自 ...

  7. C#解压文件,Excel操作

    /// <summary> /// 获取目录下文件路径 /// </summary> /// <param name="path"></p ...

  8. webpack优化以及node版本

    最近做的这个项目webpack用的是1.X的版本,真的非常多的坑,然后最近在疯狂的做优化: 事情的起因是每次我npm run dev的时侯都需要5分钟+,这个速度真的是难以忍受,然后就尝试去做项目的优 ...

  9. 【转载】Window服务器开机后一直处于蓝色屏幕&lpar;非蓝屏 crash&rpar;状态

    阿里云Windows系统服务器运维的过程中,有时候会遇到实例开机后一直处于蓝色背景屏幕(非蓝屏 crash )状态.此时你发现鼠标可以任意正常移动,但是屏幕上却没有任何的图标可以供操作,这种情况可能是 ...

  10. mysql 存储过程中文乱码的解决方法

    CREATE PROCEDURE `PROC_FOOBAR`(id INTEGER) BEGIN DECLARE code, user_id VARCHAR(32) CHARACTER SET utf ...