多多未必益善——单、多线程下载软件之比较 钱可栋 2000年 第18期   经常上网的网友必然会从网上下载各种软件,通常都是利用一些专门的下载软件来完成这项工作。目前,这类下载软件种类很多,如果以工作方式分类的话,它们可以分成两类,即单线程下载软件和多线程下载软件。   单线程下载软件以俄罗斯人开发的Net Vampire(网络吸血鬼)为代表,而多线程下载软件比较著名的有NetAnts(网络蚂蚁)、GetRight 和JetCar等。其中,较新版本的GetRight是由单线程下载软件发展而来,从简单的数量对比以及GetRight的变化历程来看,似乎近来多线程下载软件占了上风,而从人们的使用倾向来看,也印证了此种看法。多线程下载软件受青睐的一个很大原因是人们认为这类软件工作时的速度比它的单线程兄弟更快,但是,事实真的是如大多数人想的那样吗?   让我们先来看看所谓的多线程是什么意思,它能给我们带来什么好处。 #1 一、什么是多线程下载软件   在Windows9X、Windows NT以及新近问世的Windows2000这类人们最常用的操作系统中,应用程序的执行是以进程方式进行的。每当一个应用程序启动时,操作系统就会在内存中为该应用程序开辟一个进程,其中除了程序代码外,还分配给供应用程序使用的内存寄存器地址,而每个进程可以只包含一个线程——大多数应用程序都是如此,它们被称为单线程应用程序,比如上面提到的Net Vampire。但也有例外,某些应用程序的进程可以产生多个线程,这些线程在主线程的协调指挥下,共同工作,如果各项外部条件配合的话,多线程软件可以比单线程软件有更高的工作效率,反映到本文探讨的多线程下载软件上来,就是下载速度更快。但是,多线程软件中的每一个线程都需要独立的系统资源,包括CPU、内存寄存器地址以及堆栈等,这些系统资源就是上面提到的“各项外部条件”的一个方面,或者更通俗地讲,是硬件方面。低主频的CPU、过少的内存以及那些太次的Modem组成的系统并不适合运行多线程下载软件。尤其是CPU,如果是那些“年代久远”的古董的话,甚至还要注意它们是否支持多线程程序,因为这类CPU当道的时间正是DOS一统天下的年代,而DOS仅仅是一个单任务的操作系统。   “各项外部条件”的另一个方面指的是软件运行的外部环境,对于下载软件来说,就是网络环境,包括网络拥挤程度、ISP提供的出口带宽以及正访问的网站的繁忙程度。如果网络情况很糟的话,多线程下载软件并不见得比单线程下载软件来得更有效率,相反,可能还不及单线程下载软件。 #1 二、多线程下载软件的工作机理   因为多线程下载软件接到一个下载任务并开始下载时,会首先把下载任务平均分成N份,这个N是由用户开辟的线程数决定的,比如在NetAnts中,如果用户设定了3个蚂蚁,那么N就是3。在下载过程中,这个N一般不会改变,也就是说,每个线程被分配的任务是固定的,而下载速度则是各线程下载速度之和。当网络条件不佳时,各个线程之间进展的速度很可能并不一致,而是有快有慢。如果在软件下载将要结束时,某个线程已经完成了自已的任务而处于停止状态的话,你将发现下载速度会急剧下降,道理很简单:线程少了,这就是为什么某些多线程下载软件在下载软件的后期速度下降的原因。更进一步,完成任务的线程并不会“吐”出自己所占用的系统资源去支援其它还在工作的线程,而是等整个软件下载完成后再把占用的资源一并归还给操作系统,这样的安排无疑是有欠妥当的。因为,此时有一部分操作系统分配给这个下载任务的进程资源被白白空置浪费掉了,与单线程下载软件比较起来,在速度上就吃大亏了。   网络条件不佳的时候不宜用多线程下载软件的另一个原因是:此时下载软件可能并不稳定,而不稳定带来的后果就是频频与网站重新连接。虽然这种情况对单线程下载软件而言是一视同仁的,但是多线程下载软件由于有多个线程分别独立工作,而每个线程都有自己的连接对象,所以出现连接故障的几率就要比单线程下载软件来得大,而且线程越多,越容易出现连接故障;另一方面,一个下载进程中的各个线程并不是像某些人想的那样是齐头并进的,严格地讲,某一时刻只有一个线程处于激活状态,如果没有特殊情况的话,其它线程必须等这个线程用完操作系统分配给它的时间片后才有可能工作,虽然等待的时间很短,一般以ns为单位,人们根本不会感觉到,但这种频繁切换线程的工作方式在网络不佳的时候又加大了不稳定的因素,而单线程下载软件就没有这些缺点。 #1 三、单、多线程下载软件适用的条件   1.对于机器配置较高档的用户来说,适宜用多线程下载软件,因为这类用户运行多线程程序时会有比较好的硬件条件作保障;而对于机器档次较低的用户,则最好用单线程下载软件,特别是诸如CPU为MMX级别以下的、内存只有16M甚至8M的、Modem仅为14.4K的用户,最好不要用多线程下载软件——这类软件并不会给你带来效率上的任何好处,如果在下载软件时还要浏览网页,则更应该放弃多线程下载软件。   2.在网络繁忙的时候,单线程下载软件是比较好的选择,因为此时最需要的是稳定,而不是速度,而且稳定也会给速度带来可靠的保障;而在网络畅通的情况下,多线程下载软件就有用武之地了,此时各个线程一般可以以同样的时间完成工作而不会有某一个线程拖后腿,在速度上就有比较大的优势,可以以最大的限度利用资源和带宽。   实际上,对于大多数用户来说,最好两种下载软件都装,具体使用哪一种可以酌情而定。Net Vampire是单线程下载软件的理想代表,而多线程下载软件,由于选择余地比较大,则可以仁者见仁,智者见智了。其实如果从广义上来看,也可以把Net Vampire这类单线程下载软件视作多线程下载软件,这是由下载软件可以同时执行多个下载任务的特性决定的,每个下载任务就是一个线程,可以为各个下载任务指定优先级——这就是线程的特性。所以从这个意义来说,与多线程下载软件不宜设定过多的线程一样,单线程下载软件也不适合同时进行太多的下载任务。