一种基于网络状况的多线程下载调度算法.docx
- 文档编号:9312318
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:9
- 大小:19.26KB
一种基于网络状况的多线程下载调度算法.docx
《一种基于网络状况的多线程下载调度算法.docx》由会员分享,可在线阅读,更多相关《一种基于网络状况的多线程下载调度算法.docx(9页珍藏版)》请在冰豆网上搜索。
一种基于网络状况的多线程下载调度算法
一种基于网络状况的多线程下载调度算法
摘要:
针对现有的多线程下载软件中线程调度的问题,提出一种基于网络状况的线程调度算法。
本调度算法能够根据网络状况的好坏,决定开启的线程数量,也能实时地调整线程的阻塞、就绪等状态。
通过本算法能够有效利用用户的带宽资源,使得文件的传输更加高效。
关键词:
多线程;调度算法;线程池;网络下载
0引言
网络文件远程传输系统是企业信息化历程中的重要一环,随着企业电子办公业务的日益增多,如何高效率地传输大容量文件已经成为一个迫切需要解决的问题。
利用计算机和网络技术来进行文件管理,便于企业实现数据信息的共享,减轻管理人员的工作负荷,更能使办公文档的管理更加高效和安全。
虽然目前的传输软件种类繁多,但是软件功能实现方面还是良莠不齐,特别是在线程的开启管理方面还需进一步的提高。
在传输文件时采用多线程技术要比采用单一线程的传输速率高很多,尤其是在大体积文件传输方面。
但是,在利用多线程传输时,我们也会发现并非是开启的线程数目越多越好,有时开启的线程太多反而会拖累文件的传输速率。
如果能够根据实时的网络状况来调节线程的开启,便可更好地利用网络带宽,方便快捷地完成文件的传输。
为此,本文提出一种基于网络状况的线程调度算法,能够根据实时的网络状况调节开启的线程数量,也能调整线程的阻塞、就绪等状态。
通过本算法能够有效地利用用户的带宽资源,使得文件的传输更加快捷。
1算法的基本思想
采用多线程技术可以更好地利用系统资源、提高CPU的使用效率,但我们也必须认识到线程本身也可能影响系统的性能。
并非开启的线程越多执行任务的效率越高,使用过多的线程也可能会导致控制过于复杂甚至造成很多Bug。
本文提出的基于网络状况的多线程下载调度算法(Multi-TheadsDownloadSchedulingAlgorithmBasedonNetworkStatus,简称TDSA算法)便是根据网络状况的实时变化来调节需要开启的线程数目的。
它的核心思想是首先在初始化阶段对各个参数进行初始化赋值,伴随着文件的传输,进入启动阶段增加开启的线程数目,并随时对网络的状况进行监控。
一旦出现传输停滞的现象,算法将立即进入拥塞控制阶段来缓解网络负担。
在符合条件的情况下(t-i≤(dAlpha)aveTime),算法进入快速恢复阶段尽可能多的利用网络带宽来传输文件。
当文件传输完毕时,关闭线程,TDSA算法完毕。
TDSA算法的流程如图1所示。
2算法结构
2.1初始化阶段
在算法开启之初,将各个变量设置为初始值,为后面的运行做准备。
包括:
设netStatus=0;fileTrans=0;threadTrans=0;i=1;threadCount=1;threadMaxCount=25。
2.2启动阶段
在完成初始化阶段后,检查是否存在传输超时现象。
若无传输超时现象,则算法进入启动阶段。
在此阶段中,根据网络状况逐渐增加开启的线程数目。
若本次传输时间与线程传输的平均传输时间符合以下关系:
t-i≤(dAlpha)aveTime,则指数增加开启的线程数目;否则线性增加开启的线程数目。
当出现线程传输超时时,将netStatus置为1,进入拥塞避免阶段。
2.3拥塞避免阶段
当netStatus=1,即发生丢包或者发送超时时,算法进入拥塞避免阶段。
本阶段主要解决因网络无法承载当前线程数目而发生的拥塞问题。
首先,将线程开启阀值threadMaxCount置为刚刚丢包时的threadCount值,即设threadMaxCount=threadCount。
将可开启的线程数目设为原本的一半,即threadCount=threadCount*1/2。
通过这些设置可以减轻网络负担,使拥塞得到缓解。
避免了网络拥塞后,算法便进入快速恢复阶段。
2.4快速恢复阶段
本阶段主要功能是尽快恢复线程的传输功能,最大限度的利用网络资源。
首先判断线程开启数目是否达到阀值,若没有,则指数增加线程开启数目;当达到开启阀值时,则只有传输时间满足t-i≤(dAlpha)aveTime时才线性增加线程开启数目。
2.5结束阶段
当线程传输完毕时,将threadTrans置为1,并结束此线程。
全部线程结束,并且文件传输完毕时,将fileTrans置为1,结束TDSA线程调度算法。
3算法的实现
在TDSA算法的实现中,使用了.NetFramework中System.Threading命名空间提供的Thread类和ThreadPool类中的提供的部分方法。
使用它们可以方便线程的管理,还能有效解决线程执行安排、死锁、线程间通讯等问题。
3.1初始化各个参数
在TDSA算法开启之初,会将各个变量赋值,为后面的运行做准备。
还需要对线程池里的参数做相应设置。
首先需要初始化一个线程队列:
privateList
其次设置线程池中的线程数目threadCount:
privateintiThreadCount;
//当前线程池里的线程数
publicintthreadCount
{
get{returniThreadCount;}
set{iThreadCount=value;}
}
然后设置线程池的最大线程数threadMaxCount:
privateintiThreadMaxCount;
publicintthreadMaxCount
{
get{returniThreadMaxCount;}
set{iThreadMaxCount=value;}
}
最后设置线程调度系数dAlpha:
privatefloatdAlpha=1.5;
3.2开启定时器计算网络传输时间
利用timer类,每5秒检查一下网络传输情况,求出文件传输的平均时间aveTime:
timer=newSystem.Windows.Forms.Timer();
timer.Interval=5000;
timer.Tick+=newEventHandler(timer_Tick)
利用timer_Tick()方法来计算文件传输所用的平均时间。
aveTime即为线程传输的平均传输时间:
voidtimer_Tick(objectsender,EventArgse)
{
longsum=0;
foreach(MyThreadtinthreads)
{
sum+=t.Tick;//Tick为本次传输所用的时间
}
aveTime=(double)sum/threads.Count;//
}
在TDSA算法中以超过线程平均传输时间的3倍为界限,即当一个线程用来传输的时候超过算法计算的线程平均传输时间的2倍,即认为传输超时,置netStatus=1。
3.3根据实时的网络状况调度线程
首先在MyThreadPool()中初始化一定的数量的线程,现开启5个线程:
publicMyThreadPool(stringfile,SocketclientSocket)
{
//初始化参数
threadInitCount=5;
threadCount=5;
threads=newList
for(inti=0;i { threads.Add(newMyThread(false)); } } 当算法要求开启线程时,首先看线程池中有没有空闲的,如果有就可以直接调用: foreach(MyThreadtinthreads) { //遍历每个线程 if(t.Thread.ThreadState==ThreadState.Suspended) { t.Start(waitCallback,obj); returntrue; } } 若线程池中没有空闲的线程,并且当前线程数没有超线程池中线程数目的最大值,我们就新建一个线程供用户使用,否则返回错误。 if(threads.Count>=threadMaxCount) { returnfalse; } else { //新建一个线程 MyThreadthread=newMyThread(); //在程序执行完通知线程池移除它 thread.OnAbort+=newEventHandler(thread_OnAbort); threads.Add(thread); //加入队列后开始运行 thread.Start(waitCallback,obj); returntrue; }//以上部分的代码可以加lock锁,来保证线程的同步与线程安全。 当文件传输发生阻塞时,讲线程池中的线程最大值设为原本的1/2,进入算法的快速恢复阶段。 if(netStatus=1) { threadCount=threadCount/2; if(threadCount≤threadMaxCount) {…} elseif(ti≤(dAlpha)aveTime) {…} else {…} } 3.4算法的实现中使用到的Thread类和ThreadPool类 Thread类中重要的方法有: Start(): 启动线程 Sleep(int): 讲当前线程暂停指定的毫秒数 Abort(): 终止一个线程 Suspend(): 挂起线程,该方法并不终止未完成的线程,以后是可以恢复的 Resume(): 用于恢复被Suspend()方法挂起的线程 ThreadPool类用ThreadPool.QueueUserWorkItem()方法将线程安放在线程池里: publicstaticboolQueueUserWorkItem(WaitCallback); publicstaticboolQueueUserWorkItem(WaitCallback,object); 4算法结果分析 本文将通过两个方面的测试数据来分析算法的优越性与不足: 首先对比采用固定个线程和采用TDSA算法两种方式传输文件各自的传输时间。 我们分别测试了在采用单线程、固定采用5个线程、固定采用10个线程、固定采用20个线程和采用TDSA算法动态开启线程这5种方法来传输体积为161M的文件时,所需要的时间。 具体测试数据如图2所示。 通过上图的对比,我们可以看出: 在传输体积较大文件时,采用多线程技术传输文件要明显的在传输时间上优于单线程。 同时也发现在采用多线程技术时并非开启的线程数目越多传输的效率就越高。 本例中开启20个线程传输161M文件时就比采用10个线程传输花费的时间还多。 采用TDSA算法传输文件要明显的优于单线程传输,同时比采用固定个数的多线程方式也具有一定的优越性。 其次,我们着重对适用TDSA算法的传输情况进行了分析。 我们将TDSA算法与采用5个固定线程、采用固定10个线程和采用固定20个线程传输不同体积文件所花费的时间进行了绘图比较。 在测试时我们分别传输了体积为1M、10M、50M、100M、160M的文件。 具体测试数据如图3所示。 由图3的对比数据可以看出,随着文件体积的增大采用不同方法传输文件所花费的时间的差异性越来越明显。 在传输小体积文件时TDSA算法的传输时间并没有占到明显的优势,但是随着文件体积的增大,TDSA算法传输文件时则要优于其他的3种传输方法。 所以,本文认为TDSA算法更适合做大体积文件的传输。 5结束语 针对现有的多线程下载软件中线程调度的问题,本文提出一种基于网络状况的线程调度算法。 该算法能够根据实时的网络状况,结合线程池的使用,调节开启的线程数量、调整线程的阻塞、就绪等状态。 通过使用本算法能够有效地利用用户的带宽资源,更加高效地完成文件的传输。 参考文献: [1]刘必雄,许榕生.大规模文件上传接收服务的负载均衡引擎研究[J].计算机技术与发展,2008(06). [2]胡泊,付宇卓.一种新的基于可配置处理器的异构多核线程级动态调度模型[J].中国集成电路,2009(02). [3]潘永锋,樊晓桠.基于门限和数据Cache预测的同时多线程调度策略[J].科学技术与工程,2008(04). [4]王晶,樊晓枉,张盛兵,王海.多核多线程结构线程调度策略研究[J].计算机科学,2007(09). [5]卢洁,张淑清,应启戛.几种网络拥塞控制算法比较分析[J].自动化仪表,2006(S1). [6]何东之,李伟,张向文.一种新型实时调度算法研究[J].小型微型计算机系统,2005(11). [7]刘轶,郑守淇,钱德沛.一种分布式共享存储系统的线程分配算法[J].计算机研究与发展,2000(05).
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一种 基于 网络 状况 多线程 下载 调度 算法