2009-05-23 266 views
24

执行多次磁盘操作时,多线程是否有帮助,阻碍或没有任何影响?多线程对IO绑定操作有意义吗?

例如,将多个文件从一个文件夹复制到另一个文件夹时。

澄清:我知道当执行其他操作时,并发性显然会有所作为。如果任务是打开图像文件,转换为其他格式,然后保存,则可以与图像操作同时执行磁盘操作。我的问题是,何时执行的唯一操作是磁盘操作,无论是同时排队还是响应磁盘操作都更好。

回答

33

到目前为止,大部分答案都与操作系统调度程序有关。但是,我认为还有一个更重要的因素会导致您的答案。你正在写入一个物理磁盘还是多个物理磁盘?

即使您与多个线程并行... IO到单个物理磁盘本质上是一个序列化操作。每个线程都必须阻塞,等待有机会访问磁盘。在这种情况下,多个线程可能无用......甚至可能导致争用问题。

但是,如果你正在写多个流到多个物理磁盘,处理它们同时应该给你的性能的提高。这是管理的磁盘尤其如此,像RAID阵列,SAN设备等

我不认为这个问题有很多工作要做,因为它更多的是与磁盘的物理方面(OS调度器s)你的写作。

0

不,这没有意义。在某些时候,操作必须被序列化(由操作系统)。另一方面,由于现代操作系统必须处理多个进程,无论如何,我怀疑有额外的开销。

2

我想这取决于很多因素,比如你正在运行的应用程序种类,并发用户数等

我目前的工作对具有高度线性的项目(从头到尾读取文件)操作。我们使用NAS进行存储,并担心如果我们运行多个线程会发生什么情况。我们最初的想法是,它会让我们放慢脚步,因为它会增加头部搜索量。所以我们进行了一些测试,发现理想的线程数与计算机内核的数量相同。

但是你的里程可能会有所不同。

2

它可以这样做,只是因为每当有更多工作要做线程(识别下一个要拷贝的文件)时,操作系统会将其唤醒,因此线程是挂钩到OS调度程序的简单方法,但仍然可以编写代码采用传统的顺序方式,而不必将其分解为带回调的状态机。

这主要是一个明确的编程,而不是性能的援助。

6

这取决于你的定义“I/O绑定”,但一般多线程有两个作用:

  • 使用多个CPU并行(这并不一定会帮助,如果瓶颈是磁盘,而不是CPU [S])

  • 使用一个CPU(带另一个线程),甚至当一个线程被阻塞(如等待I/O完成)

我不知道但是,Konrad的答案总是正确的:作为一个反例,如果“I/O绑定”意味着“一个线程花费大部分时间等待I/O完成而不是使用CPU”,但是不是意味着“我们达到了系统I/O带宽限制”,那么具有多线程(或异步I/O)的IMO可能会提高性能(通过启用多个并发I/O操作)。

0

我认为这会妨碍操作...你只需要一个控制器和一个驱动器。

你可以使用第二个线程的运做,这显示了一个更新的UI主线程。

0

我认为这可能恶化的性能,因为多个线程将相同的资源竞争。

您可以测试从一个地方到另一个复制的一组文件和测量的时间做同样的设备上的并发IO操作的影响,然后分成两个部分的设置,使副本会同时...第二个选项会明显变慢。