2010-06-16 171 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请求的服务器应用程序来说,这可能是一个重大胜利。