【问题标题】:multithreading for io-bound application : good or badio 绑定应用程序的多线程:好或坏
【发布时间】:2011-10-25 21:22:52
【问题描述】:

我一直试图弄清楚 io-bound 应用程序中的多线程是否真的会提高或降低性能。我读过的许多资料都是相互矛盾的。

以这个为例。

Why multithreading with io-bound is bad

公认的答案是,如果您的应用程序是 io-bound,多线程会导致争用并减慢您的应用程序。

这个例子在哪里,得票最高的答案表明它可以提高吞吐量。

Why multithreading with io-bound is good

我是不是误会了什么?

在我的情况下,我需要每秒从 n 个磁盘位置读取 n 次。我发现很难决定是否应该使用线程。

例如,如果我在磁盘上有 20 个文件,并且有 20 个单独的线程在等待和唤醒状态下从磁盘读取,这会完全减慢我的系统吗? 如果一个 pthread 正在执行从磁盘读取的代码,是否会阻止所有其他 19 个线程在不同文件上执行相同的操作?

【问题讨论】:

  • 我们也在考虑在 Android 上采用多线程磁盘 I/O 方法。目前我们有超过 20,000 个文件,每个文件需要大约 12 毫秒才能读取(相当于 4 分钟 - 这很痛苦)。这个想法是产生 N 个线程并在它们之间共享文件以尝试减少整体读取时间。你最后有什么明确的结论吗?我很想听听你有什么要分享的。 P

标签: multithreading ipad io pthreads


【解决方案1】:

为什么需要多线程呢?如果您使用单个磁盘,多线程将在最佳情况下提供相同的性能,否则会稍慢。

【讨论】:

  • 我现在开始认为我不需要它。我是一个没有经验的程序员,并且天真地试图改进我的应用程序
  • 考虑如何减少存储在磁盘上的数据量,考虑二进制格式或一些快速压缩。
【解决方案2】:

在这个问题中:

Does it make sense to spawn more than one thread per processor?

您标记为“为什么使用 io-bound 的多线程是好的”,最高答案有 16 个赞成票,他说“如果您的软件经常使用磁盘或网络 IO”。请特别注意最后一部分“网络 IO”。这是与您的第一个链接问题的区别因素,该问题仅与线程和磁盘 IO 有关。

【讨论】:

  • 磁盘 io 和网络 io 的区别在于 @ObscureRobot 状态的网络 io 可能能够“并行处理多个磁盘请求”?
  • 不仅如此。磁盘通常比网络快得多,因此可以同时提供多个网络链接。网络连接通常具有更高的延迟 - 与磁盘不同,在传输单个字节之前建立连接可能需要几秒钟。多个线程可以缓解这种延迟,因为一些线程可以传输数据,而其他线程正在等待 DNS 查找和 4/3 向 TCP 握手完成。
【解决方案3】:

在 io-bound 情况下,额外线程的唯一帮助是您的存储系统可以并行处理多个请求。在高端存储阵列上可能会出现这种情况,但在 ipad 等消费类设备上不太可能出现这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2014-01-02
    • 2014-10-03
    相关资源
    最近更新 更多