多线程下载策略分析

03 Mar 2012

一个作业是多线程下载策略,下面是我的一些想法,希望有高手能给点建议

多线程下载控制策略:

一、 由一个控制线程负责创建下载子任务,每个子任务由一个线程来完成。即一个控制线程不断创建线程来完成下载任务。

优点:控制线程可以直接控制线程数量,控制线程超时情况。

缺点:线程开销不太容易权衡。如果每个线程分配的任务块太小,会导致频繁创建线程,严重消耗系统资源。如果每个线程分配的任务块太大,会导致内存消耗过大。

二、 利用生产者消费者模式,控制线程不断往任务池里面放入任务,下载任务从任务池里面不断获取任务并执行。

优点:只有初始化时候的创建线程开销。

缺点:实现稍微费时

多线程任务分配策略:

一、固定块大小分配

每个任务每次下载固定大小一块,按顺序完成。

优点:简单粗暴,实现容易

缺点:不能最合理分配资源

二、动态块大小,

每个任务根据上次任务完成的时间,获取新的下载块范围。

优点:智能分配任务大小,在网速快的情况下增加分配任务的大小,减小网络连接次数。在网速慢的情况下,减小任务快大小,节省内存。

缺点:实现复杂

磁盘写入策略:

一、多线程随机写入:

不加锁,测试是没有问题的,但是感觉可能会增加seek次数,导致磁盘写入变慢

二、文件加锁写入:

每个线程写入时都要获取文件锁才能写入

这样可能会阻塞下载线程,不能完全占满带宽

三、利用生产者消费者模式

另开一个写入线程,并建立一个缓冲池

优点:不会阻塞下载线程

缺点:增加内存开销



Back