是否可以从多个线程写入同一文件的不同部分?

时间:2013-03-18 13:22:19

标签: c io disk-io

我可以从多个线程(在典型的PC上)同时写入同一文件的不同部分吗?我的意思是只有一个磁盘头,所以写入只能以某种顺序执行,即不是并行执行,对吧?

修改

我正在编写一个对大型二进制文件进行排序的程序,但大部分时间仍用在磁盘I / O上,所以我只是想知道通过并行执行I / O可以获得额外的速度。 / p>

4 个答案:

答案 0 :(得分:6)

没有什么可以阻止你让多个线程写入同一个文件的不同部分。

  

我有一个程序可以对大型二进制文件进行排序,但是大部分时间仍然花在磁盘I / O上,所以我只是想知道通过并行执行I / O可以获得额外的速度。

如果程序是磁盘绑定的,那么使其成为多线程(并且仍然将相同数量的数据写入同一磁盘)将无法加速它。

如果我们谈论的是传统硬盘驱动器,顺序I / O通常比涉及来回移动磁盘头的I / O更快。考虑到这一点,在线程之间拆分I / O可能会适得其反。

除了加快速度之外,还有几种方法可以探索:

  1. 减少I / O量(例如,通过采用需要较少I / O的排序算法,或者通过在内存中完成更多工作);
  2. 提高I / O吞吐量,例如使用更快的驱动器。

答案 1 :(得分:3)

至少在unix(类似)操作系统上也是如此,大概也可能在Windows上,尽管文件处理有些不同,可能需要特定的文件模式允许这样做(编辑:详见answer of bizzehdee)。 / p>

在正在运行的操作系统上,“file”实际上是一个逻辑实体,它的某些状态在任何给定时间存储到磁盘,但是一些更改仍然只在内核缓冲区中。因此,在某种程度上,写入文件与写入共享内存块没有什么不同,只有API不同(如果使用mmap,则不一样。)

但总之,只是寻找和写入,文件中的旧字节被覆盖。如果两个进程写入相同的字节重叠,我认为最终结果是未定义的,并且在任何情况下都应该在正常运行的系统中发生,并且执行此操作的任何程序都应该有一些机制来防止重叠写入。


关于加速:取决于你做了什么,真的。如果你只是执行原始写入,传统的旋转硬盘上的东西可能会变慢,或者文件可能更容易碎片化。在SSD上,可能没有减速,但也没有加速。

另一方面,如果您的操作受CPU限制,并且您有多个内核,并且并行处理将允许您获得更高的总CPU使用率,那么并行处理相同输出文件的不同部分可以加快事情,如果与写入文件的字节相比有很多处理,甚至很多。

答案 2 :(得分:2)

您需要查看CreateFileExWriteFileEx并使用lpOverlapped。这允许在多个线程中同时从/向同一文件进行异步读取和/或写入。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx

答案 3 :(得分:0)

是的,这是可能的,但正如其他人所说,大多数在一般情况下不太可能提高性能。

但是,你的一个陈述并不正确。

  

只有一个磁盘头

首先,每个表面通常只有一个,所以即使单碟硬盘也会有两个头。当然,多盘的还有更多。

一些带有多个盘片的驱动器也可以同时读取或写入所有盘片。 80年代的一些Fujitsu Eagle drives做到了这一点,并被用于第一个能够记录未压缩数字视频信号的系统。当然,这不是“随机访问”,因为所有人都在一起移动。我不确定现代驱动器是否使用这种技术。