免费注册 查看新帖 |

Chinaunix

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

内存文件映射的奇怪问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-07 13:41 |只看该作者 |倒序浏览

  1. #include <sys/stat.h>
  2. #include <sys/mman.h>
  3. #include <fcntl.h>
  4. #include <sys/types.h>
  5. #include <stdlib.h>
  6. #include <errno.h>

  7. #define uchar unsigned char
  8. #define           USER_PATH                       "/home/user"
  9. #define LTH_USER        48

  10. int main()
  11. {
  12.     uchar *from, temp;
  13.     uchar buf[100];
  14.     long i;
  15.     int fd;
  16.     struct stat statbuf;

  17.     fd = open(USER_PATH, O_RDWR);
  18.     if (fd)
  19.     {
  20.         //获取文件大小
  21.      if ((fstat(fd, &statbuf)) < 0)        //获取失败
  22.      {
  23.              close (fd);
  24.              exit(1);
  25.         }
  26.         from = (uchar *)mmap(NULL, (size_t)statbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  27.         if (from == MAP_FAILED)                //映射失败
  28.      {
  29.         close(fd);
  30.         exit(1);
  31.         }
  32.     }
  33.     else
  34.     {
  35.          exit(1);
  36.     }
  37.     printf("====================================\n");
  38.     system("free");
  39.        
  40.     for (i = 0; i < 140000; i++)
  41.     {
  42.          memcpy(buf, from + i*LTH_USER, LTH_USER);
  43.          if (buf[47] == 0x01)
  44.         continue;
  45.          buf[47] = 0x01;
  46.      }
  47.      printf("====================================\n");
  48.      system("free");
  49.        
  50.      munmap(from, (size_t)statbuf.st_size);
  51.      printf("====================================\n");
  52.      system("free");
  53.        
  54.      close (fd);
  55.      printf("====================================\n");
  56.      system("free");
  57. }
复制代码


上面代码的运行结果如下:
====================================
              total         used         free       shared      buffers
Mem:     62676       4908        57768            0            4
Swap:         0           0             0
Total:     62676       4908        57768
====================================
              total         used         free       shared      buffers
Mem:     62676       11480      51196            0            4
Swap:         0            0              0
Total:     62676       11480      51196
====================================
              total         used         free       shared      buffers
Mem:     62676       11480      51196            0            4
Swap:         0            0              0
Total:     62676       11480      51196
====================================
              total         used         free       shared      buffers
Mem:     62676       11480      51196            0            4
Swap:         0            0              0
Total:     62676       11480      51196


我的问题是,为什么内存没有释放掉?(注:被映射的文件比较大6720480 bytes)

内核2.4.18, ARM9开发平台上测试

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2008-11-07 22:40 |只看该作者
即使嵌入式设备也算个多任务系统吧,看系统物理内存似乎不妥。看进程的物理内存,内存core image和虚拟内存合理些,我用"ps -p pid -o rss,sz,vsize"替换了free,符合预期,结果如下:
====================================
RSS    SZ   VSZ
324  3372 13488
====================================
RSS    SZ   VSZ
6888  3372 13488
====================================
RSS    SZ   VSZ
324   812  3248
====================================
RSS    SZ   VSZ
324   812  3248

论坛徽章:
0
3 [报告]
发表于 2008-11-07 23:49 |只看该作者
http://linux.chinaunix.net/bbs/thread-1043554-1-1.html
我在另外版块问了这个问题,看来,我用free看到统计的内存是没什么好担心的了,只要程序按正常的操作就可以了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP