免费注册 查看新帖 |

Chinaunix

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

关于内存文件映射问题? [复制链接]

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

  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)

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-11-07 14:47 |只看该作者
原帖由 xzsxiao213 于 2008-11-7 11:56 发表

#include
#include
#include
#include
#include
#include

#define uchar unsigned char
#define           USER_PATH                       "/home/user"
#define LTH_USER        48

int main()
{
    uchar *from ...



看看这个帖子:
http://linux.chinaunix.net/bbs/thread-1042535-1-2.html

论坛徽章:
0
3 [报告]
发表于 2008-11-07 15:21 |只看该作者
看了下那篇帖子,可是跟我的环境不一样,我的内核是2.4.18的,在arm9开发平台上测试了

free中,根本没有cache

按照那帖子中提到的思路,我的应用程序中该怎么告诉内核立刻执行清除工作呢?
我的/proc/sys/vm里根本就没有drop_caches

[ 本帖最后由 xzsxiao213 于 2008-11-7 15:35 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-11-07 15:33 |只看该作者
原帖由 xzsxiao213 于 2008-11-7 15:21 发表
看了下那篇帖子,可是跟我的环境不一样,我的内核是2.4.18的,在arm9开发平台上测试了

free中,根本没有cache

按照那帖子中提到的思路,我的应用程序中该怎么告诉内核立刻执行清除工作呢?
我的内核里根 ...



内核对内存的释放,是需要经历一段页面时间的老化,并不是用了马上就释放的,除非你强制性的执行释放。

论坛徽章:
0
5 [报告]
发表于 2008-11-07 15:47 |只看该作者
那么,在在解除映射的时候有什么办法能执行强制释放呢;如果没有释放,我的程序退出了,再重新启动的时候 有时候会重新在新的地址进行映射(内存有增加了一个文件的大小,如果这样,循环几次,内存都没了),不过有时候会在原来的地址进行映射;

[ 本帖最后由 xzsxiao213 于 2008-11-7 15:59 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2008-11-07 15:58 |只看该作者
原帖由 xzsxiao213 于 2008-11-7 15:47 发表
那么,在在解除映射的时候有什么办法能执行强制释放呢;如果没有释放,我的程序退出了,再重新启动的时候 有时候会重新在新的地址进行映射(内存有增加了一个文件的大小,如果这样,循环几次,内存都没了),不 ...


你看到的是这个程序运行的情况,等这个进程退出以后,你再调用free看一下会是什么结果?

论坛徽章:
0
7 [报告]
发表于 2008-11-07 16:00 |只看该作者
你看到的是这个程序运行的情况,等这个进程退出以后,你再调用free看一下会是什么结果?


这个操作我试过了,映射文件的内存没有释放

我还测试一个方法 :我删除文件的内容,内存就会立刻被释放了,但在实际的应用程序中可不能这么做啊?

[ 本帖最后由 xzsxiao213 于 2008-11-7 16:02 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-11-07 17:25 |只看该作者
原帖由 xzsxiao213 于 2008-11-7 16:00 发表


这个操作我试过了,映射文件的内存没有释放

我还测试一个方法 :我删除文件的内容,内存就会立刻被释放了,但在实际的应用程序中可不能这么做啊?


进程退出了,它所占用的资源并不能立即释放掉,而要等待父进程回收它的资源,所以,这肯定有一个过程,需要经历一段不确定的时间段。
当然,如果你比较确定,手动删除也是未尝不可的。

论坛徽章:
0
9 [报告]
发表于 2008-11-07 19:54 |只看该作者
说来说去,也只能任它这样了,反正系统迟早会回收它的

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2008-11-07 21:51 |只看该作者
原帖由 xzsxiao213 于 2008-11-7 19:54 发表
说来说去,也只能任它这样了,反正系统迟早会回收它的


系统本身就是一把双刃剑,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP