我有一個在多線程中描述的有關內存映射和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