免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4585 | 回复: 15
打印 上一主题 下一主题

free的内存何时归还给系统 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-26 09:08 |只看该作者 |正序浏览
如下代码在执行完free之后,内存会交还给系统,也就是说used在free()之后会减少很多;
如果把#if 1 改成 #if 0,则内存似乎没有还给系统。这是什么原因呢。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #if 1
  5. #define MALLOC_BLOCK_COUNTS 1024
  6. #define MALLOC_BLOCK_SIZE  (2 * 1024 * 1024)
  7. #else
  8. #define MALLOC_BLOCK_SIZE 1024
  9. #define MALLOC_BLOCK_COUNTS  (2 * 1024 * 1024)
  10. #endif

  11. static char *ptr[MALLOC_BLOCK_COUNTS];

  12. int
  13. main(int argc, char **argv)
  14. {
  15.     long long i, j;

  16.     memset(ptr, 0x0, sizeof(ptr));
  17.     for (i = 0; i < MALLOC_BLOCK_COUNTS; i++) {
  18.         ptr[i] = malloc(MALLOC_BLOCK_SIZE);
  19.         if (ptr[i] == NULL) {
  20.             perror("malloc()");
  21.             exit(-1);
  22.         }

  23.         for (j = 0; j < MALLOC_BLOCK_SIZE; j++) {
  24.             *(ptr[i] + j) = j % 256;
  25.         }
  26.     }

  27.     for (i = 0; i < MALLOC_BLOCK_COUNTS; i++) {
  28.         free(ptr[i]);
  29.     }

  30.     printf("ok\n");
  31.     sleep(1000);
  32.     return 0;
  33. }
复制代码

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
16 [报告]
发表于 2010-08-26 17:44 |只看该作者
回复 13# bigcren


    看错问题了。 见LZ2位的回答.

论坛徽章:
0
15 [报告]
发表于 2010-08-26 17:39 |只看该作者
本帖最后由 cx6445 于 2010-08-26 17:58 编辑

函数malloc和free在申请释放内存时,不是直接向kernel申请的,是通过glibc进行管理的。glibc又是怎么管理内存的?网上资料一堆,自己瞅吧。

论坛徽章:
0
14 [报告]
发表于 2010-08-26 17:29 |只看该作者
没有规定说free后一定要归还给OS系统,实际上是堆里的操作.
system888net 发表于 2010-08-26 16:32


归还给系统的意思可题供其他程序再分配吧。
分配的代价根据内存的类型不同而不同,比如 buffers > cached > free 吧。
但是这两个程序的执行完 cached + free + buffers 确有着显著的不同。

论坛徽章:
0
13 [报告]
发表于 2010-08-26 17:24 |只看该作者
free是用户空间概念.free完毕即认为归还给系统了.
而free完的后能用不能用完全是你守不守规则的问题.你使用 ...
smalloc 发表于 2010-08-26 16:09


你的意思是我的程序里有没守规则的地方?

论坛徽章:
0
12 [报告]
发表于 2010-08-26 17:06 |只看该作者
这个好像OS是不会随时回收的吧

论坛徽章:
0
11 [报告]
发表于 2010-08-26 16:32 |只看该作者
没有规定说free后一定要归还给OS系统,实际上是堆里的操作.

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
10 [报告]
发表于 2010-08-26 16:09 |只看该作者
free是用户空间概念.free完毕即认为归还给系统了.
而free完的后能用不能用完全是你守不守规则的问题.你使用不属于你的东西也是可以的,但是是非法的.

论坛徽章:
0
9 [报告]
发表于 2010-08-26 11:47 |只看该作者
OMG,看错了。。

测试了下,在我的系统上两者情况基本一致,没有出现楼主说的情况。
davelv 发表于 2010-08-26 10:28


#if 1 的结果
bigcren:~/work/mysrc/mem-size$ free
                       total       used       free     shared    buffers     cached
Mem:       4110484    1916924    2193560          0     206880     532960
-/+ buffers/cache:    1177084    2933400
Swap:     19543036     144012   19399024
bigcren:~/work/mysrc/mem-size$ ./malloc_free
okkkkkkkkkkkkkkkkk

在另一个shell里面运行free
bigcren:~/work/mysrc/mylist$ free
                       total       used       free     shared    buffers     cached
Mem:       4110484    1904352    2206132          0     202816     523928
-/+ buffers/cache:    1177608    2932876
Swap:     19543036     144012   19399024


#if 0 的结果
bigcren:~/work/mysrc/mem-size$ free
                      total       used       free     shared    buffers     cached
Mem:       4110484    1885744    2224740          0     202932     507692
-/+ buffers/cache:    1175120    2935364
Swap:     19543036     144008   19399028
bigcren:~/work/mysrc/mem-size$ ./malloc_free
okkkkkkkkkkkkkkkkk

在另一个shell里面运行free
bigcren:~/work/mysrc/mylist$ free
                      total       used       free     shared    buffers     cached
Mem:       4110484    3968664     141820          0     192884     477524
-/+ buffers/cache:    3298256     812228
Swap:     19543036     143948   19399088

论坛徽章:
0
8 [报告]
发表于 2010-08-26 11:36 |只看该作者
回复 6# blackuhlan
那也就是说这些内存碎片是回收不回去的么?
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP