关于多线程下载的缺点

时间:2014-06-06 17:31:16

标签: multithreading download

我有一个关于多线程下载的问题,因为你知道使用多个线程下载可以提高应用程序的性能,但是有一些措施要尊重:比如线程数,可用带宽等等,但我不是真的理解,为什么应用程序的性能可能因使用多个线程而降级,或者服务器的带宽,质量如何影响多线程应用程序的性能? ,monothread下载比多线程更快的情况是什么? 谢谢你的回复。

2 个答案:

答案 0 :(得分:9)

我假设您指的是下载管理器。

首先,我怀疑下载管理器真正提供了多少“性能”好处。但更重要的是,由于多线程,他们提供的任何好处都是 。下载的性能限制是连接的带宽。这就是为什么我对这些好处持怀疑态度:

  • 1 Mbps连接将以1 Mbps的速度下载。
  • 将文件拆分为4个段意味着您以256 Kbps和4 * 256 Kbps = 1 Mbps的速度下载每个段。
  • 如果服务器限制每个下载段,您可能会得到一些改进。
  • 如果其中一个细分受众群超时,您可能会获得一笔不小的好处:其他细分下载意味着您​​的连接在超时等待期间不会闲置。
  • 你也可以通过'淹没'试图使用连接的任何其他内容来加快下载速度。 (虽然我并不认为这是一个好处。)

下载管理器的真正好处在于有效地自动重启下载(如果可能的话,不能从头开始重新启动)。

那么多线程的重点是什么?

让我们首先消除一个神话:多线程 不会 加快速度。如果例程需要运行X个时钟周期:它将需要X个时钟周期;无论是1线程还是多线程。

多线程的作用:它允许任务同时运行 (同时)。

同时做不同事情的能力意味着:

  • 一个缓慢的任务(组合大型下载的各个部分)可以在不同的线程上完成,而不会干扰需要快速响应的其他线程(例如用户界面)。
  • 并发任务还可以更有效地使用更多可用资源(多个CPU)。注意(在问题的最后部分),如果你只有一个CPU,那么你的线程被操作系统“时间分片”,所以它不是真正的并发。但是时间片非常小,所以以前的好处仍然适用。

单线程何时比多线程更快?

嗯,几乎总是在CPU不是瓶颈的情况下。在下载的情况下:如前所述,瓶颈是连接的两个端点之间的带宽。许多线程实际上意味着你必须做更多的工作(管理和协调不同的线程)。

最有效的下载方法是2个线程:一个用于UI,另一个用于下载,因此任何暂停/ dealys都不会停止用户界面。

然而,更一般地说,即使你有CPU密集型工作理论上可以从多个线程同时执行不同工作中受益,但实施中很容易出错 实际上会降低应用程序的速度

  • 理想情况下,您的多个任务不应共享数据。因为如果他们这样做,那么你冒着竞争条件并发错误的风险。
  • 当他们必须共享数据时,您需要以某种方式同步工作以避免上述错误。 (根据您的需要,有许多技术可供选择,我在此不再赘述。)
  • 但是,如果您的同步计划不当,则可能会出现一些可能会严重降低应用程序速度的问题。这些包括:
    • 通过共享资源进行瓶颈处理,使您的多个线程在任何情况下都无法同时运行。
    • 高锁争用,其中任务花费更多时间等待工作。
    • 甚至可以完全阻止某些任务的死锁。

答案 1 :(得分:0)

首先,多线程下载的作用是创建多个线程,这些线程从不同的起始位置下载文件,从而尝试利用Internet连接的最大功能。 (这将在多核处理器的情况下快速下载,这将在下面说明)。

我们可能会觉得线程并行运行,但是实际上,它们应该轮流运行。例如,线程t1运行0.25秒,然后线程t2运行0.241秒,然后t1,..,t2,t1。因此,他们共享CPU突发次数。

  • 那为什么多线程可以提高性能? 答:如果您拥有 多核处理器 ,则可以使用多个处理器来管理线程并行运行,从而提高性能。 (这就是IDMan这样的下载加速器如何发挥作用的!)。
  • 为什么多线程会降低性能? 答:如果您具有 单核处理器 ,则所有线程将作为单个进程依次运行,共享CPU突发次数。在这种情况下,单线程下载比多线程下载快,因为如果您使用多线程,则从一个线程切换到另一个线程时,会浪费一些时间。 (尽管有多线程下载,但在这种情况下,像IDMan这样的下载加速器并不会真正快速下载)。

看到这张具有双核处理器的图片,以及如何管理线程。 Picture Showing threads in multi-core processor

我希望这会有所帮助! :-)