2010-06-16 170 views
7

重疊的IO寫VS文件寫入是否有使用文件在Windows重疊的IO寫,VS只是在做該文件中,我創建一個單獨的線程寫什麼優勢?文件在一個單獨的線程

[編輯 - 請注意,我做的文件中寫入沒有系統緩存,即我使用的CreateFile FILE_FLAG_NO_BUFFERING標誌)

回答

5

因爲所有的寫操作都在默認情況下,系統緩存中,幾乎沒有什麼優勢,在做重疊I/O或全部創建寫一個單獨的線程。大多數WriteFile調用僅僅是核心的memcpys,由操作系統以其他寫入的最佳方式懶惰地寫入磁盤。

當然,您可以通過標誌關閉緩衝I/O到CreateFile,然後做某種異步I/O有好處 - 但您可能沒有/不應該這樣做。

編輯

的OP澄清它們實際上是使用無緩衝I/O。在這種情況下,兩種建議的解決方案几乎是相同的內部Windows使用線程池來處理異步I/O請求。但假設,因爲他們一半是在內核中實現Windows可以更高效,具有更少的上下文切換等

+0

謝謝。我已經在做無緩衝I/O的速度優勢 - 我也許應該提到(我將修改我對於這個問題) – Warpin 2010-06-16 04:57:26

+0

糾正我,如果我錯了,但如果你寫一個網絡文件系統,寫可能是緩衝方式不同,如果使用阻塞IO,則可能會鎖定線程。 – 2010-06-16 05:08:30

+1

-1 - 多核環境中的重疊寫入顯示性能提高。您也可以將來自多個線程的重疊寫入組合到相同的文件句柄中 - 爲了在沒有重疊標記的情況下進行待辦事項,您需要鎖定,這會進一步降低性能。對於Windows中同一文件的多個並行IO,您應該始終使用重疊標誌,並使用多個線程或完成端口 - 這是設計選擇。 – 2014-01-31 18:14:30

1

可能是因爲重疊I /在Windows操作系統中會告訴Windows寫出來的文件在自己的時間背景下,而不是產生一個全新的線程和參與阻止操作?

+0

見我的答案 - 的Windows已經寫出來就可以了自己的時間的文件,在後臺,只要你不不要混淆默認參數並嘗試做一些瘋狂的事情。 WriteFileEx和重疊的I/O不是必需的。 – 2010-06-16 04:43:43

1
+2

習慣上寫一個簡短(甚至一句話)的鏈接摘要,以及它與問題的關係。 – Stephen 2010-06-16 04:01:09

+0

從這篇文章中(特別是頂部的IO圖)它似乎並不像我有是重疊的IO VS寫在自己的線程提交一份顯著的優勢。 – Warpin 2010-06-16 04:04:09

+0

好文章,它解釋了異步文件I/O如何在Windows中工作。 – Meiscooldude 2010-06-16 04:12:28

2

一個優點/ O是,它可以讓一個單獨的線程(或線程更通常池)來處理任意數量的I/O請求併發。這對於單用戶桌面應用程序來說可能不是一個優勢,但對於可以從多個不同客戶端獲得I/O請求的服務器應用程序來說,這可能是一個重大勝利。