1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. // #include <malloc.h>
  5. // int mallopt(int param, int value);
  6. // info mallopt, 一些系统可以man mallopt
  7. // M_TRIM_THRESHOLD: 紧缩内存阈值,对应的环境变量为MALLOC_TRIM_THRESHOLD_
  8. // M_MMAP_THRESHOLD: 使用mmap而非brk/sbrk分配内存阈值,即超过该值的malloc分配将使用mmap
  9. // ,否则使用brk/sbrk分配内存,对应的环境变量为MALLOC_MMAP_THRESHOLD_
  10. // 请注意:如今的glibc使用了动态的阈值,初始值为128*1024,
  11. // 下限为0,上限由DEFAULT_MMAP_THRESHOLD_MAX决定,32位系统为512*1024,64位系统为4*1024*1024*sizeof(long)
  12. // mmap分配内存必须是页对齐的:
  13. // Allocating memory using mmap(2) has the significant advantage that the allocated memory blocks can always be independently
  14. // released back to the system. (By contrast, the heap can be trimmed only if memory is freed at the top end.)
  15. // 相关函数:
  16. // mtrace muntrace mcheck mcheck_pedantic mcheck_check_all mprobe
  17. // malloc_stats mallinfo malloc_trim malloc_info
  18. // mmap分配的内存在调用munmap后会立即返回给系统,而brk/sbrk而受M_TRIM_THRESHOLD的影响
  19. // 但brk/sbrk分配的内存是否立即归还给系统,不仅受M_TRIM_THRESHOLD的影响,还要看高地址端(栓)的内存是否已经释放:
  20. // 假如依次malloc了str1、str2、str3,即使它们都是brk/sbrk分配的,如果没有释放str3,只释放了str1和str2,
  21. // 就算两者加起来超过了M_TRIM_THRESHOLD,因为str3的存在,str1和str2也不能立即归还可以系统,但可以被重用
  22. // 更多信息,请参考man手册:http://man7.org/linux/man-pages/man3/mallopt.3.html
  23. // argv[1] 每次分配的字节数,如果没有指定,则使用32
  24. // 请观察不同值时malloc和free的行为
  25. // 当argv[1]为131072,即为128K时,使用的是mmap分配,每一步的malloc和free都可以从top中观察到反应
  26. // gcc -g -o x x.c
  27. int main(int argc, char* argv[])
  28. {
  29. char* str[3];
  30. int BYTES = (argc > 0)? atoi(argv[1]): 32;
  31. // 128 * 1024 = 131072
  32. printf("\nPlease type \"top -p %d\" to watch VIRT, press ENTER to continue", getpid());
  33. getchar();
  34. str[0] = (char*)malloc(BYTES);
  35. printf("%dBYTES allocated, press ENTER to continue", BYTES);
  36. getchar();
  37. str[1] = (char*)malloc(BYTES);
  38. printf("%dBYTES allocated, press ENTER to continue", BYTES);
  39. getchar();
  40. str[2] = (char*)malloc(BYTES);
  41. printf("%dBYTES allocated, press ENTER to continue", BYTES);
  42. getchar();
  43. printf("FREE phase, press ENTER to continue");
  44. getchar();
  45. free(str[0]);
  46. printf("%dBYTES freed, press ENTER to continue", BYTES);
  47. getchar();
  48. free(str[1]);
  49. printf("%dBYTES freed, press ENTER to continue", BYTES);
  50. getchar();
  51. free(str[2]);
  52. printf("%dBYTES freed, press ENTER to continue", BYTES);
  53. getchar();
  54. printf("Press ENTER to exit\n");
  55. getchar();
  56. return 0;
  57. }

brk/sbrk和mmap行为分析程序的更多相关文章

  1. brk(), sbrk() 用法详解

    brk() , sbrk() 的声明如下: #include <unistd.h> int brk(void *addr); void *sbrk(intptr_t increment); ...

  2. brk(), sbrk() 用法详解【转】

    转自:http://blog.csdn.net/sgbfblog/article/details/7772153 贴上原文地址,好不容易找到了:brk(), sbrk() -- 改变数据段长度 brk ...

  3. google perftools分析程序性能

    Google perftools 1.功能简介 它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数(得到函数之间的调用关系)耗时情况一目 ...

  4. 调试技巧 —— 如何利用windbg + dump + map分析程序异常

    调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传   调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...

  5. [大数据从入门到放弃系列教程]第一个spark分析程序

    [大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...

  6. 通过官方API结合源码,如何分析程序流程

    通过官方API结合源码,如何分析程序流程通过官方API找到我们关注的API的某个方法,然后把整个流程执行起来,然后在idea中,把我们关注的方法打上断点,然后通过Step Out,从内向外一层一层分析 ...

  7. python cProfile分析程序性能

    转自:http://xianglong.me/article/analysis-python-application-performance-using-cProfile/?utm_source=tu ...

  8. 作业十一——LL(1)文法的判断,递归下降分析程序

    作业十一——LL(1)文法的判断,递归下降分析程序 判断是否为LL(1)文法 选取有多个产生式的求select,只有一条产生式的无需求select 同一个非终结符之间求交集,全部判断为空后则为LL(1 ...

  9. cProfile分析程序性能

    Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...

随机推荐

  1. rest异常框架

    好的工具:postman 教程:http://blog.csdn.net/ye1992/article/details/49998511 RuntimeMXBean是Java 虚拟机的运行时系统的管理 ...

  2. [三卷天书]ajax请求时接收到乱码的处理方案

    $.ajax({ url: "getmore.ashx", type: "post", dataType: "text", data: { ...

  3. SCSI, (P)ATA, SAS, NL-SAS and SATA, what’s the difference?

    Everybody needs storage space nowadays. Whether it is used for high performance computing or simply ...

  4. OBS第三方推流直播教程

    第三方推流使用场景 1.当使用YY客户端进行直播遇到问题,暂无解决方法的时候,可以使用第三方直播软件OBS进行推流. 2.对OBS情有独钟的主播. OBS简介: OBS是一款比较好用的开源直播软件,目 ...

  5. Altium Designer之多图纸设计

    Altium Designer的多图纸功能感觉比较方便:今天翻了下徐老师<Altium Designer 快速入门>里面关于多图纸设计的介绍,再参考了altium 网站的一些资料,算是摸熟 ...

  6. 为何指针初始化为NULL

    指针初始化为NULL,指向NULL指针区(大小64K),如果读取或写入这个地址,会引发内存写保护异常 版权声明:本文为博主原创文章,未经博主允许不得转载.

  7. DNS 解析流程

    DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工 ...

  8. Python Twisted系列教程2:异步编程初探与reactor模式

    作者:dave@http://krondo.com/slow-poetry-and-the-apocalypse/  译者:杨晓伟(采用意译) 这个系列是从这里开始的,欢迎你再次来到这里来.现在我们可 ...

  9. flask系列二之基础知识

    一.调试模式(debug模式) 1.设置debug模式 在app.run()中传入关键字参数debug,app.run(debug=Ture),就设置当前项目为debug模式.如下所示: # 从fla ...

  10. VMWARE三种网络配置

    由于linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费.那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有vmware workstations ...