Chinaunix

标题: free的内存何时归还给系统 [打印本页]

作者: bigcren    时间: 2010-08-26 09:08
标题: free的内存何时归还给系统
如下代码在执行完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. }
复制代码

作者: pengjianbokobe    时间: 2010-08-26 09:27
如下代码在执行完free之后,内存会交还给系统,也就是说used在free()之后会减少很多;
如果把#if 1 改成 #i ...
bigcren 发表于 2010-08-26 09:08



    你怎么知道没有退还给系统?
作者: davelv    时间: 2010-08-26 09:37
额,你改成#if 0 ,那端代码就没有编译 --!
作者: egmkang    时间: 2010-08-26 09:47
额,你改成#if 0 ,那端代码就没有编译 --!
davelv 发表于 2010-08-26 09:37


你再看看
作者: davelv    时间: 2010-08-26 10:28
本帖最后由 davelv 于 2010-08-26 10:39 编辑
你再看看
egmkang 发表于 2010-08-26 09:47

OMG,看错了。。

测试了下,在我的系统上两者情况基本一致,没有出现楼主说的情况。
作者: blackuhlan    时间: 2010-08-26 10:59
楼主想过什么叫内存碎片没?你这种就是。你还可以将size定为1个字节,更碎
作者: bigcren    时间: 2010-08-26 11:36
回复 2# pengjianbokobe
我用free查看的,因为申请的比较多,此时也没有别的大量使用内存的程序,如果归还了,那么内存种used的抖动会很大。
作者: bigcren    时间: 2010-08-26 11:36
回复 6# blackuhlan
那也就是说这些内存碎片是回收不回去的么?
作者: bigcren    时间: 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
作者: smalloc    时间: 2010-08-26 16:09
free是用户空间概念.free完毕即认为归还给系统了.
而free完的后能用不能用完全是你守不守规则的问题.你使用不属于你的东西也是可以的,但是是非法的.
作者: system888net    时间: 2010-08-26 16:32
没有规定说free后一定要归还给OS系统,实际上是堆里的操作.
作者: chinesedragon    时间: 2010-08-26 17:06
这个好像OS是不会随时回收的吧
作者: bigcren    时间: 2010-08-26 17:24
free是用户空间概念.free完毕即认为归还给系统了.
而free完的后能用不能用完全是你守不守规则的问题.你使用 ...
smalloc 发表于 2010-08-26 16:09


你的意思是我的程序里有没守规则的地方?
作者: bigcren    时间: 2010-08-26 17:29
没有规定说free后一定要归还给OS系统,实际上是堆里的操作.
system888net 发表于 2010-08-26 16:32


归还给系统的意思可题供其他程序再分配吧。
分配的代价根据内存的类型不同而不同,比如 buffers > cached > free 吧。
但是这两个程序的执行完 cached + free + buffers 确有着显著的不同。
作者: cx6445    时间: 2010-08-26 17:39
本帖最后由 cx6445 于 2010-08-26 17:58 编辑

函数malloc和free在申请释放内存时,不是直接向kernel申请的,是通过glibc进行管理的。glibc又是怎么管理内存的?网上资料一堆,自己瞅吧。
作者: smalloc    时间: 2010-08-26 17:44
回复 13# bigcren


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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2