我可以从多个线程(在典型的 PC 上)同时写入同一文件的不同部分吗?我的意思是只有一个磁头,所以写入只能以某种顺序执行,即不能并行,对吧?
编辑:
我正在编写一个对大型二进制文件进行排序的程序,但大部分时间仍然花在磁盘 I/O 上,所以我只是想知道通过并行执行 I/O 是否会获得额外的速度。
没有什么可以阻止您让多个线程写入同一文件的不同部分。
我有一个对大型二进制文件进行排序的程序,但大部分时间仍然花在磁盘 I/O 上,所以我只是想知道通过并行执行 I/O 是否会获得额外的速度。
如果程序是磁盘绑定的,使其成为多线程(并且仍然将相同数量的数据写入同一个磁盘)不会加快它的速度。
如果我们谈论的是传统硬盘驱动器,顺序 I/O 通常比涉及来回移动磁盘磁头的 I/O 更快。考虑到这一点,跨线程拆分 I/O 甚至可能适得其反。
就加快速度而言,有几种途径可供探索:
至少在 unix(-like) 操作系统上是可能的,大概在 Windows 上也是可能的,尽管文件处理有些不同,可能需要特定的文件模式允许这样做(编辑:有关详细信息,请参阅bizzehdee的答案)。
在正在运行的操作系统上,“文件”实际上是一个逻辑实体,它的某些状态在任何给定时间都存储到磁盘中,但也有一些变化仍然只存在于内核缓冲区中。因此,在某种程度上,写入文件与写入共享内存块没有什么不同,只是 API 不同(即使使用mmap
.
但简而言之,只需查找和写入,文件中的旧字节就会被覆盖。如果两个进程在相同的字节上重叠写入,我认为最终结果是未定义的,无论如何,这在正常运行的系统中永远不应该发生,并且任何这样做的程序都应该有一些机制来防止重叠写入。
关于加速:真的取决于你做什么。如果您只执行原始写入,传统旋转硬盘的速度可能会变慢,或者文件可能更容易碎片化。在 SSD 上,可能没有减速,但也没有加速。
另一方面,如果您的操作是 CPU 密集型的,并且您有多个内核,并且并行处理将使您获得更高的总 CPU 使用率,那么并行处理同一输出文件的不同部分可以加快速度,甚至与写入文件的字节相比,如果有很多处理。
您需要查看CreateFileEx
并WriteFileEx
使用lpOverlapped
. 这允许在多个线程中同时异步读取和/或写入同一文件。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx
是的,这是可能的,但正如其他人所说,在一般情况下它最不可能提高性能。
但是,您的其中一个陈述并不正确。
只有一个磁头
首先,通常每个表面都有一个,因此即使是单盘 HDD 也会有两个磁头。当然,多盘的有更多。
一些具有多个盘片的驱动器还能够同时读取或写入所有盘片。80 年代的一些Fujitsu Eagle 驱动器做到了这一点,并被用于第一批能够记录未压缩数字视频信号的系统。当然,这不是“随机访问”,因为所有头都一起移动。我不确定现代驱动器是否使用这种技术。