linux提供了brk,sbrk系统调用来申请释放内存。
linux系统通过一个指针来管理内存,如图所示堆区向上生长,使用一个指针指向堆顶。每次申请内存,使用系统调用把brk指针向上移动,释放内存就把brk指针向下移动。但是如果不想释放data2直接释放data1,这是做不到的。不需要的数据data1,必须等上面的数据都释放后才能释放。
不需要的内存无法归还给操作系统,这就是内存碎片。

一、libc库(stdlib.h)的malloc
malloc使用链表来管理内存。
1、使用brk申请一大块内存。
2、把brk申请到的资源分块,每一块内存都对应链表的一个节点来保存这一块内存的使用情况每个节点包含,地址,是否被使用,大小等属性。
3、每次调用malloc申请内存时,malloc内部会遍历这个链表,如果找到未被使用而且大小也满足,就把此地址返回。如果没有找到就要调用brk系统调用在申请一些内存,链表追加一个节点。
4、如果释放某个内存,就把链表对应的节点的状态标记为未使用,这时候可以进行内存的复用。

malloc函数会直接从linux内核申请一大块内存,供程序员使用,malloc内部进行内存的维护与释放。减少内存碎片的同时,也减少了brk系统调用的次数,提高了效率。
但是为了解决线程安全问题,多线程同时使用malloc和free,malloc使用锁来进行线程互斥,不支持多线程同时申请内存。

2、tcmalloc头文件的malloc
基本原理与libc的malloc一样。不过在多线程同时申请释放内存时,malloc内部不需要进行线程互斥,可以支持多线程并发申请释放内存。
但是内存属于共享资源啊,怎么进行线程互斥呢?
malloc为每个线程都分配一个内存块进行管理。
————————————————
版权声明:本文为CSDN博主「蜗牛^^O^」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44857939/article/details/120183808

内存碎片与malloc(转)相关推荐

  1. malloc()背后的实现原理——内存池

    目录 malloc()和free()的分配算法 内存池 池化技术 相对于栈而言,堆这片内存面临着一个稍微复杂的行为模式:在任意时刻,程序可能发出请求,要么申请一段内存,要么释放一段已经申请过的内存,而 ...

  2. malloc函数背后的实现原理——内存池

    1|0前言 相对于栈而言,堆这片内存面临着一个稍微复杂的行为模式:在任意时刻,程序可能发出请求,要么申请一段内存,要么释放一段已经申请过的内存,而且申请的大小从几个字节到几个GB都有可能,我们不能假设 ...

  3. STM32CUBEIDE——malloc

    malloc()动态分配内存存储空间 头文件:#include<stdlib.h> 原型:void *malloc(size_t size) 参数说明:size为需要分配的内存空间大小,单 ...

  4. 取经之路就在眼前--面经备战

    Android 面经收集大全 注意: 本文是通过阅读大量的博文以及其他论坛的精彩好文简化版随手录,如有侵权马上删除! 持续更新~~ 文字多,难免有些错别字,最近时间忙,后续尽快更改,望谅解 文章目录 ...

  5. μC/OS-II 源码阅读笔记 —— 内核深度剖析

    一个程序猿郁结十年的青苹果 Bush 2014-4-24 前言 此文发表在此,由于正吃菜的我才疏学浅,文中难免有错误的地方,欢迎看官和过客指正批评,痛骂也无妨,我虚心接受所有的鄙视. 目录 概述 缩略 ...

  6. malloc原理和内存碎片

    当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:  1.检查要访问的虚拟地址是否合法  2.查找/分配一个物理页  3.填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)  4.建立 ...

  7. malloc、free与内存碎片

    malloc和free大量使用后回造成内存碎片,那么这种碎片形成的机理是什么?    如果机理是申请的内存空间大小(太小)所形成的,那么,申请多大的区域能够最大限度的避免内存碎片呢?(这里的避免不是绝 ...

  8. linux malloc free 内存碎片_内存申请malloc/new与内存释放free/delete的区别

    前面的文章小编说过,存放在堆上的数据是由程序员小哥哥负责申请和回收的.今天我们就说一下动态申请内存的指令以及他们之间的区别.最普遍的申请内存方式就是malloc/free与new/delete; 为了 ...

  9. linux内存碎片malloc,linux_ptmalloc下malloc()的过程:有 ptmalloc 源码

    文章描述 本文将尽量详细地给出 ptmalloc 下调用 malloc() 进行内存分配的实现过程 __libc_malloc() 和 _int_malloc() 实际上,在glibc中没有 mall ...

  10. malloc一次性最大能申请多大内存空间

    受用户态内存地址空间的限制.64 位系统下分配几个 T 不成问题. 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:zz matrix 链接:http://www.zhi ...

最新文章

  1. linux shell 和 golang 查询服务器硬件信息
  2. java消息推送怎么实现_调用钉钉接口实现机器人推送消息
  3. Happy new year 2009
  4. C++一天一个程序(七)
  5. html css 学习笔记(1)背景相关
  6. 【知识梳理】3.1页面布局
  7. Asp用FSO读写文件
  8. Scanner和BufferedReader从控制台读取输入数据
  9. PCL之估计整个点云表面法向量
  10. NDK配置文件Android.mk简介
  11. c语言怎么编程判断关键字,C语言关键字
  12. mybatis xml sql分页
  13. AndroidStudio配置一键360加固gradle脚本
  14. 接口快速开发框架 magic-api 2.x初体验
  15. linux 搜索s开头的文件,Linux文件查找/内容搜索命令
  16. 可以在idle内部执行python命令_2、Python IDLE入门
  17. 云原生之使用Docker部署BookBrowser电子书浏览器
  18. 如何将鼠标和键盘连接到PlayStation 4
  19. 为什么Tesla显卡那么贵
  20. php adodb smarty,ADODB结合SMARTY使用~超级强

热门文章

  1. JavaScript的js文件压缩和格式化工具
  2. Mirth学习笔记 - 建立Mirth通道
  3. UE4 虚幻引擎 Metahuman怎么导入到项目中
  4. Echarts 数据可视化 实现半圆饼图效果,渐变颜色
  5. matlab遗传算法求解TSP旅行商问题
  6. 步进电机驱动器的作用以及其调速方法
  7. 计算机联锁的功能核心,什么叫计算机联锁.doc
  8. 极化码自适应CA-SCL译码(极化码译码)
  9. es java api 获取总数_java Es Api --解决大量数据查询
  10. Linux 2.6内核配置说明