`
tianzhihehe
  • 浏览: 20450 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

malloc函数的实质

 
阅读更多

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足

用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。

如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

 

malloc及free等C库函数,都是通过系统调用来实现的。即brk, sbrk, mmap, mremap这些系统调用。

 

thomas的看法。

所谓的“空闲链表”的说法应该是错误的,“已分配列表”才是正确的,因为free的调用,回收堆内存时,系统并不清楚要回收截止地址,这时候通过“已分配列表”查询就能够确定回收的起止地址。

 

堆是一个连续的内存区域,在扩展时自下至上增长。而mm_struct结构,包含了堆在虚拟地址空间的起始和当前结束地址。

<mm_types.h>

struct mm_struct

{

...

    unsigned long start_brk, brk, start_stack;

...

}

 

from "propfessional linux kernel architecture" 4.9

from "understanding the linux kernel" 9.6

from http://blog.chinaunix.net/uid-27471355-id-3494659.html

分享到:
评论

相关推荐

    C malloc函数用法

    malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求...

    基于C语言实现的MallocLab实验.zip

    本质是对一系列的 malloc,free 请求队列的相应,同时满足一些特定的限制条件,比如说:不可以控制用户请求空间的大小;用户的请求必须立即响应,不可以使用 buffer 的形式,这一点是和 shedlab 本质的区别;只可以...

    申请内存区别new malloc HeapAlloc VirtualAlloc

    申请内存区别new malloc HeapAlloc VirtualAlloc,很多时候内存分配影响着程序性能,本例通过源代码显示这几个函数的本质。

    ZPOCObjectEssence3:本Demo主要通过一个自定义类内部的成员变量分析了这个自定义类实际上占用多少内存空间,还介绍了通过sizeof运算符、class_getInstanceSize函数和malloc_size函数打印的结果以及原因

    本Demo主要通过一个自定义类内部的成员变量分析了这个自定义类实际上占用多少内存空间,还介绍了通过sizeof运算符、class_getInstanceSize函数和malloc_size函数打印的结果以及原因。 视频路径:小码哥——&gt;2018年9...

    内存管理内存管理内存管理

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要...

    操作系统(内存管理)

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解...

    c/c++ 学习总结 初学者必备

    而其他类型如int作为参数时,由于函数参数值实质上是实参的一份拷贝,被调函数内部对形参的改变并不影响实参的值。 22、数据结构和算法: A:查找: (1)二分法查找; B:写出下列算法的时间复杂度和实现排序: (1)...

    宋劲彬的嵌入式C语言一站式编程

    1.2. malloc与free 2. 传入参数与传出参数 3. 两层指针的参数 4. 返回值是指针的情况 5. 回调函数 6. 可变参数 25. C标准库 1. 字符串操作函数 1.1. 初始化字符串 1.2. 取字符串的长度 1.3. 拷贝字符串 1.4. 连接...

    C语言程序设计标准教程

    如同在说明和调用函数之前要先定义函数一样。 一、结构的定义 定义一个结构的一般形式为: struct 结构名 { 成员表列 }; 成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型...

    一线大厂百度面试题.zip

    3.1.0 在函数内定义一个字符数组, 用 gets 函数输入字符串的时候, 如果输入越界, 为什么 程序会崩溃? 3.1.1 C++中引用与指针的区别 3.1.2 C/C++程序的内存分区 3.1.3 快速排序的思想、时间复杂度、实现以及优化...

    eWOW64Ext v1.1 - 加载任意 32/64 模块|64 位汇编及进程读写-易语言

    直接使用 64 位函数ziyou读写(注入) 64 位进程,与很多模块调用 NtWow64xxx 系列函数实现的方式有本质不同; 部分常用 ntdll.dll 函数已在模块直接提供,或以模拟 kernel32 函数的调用形式提供,v1.1 新增多个函数...

    【C/C++】C基础_4_数据类型转换,结构体,格式化输出,main函数的参数,动态内存管理

    格式化输出:\,snprintf4.main函数的参数:*argv[]5.动态内存管理:空指针,malloc,free 1.数据类型转换:(double) 自动类型转换 强制类型转换 2.结构体:struct,memcpy,memset 结构体名,结构体...

    linux系统编程之线程.zip

    另注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。 【练习】:编写多线程程序,总结...

    GTK+2.0+中文教程.pdf

    GTK 实质上是一个面向对象的应用程序接口 (API)。尽管完全用 C 写成的,但它是基于类和回调函数 (指向函数的指针) 的思想实现的。 还 有一个名为 GLib 的第三个组件,包含一些标准函数的替代函数,以及一些处理链表...

    易语言-eWOW64Ext v1.21 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写

    直接使用 64 位函数自由读写(注入) 64 位进程,与很多模块调用 NtWow64xxx 系列函数实现的方式有本质不同; 部分常用 ntdll.dll 函数已在模块直接提供,或以模拟 kernel32 函数的调用形式提供,v1.1 新增多个函数...

    eWOW64Ext v1.2 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写-易语言

    直接使用 64 位函数自由读写(注入) 64 位进程,与很多模块调用 NtWow64xxx 系列函数实现的方式有本质不同; 部分常用 ntdll.dll 函数已在模块直接提供,或以模拟 kernel32 函数的调用形式提供,v1.1 新增多个函数...

    C语言经典问答摘录.txt

    答:后缀++ 和-- 操作符本质上比前缀一目操作的优先级高, 因此*p++ 和*(p++) 等价, 它自增p 并返回p 自增之前所指向的值。 要自增p 指向的值, 使用(*p)++, 如果副作用的顺序无关紧要也可以使用++*p。 3 我有一个char...

    JavaScript内存泄漏的处理方式

    像C语言这样的编程语言,具有简单的内存管理功能函数,例如malloc( )和free( )。开发人员可以使用这些功能函数来显式地分配和释放系统的内存。 当创建对象和字符串等时,JavaScript就会分配内存,并在不再使用时自动...

    哈夫曼树的相关程序,试验

    求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,每回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值。由于一个字符的哈夫曼编码是从根结点到相应叶子...

    uboott移植实验手册及技术文档

    在文件的最后加入Nand Flash的初始化函数,该函数在后面Nand Flash的操作都要用到。 u-boot运行到第2阶段会进入start_armboot()函数。其中nand_init()函数是对nand flash的最 初初始化函数。nand_init()函数在两个...

Global site tag (gtag.js) - Google Analytics