返回信息流内存映射(mmap)和动态内存(malloc/free)分别适合哪些场景
这是一条镜像帖。来源:北邮人论坛 / cpp / #99397同步于 2019/8/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
什么时候使用内存映射(mmap)
xfcy0718
2019/8/19镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
楼上说的不对,mmap 的作用是将 virtual page 映射到 physical page / file / device,所以在特定 flag 的作用下 mmap 是可以用于内存分配的。
但是更合适的比较应该是 mmap 和 sbrk。
调用 sbrk 可以更改 program break 的位置(也就是堆顶位置),以从 heap 区获得空间。
flag |= MAP_ANONYMOUS 的 mmap 可以将 virtual page 映射到额外的 physical page,所以这部分申请的内存不是从 heap 区来的。
malloc 的经典实现是调用 sbrk,从 heap 获得内存;但是 malloc 的实现并不只限于 sbrk,也有使用到 mmap 的。
可以参考 https://stackoverflow.com/questions/30542428/does-malloc-use-brk-or-mmap 。
读整个文件的时候mmap比较好嘛?
【 在 hezhiqi734 的大作中提到: 】
: 楼上说的不对,mmap 的作用是将 virtual page 映射到 physical page / file / device,所以在特定 flag 的作用下 mmap 是可以用于内存分配的。
: 但是更合适的比较应该是 mmap 和 sbrk。
: 调用 sbrk 可以更改 program break 的位置(也就是堆顶位置),以从 heap 区获得空间。
也就是说在没有换入换出的时候mmap比malloc性能更好?
【 在 hezhiqi734 的大作中提到: 】
: 楼上说的不对,mmap 的作用是将 virtual page 映射到 physical page / file / device,所以在特定 flag 的作用下 mmap 是可以用于内存分配的。
: 但是更合适的比较应该是 mmap 和 sbrk。
: 调用 sbrk 可以更改 program break 的位置(也就是堆顶位置),以从 heap 区获得空间。
多谢,很有道理
【 在 hezhiqi734 的大作中提到: 】
: 楼上说的不对,mmap 的作用是将 virtual page 映射到 physical page / file / device,所以在特定 flag 的作用下 mmap 是可以用于内存分配的。
: 但是更合适的比较应该是 mmap 和 sbrk。
: 调用 sbrk 可以更改 program break 的位置(也就是堆顶位置),以从 heap 区获得空间。
glibc里面malloc是由ptmalloc库实现的,而工业界用的最多的就是谷歌的tcmalloc。两个库都是小块内存分配用brk,超大块内存用mmap。由于tcmalloc采用了thread cache的方式实现,相比ptmalloc在多线程应用中小块内存的分配效率更高,比ptmalloc快5倍左右。具体感兴趣的话,楼主可以看看两者的实现。
【 在 xfcy0718 (晓风残月) 的大作中提到: 】
: 读整个文件的时候mmap比较好嘛?
mmap和malloc不是一个级别的东西,mmap应该和brk是一个级别的,malloc会根据申请的内存块的大小,动态选择是使用brk申请内存还是mmap申请内存。mmap和brk都属于系统调用,调用程序会进入内核态。brk和mmap不同的是,前者是在堆上分配内存,适合小于128k的内存块,后者是在堆和栈之间的文件映射区分配内存,适合大于128k的内存分配…
个人记忆tcmalloc比ptmalloc是快5%到9%,快5倍这个太夸张了…
【 在 wuzhiguo (Carter) 的大作中提到: 】
: glibc里面malloc是由ptmalloc库实现的,而工业界用的最多的就是谷歌的tcmalloc。两个库都是小块内存分配用brk,超大块内存用mmap。由于...
mmap是内存映射文件的一种方法。当你需要连续频繁操作某块大内存时,可以使用 mmap 来分配这块内存,如将文件通过 mmap 映射到内存中。这样的话,优点一是减少了在内核态上的数据拷贝,二是减少了寻址时的缺页异常,导致内核一直在做虚拟内存和实际内存的地址转换。