图文理解malloc内存分配(赶快学习起来~)
前言
由于malloc()的源码十分的繁琐,并且会调用OS所提供的API,所以我不在对malloc()的源码进行分析了,而只是会分析malloc()的动作,这就已经足够了。
好文推荐:
全网最牛Linux内核分析–Intel CPU体系结构
一文让你读懂Linux五大模块内核源码,内核整体架构设计(超详细)
嵌入式前景真的好吗?那有点悬!
一文教你如何使用GDB+Qemu调试Linux内核
Linux内核必读五本书籍(强烈推荐)
全网独一无二Linux内核Makefle系统文件详解(一)(纯文字代码)
带你深度了解Linux内核架构和工作原理!
一、malloc()分配出的内存空间
在前边的文章中已经提及到了,当malloc()分配空间时,并不是要多少就分配多少,而是会额外的加上首部和尾部,其中一些较为简单的部分我会在这里进行解释,而较为重要的部分我会在本文下面的分析中逐步的完善。图片取自侯捷C++内存分配系列教程讲义
【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100名进群领取,额外赠送大厂面试题。
学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂ke.sigusoft.com/course/4032547?flowToken=1040236ke.sigusoft.com/course/4032547?flowToken=1040236ke.sigusoft.com/course/4032547?flowToken=1040236ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1041712ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639ke.sigusoft.com/course/4032547?flowToken=1042639
内核资料直通车:2022全新Linux内核源码分析学习路线图+完整视频+完整资料sigusoft.com/doc/DYXFObEFJa0p4bUNUsigusoft.com/doc/DYXFObEFJa0p4bUNUsigusoft.com/doc/DYXFObEFJa0p4bUNUsigusoft.com/doc/DYXFObEFJa0p4bUNUsigusoft.com/doc/DYXFObEFJa0p4bUNUsigusoft.com/doc/DYXdLeWZSakRRUnFW
二、内存分配
1.内存管理所用到的结构层次
首先,在进入程序之前,系统就已经分配出了一个结构去管理内存,我们先来看看这个结构





2.内存页的划分
下面我们来看每个崭新的内存页的内容
内存页划分的规则
当申请一个内存空间时,首先先去符合的链表中寻找,如果链表中没有挂载内存块,就从编号较大的链表中最近的挂有内存块的链表中划分。
内存页被划分之后的情况

3.内存分配的动作
我们刚刚分配出了0x130的空间,我们先看看这个空间分配出去之后的动作

4.内存归还的动作
当多次连续分配之后,出现了一次归还空间的动作
三、将内存归还给OS
我们来探讨几个问题:
Q1、当多个group被启用时,怎么去寻找归还的内存属于哪个group?
答案很简单,夹杀法:我们知道每一个group对应内存的起始地址和结尾地址,我们只需要去判断被归还的指针中地址的大小是否在这二者之间,就能判断出是否属于当前的group。而去寻找所对应的header的方法也是如此。
Q2、怎么将内存还给操作系统?`
这里时malloc和之前讲过的分配器本质上的区别,我们能将收回的内存还给操作系统,具体步骤如下:对于回收的连续的内存空间进行合并 这个实现时基于上下两个cookie的实现完成的
2. 判断分配的空间的全回收这也很简单,我们再每个group都记录了分配出去的次数,每当我们回收的时候,就将这个值-1,所以当它再次为0的时候,就证明这个group的内存全部回收了。
3. 当内存全回收之后的状态由于有上边的合并机制,所以当一个group的内存全回收之后,他的状态就和最开始时一样,也就是最后一个链表上连接着8个4KB大小的内存块,这时我们就可以将他还给操作系统了。
Q3:当一个group全回收之后,我们需要将他立刻还给系统么?
答案肯定是否定的,因为如果我们全回收一个就还一个,那么当下一次在需要分配时,我们还需要重新分配。所以全回收的group不会立刻被还给系统,而是等待下一个全回收的group出现,就会将前一个group对应的内存free掉。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/94257.html

