Multithreading 关于多线程下载的缺点

Multithreading 关于多线程下载的缺点,multithreading,download,Multithreading,Download,我有一个关于多线程下载的问题,正如您所知,使用多个线程下载可以提高应用程序的性能,但是有一些措施需要考虑:比如线程的数量、可用带宽等等,但我不太明白,例如,为什么应用程序的性能会因为使用多线程而降低,或者服务器的带宽、质量如何影响多线程应用程序的性能,单线程下载比多线程下载快的情况有哪些? 谢谢您的回复。我想您指的是下载管理器 首先,我怀疑下载管理器到底能带来多少“性能”好处。但更重要的是,由于多线程,它们提供的任何好处都是而不是。下载的性能约束是连接的带宽。这就是为什么我对这些好处持怀疑态度:

我有一个关于多线程下载的问题,正如您所知,使用多个线程下载可以提高应用程序的性能,但是有一些措施需要考虑:比如线程的数量、可用带宽等等,但我不太明白,例如,为什么应用程序的性能会因为使用多线程而降低,或者服务器的带宽、质量如何影响多线程应用程序的性能,单线程下载比多线程下载快的情况有哪些?

谢谢您的回复。

我想您指的是下载管理器

首先,我怀疑下载管理器到底能带来多少“性能”好处。但更重要的是,由于多线程,它们提供的任何好处都是而不是。下载的性能约束是连接的带宽。这就是为什么我对这些好处持怀疑态度:

  • 1 Mbps连接将以1 Mbps的速度下载
  • 将文件拆分为4个段意味着您以256 Kbps和4*256 Kbps=1 Mbps的速率下载每个段
  • 如果服务器限制每个下载段,您可能会得到一些改进
  • 如果其中一个网段超时,您可能会得到一点好处:其他网段的下载意味着您的连接不会在超时等待期间处于空闲状态
  • 您还可以通过“淹没”试图使用该连接的任何其他内容来加快下载速度。(但我并不认为这是一种好处。)
下载管理器的真正好处在于高效地自动重新启动下载(即,如果可能的话,不要从头开始)

那么多线程的意义是什么呢? 让我们首先消除一个误区:多线程不会加快任何速度。如果一个例程需要X个时钟周期才能运行:它将需要X个时钟周期;无论是在1个线程上还是在多个线程上

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

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

  • 缓慢的任务(结合大量下载的不同部分)可以在不同的线程上完成,而不会干扰需要快速反应的其他线程(如用户界面)
  • 并发任务还可以更有效地使用更多可用资源(多个CPU)。请注意(在回答问题的最后一部分时),如果您只有一个CPU,那么您的线程将被操作系统“时间切片”,因此它不是真正的并发线程。但是时间片非常小,所以之前的好处仍然适用
单线程何时比多线程快? 通常情况下,CPU不是瓶颈。在下载的情况下:如前所述,瓶颈是连接的两个端点之间的带宽。许多线程实际上意味着您必须做更多的工作(管理和协调不同的线程)

最有效的下载方法是两个线程:一个用于UI,另一个用于下载,这样任何暂停/处理都不会暂停用户界面

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

  • 理想情况下,您的多个任务不应共享数据。因为如果他们这样做了,那么您就有可能面临竞争条件或并发错误
  • 当他们必须共享数据时,您需要以某种方式同步工作,以避免上述错误。(有许多技术可供选择,具体取决于您的需要,我在这里不详细介绍。)
  • 但是,如果您的同步计划不周,您可能会遇到许多问题,这些问题会显著降低应用程序的速度。这些措施包括:
    • 限制共享资源,使多个线程在任何情况下都无法同时运行
    • 高锁争用,任务等待时间比工作时间长
    • 即使是死锁也会完全阻塞某些任务

首先,多线程下载的作用是创建多个线程,这些线程从不同的起始位置下载文件,试图利用internet连接的最大功率。(这将在多核处理器的情况下快速下载,如下所述)

我们可能感觉线程并行运行,但实际上,它们应该依次运行。例如,线程t1运行0.25秒,然后线程t2运行0.241秒,然后是t1、…、t2、、t1。因此,它们共享CPU突发

  • 那么为什么多线程可以提高性能呢? 答:如果您有多核处理器,可以使用多个处理器管理线程并行运行,从而提高性能。(这就是像IDMan这样的下载加速器的神奇之处!)
  • 为什么多线程会降低性能? 答:如果您有单核处理器,则所有线程将作为单个进程轮流运行,共享CPU突发。在这种情况下,单线程下载比多线程更快,因为如果使用多线程,从一个线程切换到另一个线程会浪费一些时间。(在这种情况下,像IDMan这样的下载加速器不会真正快速下载,尽管有多线程下载)
请参阅这张具有双核处理器的图片,以及如何管理线程。


我希望这有帮助!:-)

我认为您低估了每个连接的下载被限制的频率。最近,在我意识到某些大型应用程序需要30分钟下载(200kbps)的原因是每个连接的限制后,我一直在使用多线程下载程序。现在这些下载每分钟需要1分钟