当我们需要进行一项异步工作时,只需要创建一个任务对象,并告知任务调度器即可,之后的工作完全交给任务调度器去执行。那么任务调度器是如何确保执行的效率的呢?
任务调度器主要采用两种试探法是爬山(hill climbing)和工作窃取(work stealing)。
爬山算法:每当有新的任务需要执行时,默认创建新的线程来执行任务,并监视性能,一旦性能开始下降,则考虑降回最佳性能的线程数量。
工作窃取:通过算法计算每个线程的工作量,如果存在任务特别少和任务特别多的线程,那么任务少的线程可能会从任务多的线程上窃取一些任务。这就好像两个工人同时工作,一个人活儿少而且干活快,完工之后可以帮另一个工人多干一些。
TPL使用这些算法来动态的调整自己的性能,平衡处理器的工作量。同时,如果TPL能够知道关于任务更多的信息,则能够帮助它更好的调度。例如,通常TPL认为任务都是处理器受限的,且运行时间较短,如果你需要运行一个长时间运行的任务,可以在创建任务的时候,告知任务调度器,这是一个长时间运行的任务,这样调度器能更好的调配资源,例如为任务创建专用的线程,或增加总体线程数量,以避免任务长时间占用资源,而其他短时间的任务只能等待。