免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2008-04-02 15:51 |只看该作者
原帖由 思一克 于 2008-4-2 15:50 发表
无论如何, 你向内存写东西了(比如每页开始写几个BYTES), 就必须有物理内存分配了.

不会吧?
应该是不占内存才对。

论坛徽章:
0
12 [报告]
发表于 2008-04-02 16:16 |只看该作者
读写的对象一定是物理内存呀. 否则往那里读写?

MMAP的内容物理内存可能在cached(?我没有具体确认).

原帖由 flw 于 2008-4-2 15:51 发表

不会吧?
应该是不占内存才对。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2008-04-02 16:26 |只看该作者
原帖由 思一克 于 2008-4-2 16:16 发表
读写的对象一定是物理内存呀. 否则往那里读写?

MMAP的内容物理内存可能在cached(?我没有具体确认).


那个和 malloc 性质不同的吧。

论坛徽章:
0
14 [报告]
发表于 2008-04-02 16:36 |只看该作者
大致相同.

原帖由 flw 于 2008-4-2 16:26 发表

那个和 malloc 性质不同的吧。

论坛徽章:
0
15 [报告]
发表于 2008-04-02 16:37 |只看该作者
mmap的不占用物理内存,内核会检查到缺页,然后知道是mmap文件的,所以会进行文件操作,具体细节忘了
如果是普通内存,就像版主说的,当写的时候缺页导致物理内存的分配

论坛徽章:
0
16 [报告]
发表于 2008-04-02 16:42 |只看该作者
就是mmap和malloc都是取得虚内存, 使用时候通过缺页获得物理内存的.

原帖由 flw2 于 2008-4-2 16:37 发表
mmap的不占用物理内存,内核会检查到缺页,然后知道是mmap文件的,所以会进行文件操作,具体细节忘了
如果是普通内存,就像版主说的,当写的时候缺页导致物理内存的分配

论坛徽章:
0
17 [报告]
发表于 2008-04-02 16:47 |只看该作者
原帖由 思一克 于 2008-4-2 16:42 发表
就是mmap和malloc都是取得虚内存, 使用时候通过缺页获得物理内存的.


恩是,但是版主忽略了mmap的fd参数,如果没有fd是类似的,malloc很可能都是用mmap(无fd)实现的

论坛徽章:
0
18 [报告]
发表于 2008-04-02 16:48 |只看该作者
不是可能(无论有无fd)而是malloc本来就要靠mmap实现.

原帖由 flw2 于 2008-4-2 16:47 发表

恩是,但是版主忽略了mmap的fd参数,如果没有fd是类似的,malloc很可能都是用mmap(无fd)实现的

论坛徽章:
0
19 [报告]
发表于 2008-04-02 16:54 |只看该作者
原帖由 思一克 于 2008-4-2 16:48 发表
不是可能(无论有无fd)而是malloc本来就要靠mmap实现.


这也未必吧
不过mmap对文件映射的时候确实是不像普通的mmap然后写一样耗费内存的

#include <stdio.h>
#include <stdlib.h>
int main()
{
        char *p;
        int i = 0;
        /* just for strace */
        write(1,"",0);

        while(i++ < 100)
                p  = malloc(4096);
        sleep(111);
}



strace ./a.out

....
munmap(0xb7f7b000, 82039)               = 0
write(1, "", 0)                         = 0
brk(0)                                  = 0x804a000
brk(0x806c000)                          = 0x806c000
brk(0x808d000)                          = 0x808d000
brk(0x80ae000)                          = 0x80ae000
brk(0x80cf000)                          = 0x80cf000
rt_sigprocmask(SIG_BLOCK, [CHLD], [], = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, = 0
nanosleep({111, 0},  <unfinished ...>

论坛徽章:
0
20 [报告]
发表于 2008-04-02 16:57 |只看该作者
LINUX下是这样的,
你malloc很小空间时候, 是靠brk实现的.
你malloc很大(比如128M以上的时候)是靠mmap实现.

brk和mmap都是系统调用.

所以我说malloc本来就是用mmap实现就是这意思.

原帖由 flw2 于 2008-4-2 16:54 发表

这也未必吧
不过mmap对文件映射的时候确实是不像普通的mmap然后写一样耗费内存的

#include
#include
int main()
{
        char *p;
        int i = 0;
        /* just for strace */
        ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP