2013-02-19 72 views
5

假設,假設我想對可能非常大的文件執行順序寫入。madvise(___,___,MADV_DONTNEED)是否指示操作系統懶惰地寫入磁盤?

如果我在整個區域上繪製了一個巨大的區域和madvise(MAD​​V_SEQUENTIAL),那麼我可以以相對高效的方式寫入內存。這我已經工作得很好。

現在,爲了釋放各種操作系統資源,我偶爾會在已經寫入的小塊內存上執行munmap()。我擔心的是,munmap()和msync()會阻塞我的線程,等待數據被物理提交到磁盤。我不能放慢我的作家,所以我需要找到另一種方式。

在小的,已經寫好的內存塊上使用madvise(MAD​​V_DONTNEED)會更好嗎?我想告訴操作系統將該內存寫入磁盤,而不是阻止我的調用線程。

上的madvise的手冊頁()是這樣說的,這是相當含糊:

MADV_DONTNEED 
Do not expect access in the near future. (For the time being, the 
application is finished with the given range, so the kernel can free 
resources associated with it.) Subsequent accesses of pages in this 
range will succeed, but will result either in re-loading of the memory 
contents from the underlying mapped file (see mmap(2)) or 
zero-fill-on-demand pages for mappings without an underlying file. 
+0

我不會試試這個;文件映射上的「MADV_DONTNEED」可能會被解釋爲意味着您希望操作系統對文件進行更改。 – zwol 2013-02-20 02:33:45

+0

@Zack,你有沒有參考MADV_DONTNEED丟棄對文件的更改? – Anton 2013-03-14 19:54:55

+1

@antonm http://man7.org/tlpi/code/online/dist/vmem/madvise_dontneed.c.html有一個程序來演示它(不是很自包含,但很容易修改)。另請參閱https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html(「'MADV_DONTNEED」:該區域不再需要,內核可釋放這些頁面,*導致任何更改頁面丟失*「(重點是我的))以及2005年的這個LKML線程:https://lkml.org/lkml/2005/6/28/188。 – zwol 2013-03-14 20:27:15

回答

0

第一,MADV_SEQUENTIAL使激進預讀,所以你並不需要它。 秒,即使你不做任何事情,操作系統也會懶懶地將髒文件烘焙的內存寫入磁盤。但是madv_dontneed會指示它立即釋放內存(你稱之爲「各種os資源」)。第三,目前還不清楚用於順序寫入的映射文件有什麼優勢。你可能會寫得更好(2)(但使用緩衝區 - 無論是手動還是stdio)。

+1

這個答案只是錯誤的,請參閱上面的答案爲什麼。 – Eloff 2014-02-05 01:03:13

+0

更正madv_dontneed部分 – pal 2017-11-28 05:29:53

11

不!

爲了您自己的利益,請遠離MADV_DONTNEED。 Linux將而不是作爲一個提示,在寫回它們後丟棄頁面,但立即丟棄它們。這不是一個錯誤,而是一個故意的決定。

諷刺的是,理由是一個非破壞性MADV_DONTNEED功能由msync(MS_INVALIDATE|MS_ASYNC)MS_ASYNC,另一方面已經給不啓動I/O(事實上,它什麼都沒有,推理髒以下頁回寫工作正常),fsync始終阻止,並且sync_file_range可能會阻止如果您超出了一些模糊的限制並且被文檔視爲「非常危險」,無論如何。

無論哪種方式,你必須msync(MS_SYNC),或fsync(包括阻塞),或其次fsyncsync_file_range(可能阻塞),或者你MADV_DONTNEED丟失數據。如果你無法承受可能的阻塞,可悲的是,你別無選擇,只能在另一個線程中做到這一點。

+2

我認爲你的意思是'msync(MS_INVALIDATE ...'而不是'madvise()' – Hasturkun 2013-10-29 14:45:22

+0

這是對的,謝謝 – Damon 2013-10-29 15:46:38

+0

@Damon你自信的回答是[引用](https://www.youtube。 com/watch?v = bg6-LVCHmGM&feature = youtu.be&t = 4426)[Bryan Cantrill在2015年的浪潮中對Linux的MADV_DONTNEED行爲的咆哮](https://www.youtube.com/watch?v=bg6-LVCHmGM&feature=youtu.be&t = 3518)。 – Anon 2017-10-31 06:38:32