下面以一个例子来说明内存分配的原理:

情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),如下图:

1、进程启动的时候,其(虚拟)内存空间的初始布局如图1所示。

其中,mmap内存映射文件是在堆和栈的中间(例如libc-2.2.93.so,其它数据文件等),为了简单起见,省略了内存映射文件。

_edata指针(glibc里面定义)指向数据段的最高地址。

2、进程调用A=malloc(30K)以后,内存空间如图2:

malloc函数会调用brk系统调用,将_edata指针往高地址推30K,就完成虚拟内存分配。

你可能会问:只要把_edata+30K就完成内存分配了?

事实是这样的,_edata+30K只是完成虚拟地址的分配,A这块内存现在还是没有物理页与之对应的,等到进程第一次读写A这块内存的时候,发生缺页中断,这个时候,内核才分配A这块内存对应的物理页。也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。

3、进程调用B=malloc(40K)以后,内存空间如图3。

情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0),如下图:

4、进程调用C=malloc(200K)以后,内存空间如图4:

默认情况下,malloc函数分配内存,如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。

这样子做主要是因为:

brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的,这就是内存碎片产生的原因,什么时候紧缩看下面),而mmap分配的内存可以单独释放。

当然,还有其它的好处,也有坏处,再具体下去,有兴趣的同学可以去看glibc里面malloc的代码了。

5 、进程调用D=malloc(100K)以后,内存空间如图5;

6 、进程调用free(C)以后,C对应的虚拟内存和物理内存一起释放。

7、进程调用free(B)以后,如图7所示:

B对应的虚拟内存和物理内存都没有释放,因为只有一个_edata指针,如果往回推,那么D这块内存怎么办呢?

当然,B这块内存,是可以重用的,如果这个时候再来一个40K的请求,那么malloc很可能就把B这块内存返回回去了。

8、进程调用free(D)以后,如图8所示:

B和D连接起来,变成一块140K的空闲内存。

9、默认情况下:

当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim)。在上一个步骤free的时候,发现最高地址空闲内存超过128K,于是内存紧缩,变成图9所示。

头文件

/usr/include/malloc.h

int mallopt (int __param, int __val);

参数 __param的取值范围:-8<=param<=-1 || 1<=param<=4 如下:

#define M_TRIM_THRESHOLD -1

#define M_TOP_PAD -2

#define M_MMAP_THRESHOLD -3

#define M_MMAP_MAX -4

#define M_CHECK_ACTION -5

#define M_PERTURB -6

#define M_ARENA_TEST -7

#define M_ARENA_MAX -8

#ifndef M_MXFAST

# define M_MXFAST 1 /* maximum request size for "fastbins" */

#endif

#ifndef M_NLBLKS

# define M_NLBLKS 2 /* UNUSED in this malloc */

#endif

#ifndef M_GRAIN

# define M_GRAIN 3 /* UNUSED in this malloc */

#endif

#ifndef M_KEEP

# define M_KEEP 4 /* UNUSED in this malloc */

#endif

Table 1. mallopt() Parameters Mapped to Environment Variables

mallopt() param选择

bash环境变量

value默认推荐值

备注

M_TRIM_THRESHOLD

MALLOC_TRIM_THRESHOLD_

128KB

-1U disables

M_TOP_PAD

MALLOC_TOP_PAD_

0

M_MMAP_THRESHOLD

MALLOC_MMAP_THRESHOLD_

128KB

0 disables

M_MMAP_MAX

MALLOC_MMAP_MAX_

64

0 disables

函数返回值1表示成功,0表示失败并修改全局变量errno;

c语言头文件malloc,头文件malloc.h:函数 mallopt()的选项相关推荐

  1. 头文件malloc.h:函数 mallopt()的选项

    下面以一个例子来说明内存分配的原理: 情况一.malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内 ...

  2. c malloc 头文件_c++个人学习笔记——1.头文件声明

    简单介绍了C++头文件声明与C语言的差异,并对常见的部分头文件作了介绍. //C++中常用写法 最简单的C++程序往往是上面这样声明头文件. #include为C/C++中包含头文件命令,用于将指定头 ...

  3. C语言再学习 -- 常用头文件和函数(转)

    参看:C/C++常用头文件及函数汇总 linux常用头文件如下: POSIX标准定义的头文件 <dirent.h>        目录项 <fcntl.h>         文 ...

  4. C语言semaphore头文件,C语言再学习 -- 常用头文件和函数

    Linux常用头文件如下: POSIX标准定义的头文件 < dirent.h>        目录项 < fcntl.h>         文件控制 < fnmatch. ...

  5. C语言两种导入头文件的区别

    C语言两种导入头文件的区别 #include<stdio.h> 和 #include"stdio.h" 这两种导入头文件的区别: 区别在于编译器查找头文件的顺序, &q ...

  6. C语言的头文件和库文件(函数库)

    C语言的头文件和库文件(函数库) 分类: Unix环境高级编程 2011-04-17 14:37 2576人阅读 评论(1) 收藏 举报 语言cgcclinuxunix 在C语言中,头文件提供对常量的 ...

  7. mp4文件时长 c++源码_【C语言】如何使用头文件 .h 编译 C 源码!so easy!

    在 C 语言中,头文件或包含文件通常是一个源代码文件,程序员使用编译器指令将头文件包含进其他源文件的开始(或头部),由编译器在处理另一个源文件时自动包含进来. 一个头文件一般包含类.子程序.变量和其他 ...

  8. C语言头文件、库文件的查找路径

    一.讨论环境 *操作系统:Redhat5/Fedora14 *编译器:gcc 4.5.1 以下言论仅确保在以上环境中,绝对正确.别的环境,大家可以通过类比方法,得到启示. 二.C语言头文件的查找路径 ...

  9. linux c之c语言符合标准的头文件和linux常用头文件

    1.C语言符合标准的头文件 #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h ...

  10. 单片机c语言怎样添加自定义头文件,单片机C语言编程与或|头文件常见问题

    一.常见问题 1.头文件reg51.h和reg52.h其实是一样的,大家两个都可以用. 2.main()前面的void可加可不加,反正都是无返回值函数. 3.不是每一个程序都要用到死循环while(1 ...

最新文章

  1. Python可视化应用实战-三万字长文(建议收藏)matplotlib可视化实例,实操有效
  2. 阿联酋是发达国家还是发展中国家
  3. 玛丽莲·梦露从未公开的照片
  4. python中int是什么的缩写_python中int是什么类型
  5. 2.2 string
  6. 【数据结构与算法】比较法分析查找算法与查找结构
  7. 安卓案例:利用内容提供者显示和添加联系人
  8. Objective-C SQLiteHelper
  9. 蚂蚁金服开源服务注册中心 SOFARegistry
  10. unity3d 脚本学习系列
  11. 基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计
  12. 使用 Office Web 组件参考文档
  13. 课后作业3:软件分析与用户体验分析
  14. python安装包时报错Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools
  15. 基于netvibes源码实现类似igoogle的个性化主页
  16. 第十一课 区块链常用共识算法介绍
  17. 微信小游戏子域中请求微信头像,cocos create会自动添加前缀的问题
  18. OA系统实现(请假审批,mybatis)-2
  19. 井字游戏(shell高级版)
  20. 虚拟ip+keeplalived+nginx 负载实现

热门文章

  1. 方舟外服服务器网站,方舟外服开服表,固定更新
  2. 对抗 | 利用de4dot解密被混淆的.NET代码
  3. mongoVUE的增删改查操作使用说明
  4. 解决安装VC2015失败的问题
  5. Ubuntu系统周立功CAN驱动安装及常见问题
  6. 测试驱动开发心得体会
  7. 【转载】Junit4详解一:Junit总体介绍
  8. Android Studio 安装TinyPng插件
  9. 麻瓜编程python爬虫微专业_微专业:Python Web开发工程师(零基础课程),麻瓜编程侯爵主讲 价值2400元...
  10. java购物系统需求分析_java网上购物系统需求分析.doc