免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 印随
打印 上一主题 下一主题

[C] mmap内存占用问题 [复制链接]

论坛徽章:
0
71 [报告]
发表于 2008-04-03 15:50 |只看该作者
和malloc类似, 你free之后物理内存未必是立即归还系统的.

我实验了, 将整个的全部映射都munmap后还是归还的.

flw考虑的有道理.

原帖由 印随 于 2008-4-3 15:33 发表
采用分段
简单使用munmap,  释放一个分段, 好像没有什么效果
不能释放内存

论坛徽章:
0
72 [报告]
发表于 2008-04-03 15:56 |只看该作者
如果munmap还不归还,那就没法归还了,就算内核暂时不回收,那么它也是属于内核管理的

论坛徽章:
0
73 [报告]
发表于 2008-04-03 16:14 |只看该作者
我刚才写了个例子
main()
{
    映射1G;
    遍历访问1G内存;

    munmap();

    打印“释放完毕”;
    sleep(100000);
}
当我看到   “释放完毕”  的时候,
等待5分钟后,由free -m   可以看出,  内存没有释放
当kill掉这个程序后,内存就马上被释放,  

内核是怎么处理这个过程的?

[ 本帖最后由 印随 于 2008-4-3 16:16 编辑 ]

论坛徽章:
0
74 [报告]
发表于 2008-04-03 16:34 |只看该作者
mmap不真正的占有内存,要说占有,也是内核中的一小点内存。malloc最终使用brk或者是mmap,具体的界限我不清楚。
大文件映射成一段,和映射成多段,我看不出来有什么区别,除了映射2G以上文件外,知道其中区别的朋友请多多指教,
至于内存在munmap后不释放,这个和缓冲有关。内核不会把不用的内存页立刻释放。可以参考《情景分析》,里面很详细的说明了。

论坛徽章:
0
75 [报告]
发表于 2008-04-03 16:38 |只看该作者
我想lz的现象应该是linux cache机制引起。

论坛徽章:
0
76 [报告]
发表于 2008-04-03 16:38 |只看该作者
释放的. 你用system("cat /proc/self/status")
中的VMRSS的数值.

free -m不一定准确.


Name:   a.out
State:  S (sleeping)
SleepAVG:       78%
Tgid:   24446
Pid:    24446
PPid:   23055
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0
VmPeak:     1532 kB
VmSize:     1444 kB
VmLck:         0 kB
VmHWM:       320 kB
VmRSS:       320 kB
VmData:       20 kB
VmStk:        84 kB
VmExe:         4 kB
VmLib:      1308 kB
VmPTE:        12 kB
Threads:        1
SigQ:   0/4095
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000006
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
Cpus_allowed:   00000001
Mems_allowed:   1
361 80 67 1 0 26 0
j = 111134 k = 24446
src = 0x77e3f000
0 c = 0x77e40000 0xb7e3f000
4096 c = 0x78e40000 0xb7e3f000
8192 c = 0x79e40000 0xb7e3f000
12288 c = 0x7ae40000 0xb7e3f000
16384 c = 0x7be40000 0xb7e3f000
20480 c = 0x7ce40000 0xb7e3f000
24576 c = 0x7de40000 0xb7e3f000
28672 c = 0x7ee40000 0xb7e3f000
32768 c = 0x7fe40000 0xb7e3f000
36864 c = 0x80e40000 0xb7e3f000
40960 c = 0x81e40000 0xb7e3f000
45056 c = 0x82e40000 0xb7e3f000
49152 c = 0x83e40000 0xb7e3f000
53248 c = 0x84e40000 0xb7e3f000
57344 c = 0x85e40000 0xb7e3f000
61440 c = 0x86e40000 0xb7e3f000
65536 c = 0x87e40000 0xb7e3f000
69632 c = 0x88e40000 0xb7e3f000
73728 c = 0x89e40000 0xb7e3f000
77824 c = 0x8ae40000 0xb7e3f000
81920 c = 0x8be40000 0xb7e3f000
86016 c = 0x8ce40000 0xb7e3f000
90112 c = 0x8de40000 0xb7e3f000
94208 c = 0x8ee40000 0xb7e3f000
98304 c = 0x8fe40000 0xb7e3f000
102400 c = 0x90e40000 0xb7e3f000
106496 c = 0x91e40000 0xb7e3f000
110592 c = 0x92e40000 0xb7e3f000
Name:   a.out
State:  R (running)
SleepAVG:       68%
Tgid:   24446
Pid:    24446
PPid:   23055
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0
VmPeak:  1050024 kB
VmSize:  1050024 kB
VmLck:         0 kB
VmHWM:    444908 kB
VmRSS:    444908 kB
VmData:       24 kB
VmStk:        84 kB
VmExe:         4 kB
VmLib:      1308 kB
VmPTE:       452 kB
Threads:        1
SigQ:   0/4095
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000006
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
Cpus_allowed:   00000001
Mems_allowed:   1
262506 111227 111213 1 0 27 0
Name:   a.out
State:  R (running)
SleepAVG:       68%
Tgid:   24446
Pid:    24446
PPid:   23055
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0
VmPeak:  1050024 kB
VmSize:     1448 kB
VmLck:         0 kB
VmHWM:    444908 kB
VmRSS:       372 kB
VmData:       24 kB
VmStk:        84 kB
VmExe:         4 kB
VmLib:      1308 kB
VmPTE:        12 kB
Threads:        1
SigQ:   0/4095
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000006
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
Cpus_allowed:   00000001
Mems_allowed:   1
362 93 79 1 0 27 0

论坛徽章:
0
77 [报告]
发表于 2008-04-03 21:24 |只看该作者
楼上几位说得对, Linux 允许所有的内存作file cache.

munmap 释放进程空间+物理内存。如果是匿名mmap,释放的物理内存在 "free -m" 的 "free" 列;如果是普遍文件mmap,释放的物理内存在 "free -m" 的 "cached" 列。cached memory 属准释放态物理内存。当系统的free memory list size小于pages_low,swap daemon启动,先偷换cached memory。

传统清除cache的方法是运行一个小程序,狂分配内存,迫使swap daemon偷换cached memory。程序退出,内存回到free list.

Linux 2.6.16+, 支持drop_caches
  1. $echo n > /proc/sys/vm/drop_caches
  2.     n=1, dentries/inodes cache
  3.     n=2, pagecache + 1
  4.     n=3, all cached objects
复制代码

[ 本帖最后由 Alligator27 于 2008-4-6 23:24 编辑 ]

论坛徽章:
0
78 [报告]
发表于 2008-04-04 11:40 |只看该作者
原帖由 solegoose 于 2008-4-3 09:34 发表
malloc最终使用brk或者是mmap,具体的界限我不清楚。


#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
#define DEFAULT_MMAP_THRESHOLD_MAX (8 * 1024 * 1024 * sizeof(long))

如果不修改的话, malloc一个128K以上的区域就动用mmap了, 要提升brk到很高, 可以尝试malloc小块内存很多次.

论坛徽章:
0
79 [报告]
发表于 2008-04-04 12:23 |只看该作者
我是来学习的

论坛徽章:
0
80 [报告]
发表于 2008-04-04 21:43 |只看该作者
受教受教,不是很懂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP