D:\mm\namelock.avi //文件保存在这里 364544 //文件大小 5 //有5个线程在下载 0 //已经下载了0字节 0-72908 //线程1的下载任务 72908-145816 //线程2的下载任务 145816-218724 //线程3的下载任务 218724-291632 //线程4的下载任务 291632-364544 //线程5的下载任务
以上是开始下载时的各个线程的任务分配。
D:\mm\namelock.avi 364544 5 113868 72908-72908 113868-145816 145816-218724 218724-291632 291632-364544
以上是某一时刻各个线程的任务分配情况。 各个线程任务分配是这样实现的。在开始下载时,文件平均分成若干块进行下载。如第一个线程一开始的任务是从文件的0位置开始下载一直到72908位置处。线程1每次下载一块数据后就要调整任务,如第一次下载了20800字节的数据,那么线程1的任务将改为:20800-72908。如此下去,直到任务为72908-72908时表示线程1完成了当前的下载任务。此时,线程1就分析各个线程的任务,找出任务最为繁忙的一个线程:如线程3:14816-218724。那么线程1就自动去调整任务,拿50%的任务来再次下载。周而复始直到各个线程都完成任务。不过这里有一点需要注意:为了避免重复下载部分数据,在调整任务的时候,起始的文件便移量必须加上接受缓冲器的字节数,因为如前面所举的列子来看。线程1和线程3在平衡负载的时候,线程正在下载数据,如果所剩的数据比接受缓冲器的大小还小,线程1和线程3的部分下载数据将会重复。 在调整任务和分析任务的时候,会发现一个问题。就是读取文件数据太过频繁。于是我用了一个数据结构。在下载文件的过程中始终打开配置文件,这样速度提高了很多。在文件下载完毕后关闭文件。数据结构如下:
(编辑:aniston)
|