我有一个在多线程中描述的有关内存映射和Linux下不断增长的内存消耗的问题。Linux内存映射文件保留大量物理内存
当我打开下Linux或MacOS X的1GB的文件,并使用
me.data_begin = mmap(NULL, capacity(me), prot, MAP_SHARED, me.file.handle, 0);
和顺序读取映射的内存,我的程序使用越来越多的物理内存,虽然我用posix_madvise它映射到内存中(甚至称它在读取过程中多次):
posix_madvise(me.data_begin, capacity(me), MMAP_SEQUENTIAL);
没有成功。 :-(
我想:
- 不同的标志MMAP_RANDOM,MMAP_DONTNEED,MMAP_NORMAL没有成功
- posix_fadvise(me.file.handle,0,容量(我),POSIX_FADV_DONTNEED)和前MMAP调用后 - >没有成功
在Mac OS X !!!当我结合
posix_madvise(.. MMAP_SEQUENTIAL)
它
工作 和
msync(me.data_begin, capacity(me), MS_INVALIDATE).
驻留存储器低于16M(I周期性地调用的msync 16mio步骤之后)。
但是根据Linux没有任何工作。有没有人对我在Linux下的问题有一个想法或成功的故事?
干杯, 大卫
它可能也可能不相关,但应该知道:您使用的是32位还是64位系统?你知道你不应该在32位系统中映射1GB? (即使您使用的是64位系统,您也可能会担心可移植性)。 – Juliano 2010-09-24 18:13:21
所有系统都是64位(带有64位文件指针和偏移量),我可以成功映射40GB文件。为了可重复性,我只是将问题归结为1GB。 – Dave 2010-09-26 10:17:30
@Sven。有时使用内存映射是不可避免的,例如,当库调用需要内存区域而不是文件时。所以你的建议是无益的,并没有回答这个问题。 至于答案,显然在Linux上MMAP_SEQUENTIAL是非常*破碎*。预读部分工作,页面回收部分不工作。唯一的办法是向Linux提出,实际上这些页面是很好的候选者是通过取消映射区域(并重新映射)。 – 2015-03-06 00:51:15