2013-03-18 58 views
10

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

编辑:

我正在写一个程序,能对一个大的二进制文件,但大部分时间还是花在磁盘I/O,所以我只是想知道我会获得任何额外的速度通过并行执行I/O。

+0

是的,这应该是可能的,这就是uTorrent软件的工作原理..! – 2013-03-18 13:28:01

+1

你在谈论物理并行吗?如果您谈论物理并行性 - 请考虑它如何与单核处理器配合使用。 – Andrey 2013-03-18 13:28:01

+1

它不会解决你的IO问题。如果最终需要从不同线程写入相同文件*,以解决CPU限制*,但不会提高IO速度,则该方法可行。如果有的话,它会稍微减少。 – 2013-03-18 13:28:09

回答

6

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

我有一个程序,能对一个大的二进制文件,但大部分时间还是花在磁盘I/O,所以我只是想知道我会在做并行I/O获得任何额外的速度。

如果程序是磁盘绑定的,使其成为多线程(并仍将相同数量的数据写入同一磁盘)将不会加速。

如果我们谈论的是一个传统的硬盘驱动器,顺序I/O通常比我更快/ O涉及移动磁头来回。考虑到这一点,跨线程分割I/O甚至可能具有更高的效率。

有几个通道一直探索超速事情:

  1. 减少I/O量(例如,通过采用排序算法只需要较少的I/O,或通过做更多的工作-记忆);
  2. 提高I/O吞吐量,例如使用更快的驱动器。
3

尽管文件处理有些不同,并且可能需要特定的文件模式才允许(编辑:请参阅answer of bizzehdee以了解详细信息),但它至少可以在类Unix操作系统上运行。

在正在运行的操作系统,“文件”是一个真正的逻辑实体,在任何给定的时间存储到磁盘它的一些状态,但也只是在内核缓冲的某些更改仍然。所以,从某种意义上说,写入文件与写入共享内存块没什么区别,只有API不同(甚至如果使用mmap)也是如此。

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


关于加速:取决于你做了什么,真的。如果您只是执行原始写入,则传统旋转硬盘上的内容可能会变慢,或者文件可能更容易碎片化。在SSD上,可能没有减速,但也没有加速。另一方面,如果您的操作是CPU绑定的,并且您拥有多个内核,并行执行操作可以让您获得更高的总CPU使用率,那么并行处理同一输出文件的不同部分可以加快速度如果与写入文件的字节相比,处理量很大,那甚至可以达到很多。

0

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

但是,您的一个陈述并非真正正确。

,只有一个磁头

首先,有通常为每一个面,所以即使是单碟硬盘将有两个头。当然,多盘拼盘的有更多。

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

相关问题