c语言头文件malloc,头文件malloc.h:函数 mallopt()的选项
下面以一个例子来说明内存分配的原理:
情况一、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()的选项相关推荐
- 头文件malloc.h:函数 mallopt()的选项
下面以一个例子来说明内存分配的原理: 情况一.malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内 ...
- c malloc 头文件_c++个人学习笔记——1.头文件声明
简单介绍了C++头文件声明与C语言的差异,并对常见的部分头文件作了介绍. //C++中常用写法 最简单的C++程序往往是上面这样声明头文件. #include为C/C++中包含头文件命令,用于将指定头 ...
- C语言再学习 -- 常用头文件和函数(转)
参看:C/C++常用头文件及函数汇总 linux常用头文件如下: POSIX标准定义的头文件 <dirent.h> 目录项 <fcntl.h> 文 ...
- C语言semaphore头文件,C语言再学习 -- 常用头文件和函数
Linux常用头文件如下: POSIX标准定义的头文件 < dirent.h> 目录项 < fcntl.h> 文件控制 < fnmatch. ...
- C语言两种导入头文件的区别
C语言两种导入头文件的区别 #include<stdio.h> 和 #include"stdio.h" 这两种导入头文件的区别: 区别在于编译器查找头文件的顺序, &q ...
- C语言的头文件和库文件(函数库)
C语言的头文件和库文件(函数库) 分类: Unix环境高级编程 2011-04-17 14:37 2576人阅读 评论(1) 收藏 举报 语言cgcclinuxunix 在C语言中,头文件提供对常量的 ...
- mp4文件时长 c++源码_【C语言】如何使用头文件 .h 编译 C 源码!so easy!
在 C 语言中,头文件或包含文件通常是一个源代码文件,程序员使用编译器指令将头文件包含进其他源文件的开始(或头部),由编译器在处理另一个源文件时自动包含进来. 一个头文件一般包含类.子程序.变量和其他 ...
- C语言头文件、库文件的查找路径
一.讨论环境 *操作系统:Redhat5/Fedora14 *编译器:gcc 4.5.1 以下言论仅确保在以上环境中,绝对正确.别的环境,大家可以通过类比方法,得到启示. 二.C语言头文件的查找路径 ...
- linux c之c语言符合标准的头文件和linux常用头文件
1.C语言符合标准的头文件 #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h ...
- 单片机c语言怎样添加自定义头文件,单片机C语言编程与或|头文件常见问题
一.常见问题 1.头文件reg51.h和reg52.h其实是一样的,大家两个都可以用. 2.main()前面的void可加可不加,反正都是无返回值函数. 3.不是每一个程序都要用到死循环while(1 ...
最新文章
- Python可视化应用实战-三万字长文(建议收藏)matplotlib可视化实例,实操有效
- 阿联酋是发达国家还是发展中国家
- 玛丽莲·梦露从未公开的照片
- python中int是什么的缩写_python中int是什么类型
- 2.2 string
- 【数据结构与算法】比较法分析查找算法与查找结构
- 安卓案例:利用内容提供者显示和添加联系人
- Objective-C SQLiteHelper
- 蚂蚁金服开源服务注册中心 SOFARegistry
- unity3d 脚本学习系列
- 基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计
- 使用 Office Web 组件参考文档
- 课后作业3:软件分析与用户体验分析
- python安装包时报错Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools
- 基于netvibes源码实现类似igoogle的个性化主页
- 第十一课 区块链常用共识算法介绍
- 微信小游戏子域中请求微信头像,cocos create会自动添加前缀的问题
- OA系统实现(请假审批,mybatis)-2
- 井字游戏(shell高级版)
- 虚拟ip+keeplalived+nginx 负载实现
热门文章
- 方舟外服服务器网站,方舟外服开服表,固定更新
- 对抗 | 利用de4dot解密被混淆的.NET代码
- mongoVUE的增删改查操作使用说明
- 解决安装VC2015失败的问题
- Ubuntu系统周立功CAN驱动安装及常见问题
- 测试驱动开发心得体会
- 【转载】Junit4详解一:Junit总体介绍
- Android Studio 安装TinyPng插件
- 麻瓜编程python爬虫微专业_微专业:Python Web开发工程师(零基础课程),麻瓜编程侯爵主讲 价值2400元...
- java购物系统需求分析_java网上购物系统需求分析.doc