多线程对IO绑定操作有意义吗?

时间:2009-05-23 20:27:22

标签: multithreading optimization

执行多个磁盘操作时,多线程是否有帮助,阻碍或没有区别?

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

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

8 个答案:

答案 0 :(得分:40)

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

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

但是,如果要将多个流写入多个物理磁盘,则同时处理它们可以提高性能。对于托管磁盘(如RAID阵列,SAN设备等)尤其如此。

我认为这个问题与操作系统调度程序没有多大关系,因为它更多地与您写入的磁盘的物理方面有关。

答案 1 :(得分:6)

这取决于你对“I / O界限”的定义,但通常多线程有两个影响:

  • 同时使用多个CPU(如果瓶颈是磁盘而不是CPU [s],这不一定有帮助)

  • 即使一个线程被阻止(例如等待I / O完成),也要使用CPU(带另一个线程)

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

答案 2 :(得分:3)

我认为这取决于许多因素,例如您运行的应用程序类型,并发用户数等等。

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

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

答案 3 :(得分:2)

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

这主要是为了提供清晰的编程而非性能。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

您可以使用第二个线程来执行操作,以及一个显示更新UI的主线程。

答案 6 :(得分:0)

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

您可以通过将一组文件从一个地方复制到另一个地方并测量时间来测试在同一设备上执行并发IO操作的影响,然后将该组分成两部分并将这些副本并行生成...第二种选择会明显变慢。

答案 7 :(得分:0)

在大多数情况下,对磁盘IO使用多线程将不会提高效率。让我们想象两种情况:

  1. 无锁文件:我们可以通过为每个线程分配不同的IO偏移量来拆分文件。例如,将1024B字节的文件分为n个片段,每个线程分别写入1024 / n。由于不同的偏移量,这将导致很多冗长的磁盘头移动。
  2. 锁定文件:实际锁定每个关键部分的IO操作。这将导致很多冗长的线程切换,结果只有一个线程可以同时写入文件。

如果我错了,请纠正我。