Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8053838
  • 博文数量: 594
  • 博客积分: 13065
  • 博客等级: 上将
  • 技术积分: 10324
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-26 16:44
个人简介

推荐: blog.csdn.net/aquester https://github.com/eyjian https://www.cnblogs.com/aquester http://blog.chinaunix.net/uid/20682147.html

文章分类

全部博文(594)

分类: LINUX

2014-04-10 16:22:22


  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 > 1)? 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.     
  38.     str[1] = (char*)malloc(BYTES);
  39.     printf("%dBYTES allocated, press ENTER to continue", BYTES);
  40.     getchar();

  41.     str[2] = (char*)malloc(BYTES);
  42.     printf("%dBYTES allocated, press ENTER to continue", BYTES);
  43.     getchar();

  44.     printf("FREE phase, press ENTER to continue");
  45.     getchar();

  46.     free(str[0]);
  47.     printf("%dBYTES freed, press ENTER to continue", BYTES);
  48.     getchar();

  49.     free(str[1]);
  50.     printf("%dBYTES freed, press ENTER to continue", BYTES);
  51.     getchar();

  52.     free(str[2]);
  53.     printf("%dBYTES freed, press ENTER to continue", BYTES);
  54.     getchar();

  55.     printf("Press ENTER to exit\n");
  56.     getchar();

  57.     return 0;
  58. }


阅读(3658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~