代码之家  ›  专栏  ›  技术社区  ›  Aidan Ryan

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

  •  31
  • Aidan Ryan  · 技术社区  · 15 年前

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

    :我理解,当执行其他操作时,并发性显然会产生影响。如果任务是打开一个图像文件,转换成另一种格式,然后保存,则可以在处理图像的同时执行磁盘操作。我的问题是,当只执行磁盘操作时,并发排队和响应磁盘操作是否更好。

    8 回复  |  直到 15 年前
        1
  •  58
  •   jrista    15 年前

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

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

    但是,如果要将多个流写入多个物理磁盘,那么并发处理它们应该会提高性能。对于受管磁盘尤其如此,如RAID阵列、SAN设备等。

        2
  •  9
  •   ChrisW    15 年前

    这取决于“I/O绑定”的定义,但通常多线程有两种效果:

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

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

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

        3
  •  3
  •   Robert Harvey    15 年前

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

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

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

        4
  •  2
  •   Daniel Earwicker    15 年前

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

        5
  •  1
  •   asap diablo    6 年前

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

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

    如果我错了,请纠正我。

        6
  •  0
  •   Konrad Rudolph    15 年前

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

        7
  •  0
  •   Osama Al-Maadeed    15 年前

    我想这会妨碍手术。。。您只有一个控制器和一个驱动器。

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

        8
  •  0
  •   fortran    15 年前

    您可以通过将一组文件从一个位置复制到另一个位置并测量时间,然后将文件集拆分为两部分并并行复制,来测试在同一设备上执行并发IO操作的影响。。。第二种选择的速度要慢得多。