brk/sbrk和mmap行为分析程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
// #include <malloc.h>
// int mallopt(int param, int value);
// info mallopt, 一些系统可以man mallopt
// M_TRIM_THRESHOLD: 紧缩内存阈值,对应的环境变量为MALLOC_TRIM_THRESHOLD_
// M_MMAP_THRESHOLD: 使用mmap而非brk/sbrk分配内存阈值,即超过该值的malloc分配将使用mmap
// ,否则使用brk/sbrk分配内存,对应的环境变量为MALLOC_MMAP_THRESHOLD_
// 请注意:如今的glibc使用了动态的阈值,初始值为128*1024,
// 下限为0,上限由DEFAULT_MMAP_THRESHOLD_MAX决定,32位系统为512*1024,64位系统为4*1024*1024*sizeof(long)
// mmap分配内存必须是页对齐的:
// Allocating memory using mmap(2) has the significant advantage that the allocated memory blocks can always be independently
// released back to the system. (By contrast, the heap can be trimmed only if memory is freed at the top end.)
// 相关函数:
// mtrace muntrace mcheck mcheck_pedantic mcheck_check_all mprobe
// malloc_stats mallinfo malloc_trim malloc_info
// mmap分配的内存在调用munmap后会立即返回给系统,而brk/sbrk而受M_TRIM_THRESHOLD的影响
// 但brk/sbrk分配的内存是否立即归还给系统,不仅受M_TRIM_THRESHOLD的影响,还要看高地址端(栓)的内存是否已经释放:
// 假如依次malloc了str1、str2、str3,即使它们都是brk/sbrk分配的,如果没有释放str3,只释放了str1和str2,
// 就算两者加起来超过了M_TRIM_THRESHOLD,因为str3的存在,str1和str2也不能立即归还可以系统,但可以被重用
// 更多信息,请参考man手册:http://man7.org/linux/man-pages/man3/mallopt.3.html
// argv[1] 每次分配的字节数,如果没有指定,则使用32
// 请观察不同值时malloc和free的行为
// 当argv[1]为131072,即为128K时,使用的是mmap分配,每一步的malloc和free都可以从top中观察到反应
// gcc -g -o x x.c
int main(int argc, char* argv[])
{
char* str[3];
int BYTES = (argc > 0)? atoi(argv[1]): 32;
// 128 * 1024 = 131072
printf("\nPlease type \"top -p %d\" to watch VIRT, press ENTER to continue", getpid());
getchar();
str[0] = (char*)malloc(BYTES);
printf("%dBYTES allocated, press ENTER to continue", BYTES);
getchar();
str[1] = (char*)malloc(BYTES);
printf("%dBYTES allocated, press ENTER to continue", BYTES);
getchar();
str[2] = (char*)malloc(BYTES);
printf("%dBYTES allocated, press ENTER to continue", BYTES);
getchar();
printf("FREE phase, press ENTER to continue");
getchar();
free(str[0]);
printf("%dBYTES freed, press ENTER to continue", BYTES);
getchar();
free(str[1]);
printf("%dBYTES freed, press ENTER to continue", BYTES);
getchar();
free(str[2]);
printf("%dBYTES freed, press ENTER to continue", BYTES);
getchar();
printf("Press ENTER to exit\n");
getchar();
return 0;
}
brk/sbrk和mmap行为分析程序的更多相关文章
- brk(), sbrk() 用法详解
brk() , sbrk() 的声明如下: #include <unistd.h> int brk(void *addr); void *sbrk(intptr_t increment); ...
- brk(), sbrk() 用法详解【转】
转自:http://blog.csdn.net/sgbfblog/article/details/7772153 贴上原文地址,好不容易找到了:brk(), sbrk() -- 改变数据段长度 brk ...
- google perftools分析程序性能
Google perftools 1.功能简介 它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数(得到函数之间的调用关系)耗时情况一目 ...
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传 调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...
- [大数据从入门到放弃系列教程]第一个spark分析程序
[大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...
- 通过官方API结合源码,如何分析程序流程
通过官方API结合源码,如何分析程序流程通过官方API找到我们关注的API的某个方法,然后把整个流程执行起来,然后在idea中,把我们关注的方法打上断点,然后通过Step Out,从内向外一层一层分析 ...
- python cProfile分析程序性能
转自:http://xianglong.me/article/analysis-python-application-performance-using-cProfile/?utm_source=tu ...
- 作业十一——LL(1)文法的判断,递归下降分析程序
作业十一——LL(1)文法的判断,递归下降分析程序 判断是否为LL(1)文法 选取有多个产生式的求select,只有一条产生式的无需求select 同一个非终结符之间求交集,全部判断为空后则为LL(1 ...
- cProfile分析程序性能
Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...
随机推荐
- 【ecmall】解决无法上传店铺logo和banner照片问题 (转)
问题描述:在ecmall个人用户登录,点击用户中心-店铺设置-更换店标,上传一个jpg图像(图像符合规范)后,不能预览,而且在页面底部点击提交后没有上传成功.banner店铺条幅也是一样的情况,还有下 ...
- BZOJ3790:神奇项链
浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://lydsy.com/JudgeOnline/pro ...
- git超速掌握之一(基本使用)
前言: 无论你是运维.开发还是IT爱好者,都会听说github了吧?动不动哪位大神就说在github上有什么什么项目,我的github地址是xxxxx,甚至有自己个github在找新工作时都能给自己加 ...
- git diff的使用
有时候可能睡觉时候忘记关电脑了,然后不小心触碰到键盘上某个神秘的按钮了,然后自己也不知道就提交了 就可能很悲剧 那么有时候不知道自己是否改变了哪些文件的内容 这时候就需要用到git diff git ...
- week-02 线性表
一.PTA实验作业 题目1:顺序表 7-1 最长连续递增子序列 1. 设计思路 定义结构体List,定义数组Data[maxsize]表示顺序表元素,变量Position表示位置,变量Length表示 ...
- 学习FPGA需要做哪些
有些人比较差,做了一些介绍,有误导成分.有些人水平太高,介绍的很好,但是很多人依旧听不懂,得到的肯定很少.学习FPGA,在不同层次的人明显有不同的答案. 熟悉硬件描述语言语法,不需要什么都会,但是要记 ...
- Navicat for MySQL使用手记(下)--实现自动备份数据库
五.备份和还原MySQL数据库 在数据库的管理中,备份和还原是必须做认真做的事情,如果疏忽或者做粗糙了,那么一旦数据库故障后果不堪设想,所以Navicat同样也有备份和还原的功能,相比较创建功能,其备 ...
- MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...
- Effective java笔记2--创建于销毁对象
一.创建对象的两种方式 1.提供公有的构造器. 2.提供一个返回类实例的静态方法. 二.使用静态方法创建对象 优势: 1.静态工厂方法的一个好处是,与构造函数不同,静态工厂方法具有名字.产生的客户端代 ...
- 迭代器-迭代对象-dir(a)可以查看该数据类型有多少种方法。range(10)在py3里就是一个迭代器,for循环实际就是迭代器的应用
迭代器 我们已经知道,可以直接作用于for循环的数据烈性有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str,bytes等: 一类是generator,数据结构,包括生成 ...