一个作业是多线程下载策略,下面是我的一些想法,希望有高手能给点建议
多线程下载控制策略:
一、 由一个控制线程负责创建下载子任务,每个子任务由一个线程来完成。即一个控制线程不断创建线程来完成下载任务。
优点:控制线程可以直接控制线程数量,控制线程超时情况。
缺点:线程开销不太容易权衡。如果每个线程分配的任务块太小,会导致频繁创建线程,严重消耗系统资源。如果每个线程分配的任务块太大,会导致内存消耗过大。
二、 利用生产者消费者模式,控制线程不断往任务池里面放入任务,下载任务从任务池里面不断获取任务并执行。
优点:只有初始化时候的创建线程开销。
缺点:实现稍微费时
多线程任务分配策略:
一、固定块大小分配
每个任务每次下载固定大小一块,按顺序完成。
优点:简单粗暴,实现容易
缺点:不能最合理分配资源
二、动态块大小,
每个任务根据上次任务完成的时间,获取新的下载块范围。
优点:智能分配任务大小,在网速快的情况下增加分配任务的大小,减小网络连接次数。在网速慢的情况下,减小任务快大小,节省内存。
缺点:实现复杂
磁盘写入策略:
一、多线程随机写入:
不加锁,测试是没有问题的,但是感觉可能会增加 seek 次数,导致磁盘写入变慢
二、文件加锁写入:
每个线程写入时都要获取文件锁才能写入
这样可能会阻塞下载线程,不能完全占满带宽
三、利用生产者消费者模式
另开一个写入线程,并建立一个缓冲池
优点:不会阻塞下载线程
缺点:增加内存开销