原帖由 印随 于 2008-4-2 14:08 发表
这两天在折腾 mmap 函数
函数原型
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
映射一个1G 的文件的时候, offset = 0,
当 length = 100 M ,系统 ...
原帖由 flw2 于 2008-4-2 16:37 发表
mmap的不占用物理内存,内核会检查到缺页,然后知道是mmap文件的,所以会进行文件操作,具体细节忘了
如果是普通内存,就像版主说的,当写的时候缺页导致物理内存的分配
原帖由 flw2 于 2008-4-2 16:54 发表
这也未必吧
不过mmap对文件映射的时候确实是不像普通的mmap然后写一样耗费内存的
#include
#include
int main()
{
char *p;
int i = 0;
/* just for strace */
...
原帖由 思一克 于 2008-4-2 16:57 发表
LINUX下是这样的,
你malloc很小空间时候, 是靠brk实现的.
你malloc很大(比如128M以上的时候)是靠mmap实现.
brk和mmap都是系统调用.
所以我说malloc本来就是用mmap实现就是这意思.
原帖由 flw2 于 2008-4-2 16:37 发表
mmap的不占用物理内存,内核会检查到缺页,然后知道是mmap文件的,所以会进行文件操作,具体细节忘了
如果是普通内存,就像版主说的,当写的时候缺页导致物理内存的分配
原帖由 zx_wing 于 2008-4-2 17:16 发表
占用的,它是把文件的page cache映射到应用程序的地址空间,当然就占用物理内存,这个还是shared的情况。
如果是private的mmap,写的时候还会单独为该进程分配内存的。
原帖由 zx_wing 于 2008-4-2 17:16 发表
占用的,它是把文件的page cache映射到应用程序的地址空间,当然就占用物理内存,这个还是shared的情况。
如果是private的mmap,写的时候还会单独为该进程分配内存的。
原帖由 zx_wing 于 2008-4-2 17:26 发表
不会,几个页而已。
比如你先写0-4k这个部分,分配一个页。4k-8k,分配一个页,8k-12k分配一个页。12k-16k,这个时候内核可能就已经开始回收内存了,你前面几个页会被内核回收回去。所有通常不会用到多大内存的。
原帖由 flw 于 2008-4-2 17:28 发表
所以我一开始说 mmap 不占用内存,主要是强调它是文件操作。
后来思一克说 malloc 就是用 mmap 来实现的,这我不太清楚,所以就缄口不言了。
原帖由 flw2 于 2008-4-2 17:33 发表
对,因为malloc要尽可能使用用户态的地址空间,而堆的延升迟早会遇到障碍(所以只用brk是不能用完3G的,这至少是需要mmap的其中一个原因)
我只记得内核会检查到缺页,缺页异常会检查具体的原因,然后进行 ...
原帖由 flw2 于 2008-4-2 17:44 发表
其实我没有完整的看过malloc,所以不知道是不是小的就用brk。brk失败就mmap
但是内核的brk和mmap都是搜索进程的地址空间树,然后摘个出来
由于brk的特殊性,可能比较容易一些,
它们的区别细节在ULK上有, ...
原帖由 zx_wing 于 2008-4-2 17:47 发表
我不知道这个的,也没看过malloc的代码
我也是看到思一克说大于128M要用mmap时才知道malloc会用它,之前我也一直以为malloc都用brk实现的
原帖由 思一克 于 2008-4-2 17:53 发表
不一定是128M界限.
你可以编个小程序, 分配256M, 前后打印出BRK数值, 你会看到不变化了. 因为是直接用mmap了, 没有用brk.
原帖由 思一克 于 2008-4-2 17:53 发表
不一定是128M界限.
你可以编个小程序, 分配256M, 前后打印出BRK数值, 你会看到不变化了. 因为是直接用mmap了, 没有用brk.
DEFAULT_MMAP_THRESHOLD default: 256K
Also settable using mallopt(M_MMAP_THRESHOLD, x)
The request size threshold for using MMAP to directly service a
request. Requests of at least this size that cannot be allocated
using already-existing space will be serviced via mmap. (If enough
normal freed space already exists it is used instead.) Using mmap
segregates relatively large chunks of memory so that they can be
individually obtained and released from the host system. A request
serviced through mmap is never reused by any other request (at least
not directly; the system may just so happen to remap successive
requests to the same locations). Segregating space in this way has
the benefits that: Mmapped space can always be individually released
back to the system, which helps keep the system level memory demands
of a long-lived program low. Also, mapped memory doesn't become
`locked' between other chunks, as can happen with normally allocated
chunks, which means that even trimming via malloc_trim would not
release them. However, it has the disadvantage that the space
cannot be reclaimed, consolidated, and then used to service later
requests, as happens with normal chunks. The advantages of mmap
nearly always outweigh disadvantages for "large" chunks, but the
value of "large" may vary across systems. The default is an
empirically derived value that works well in most systems. You can
disable mmap by setting to MAX_SIZE_T.
原帖由 Alligator27 于 2008-4-2 22:08 发表
这是Linux Redhat allocator作者的website: http://www.malloc.de/en/
其中关于mmap的注释:
brk/sbrk 是mmap的特例。
mmap映射一个1G 的文件,最终会用1G的RAM。(direct IO 例外)。
原帖由 印随 于 2008-4-3 10:10 发表
我的系统是ubuntu,物理内存为1G
我刚才做了一个试验,不管是读还是写
映射1G的文件,最终会(大概)占用1G RAM(剩余内存直线减小,到最后会有一个小回升,可能是系统发现内存不够用,把一些临时占用的内存 ...
原帖由 flw2 于 2008-4-3 11:11 发表
是我理解有问题
int main(int argc, char* argv[])
{
int fd = open("./futex",O_RDWR|O_CREAT, 0777);
int fd2 = open("./futex2",O_RDWR|O_CREAT, 0777);
lseek(fd,G,SEE ...
top - 11:47:44 up 2 days, 17:31, 4 users, load average: 9.53, 6.80, 3.21
Tasks: 72 total, 4 running, 68 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 16.4%sy, 0.0%ni, 0.0%id, 79.5%wa, 3.7%hi, 0.0%si, 0.0%st
Mem: 256572k total, 252184k used, 4388k free, 272k buffers
Swap: 329292k total, 62964k used, 266328k free, 232712k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9668 flw 20 0 2049m 136m 136m R 4.6 54.7 0:08.18 tmmap
9581 flw 20 0 2049m 44m 44m R 4.3 17.8 0:33.24 tmmap
9584 flw 20 0 2049m 43m 43m R 3.3 17.4 0:16.42 tmmap
原帖由 印随 于 2008-4-2 15:41 发表
mmap也一样吗?
1G的内存地址我都访问过,但系统内存也没有大的变化
实际上是有变化的,在我的系统中,内存占用一直增长,直到剩余内存为十几M的时候停了
原帖由 印随 于 2008-4-2 14:08 发表
这两天在折腾 mmap 函数
函数原型
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
映射一个1G 的文件的时候, offset = 0,
当 length = 100 M ,系统 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |