并发编程中的任务调度与工作分配
在并发编程中,任务调度和工作分配是提高程序性能的关键因素。本文将深入探讨贪心调度、工作分配算法,特别是工作窃取算法,以及工作窃取双端队列(DEQueue)的实现。
贪心调度的边界与优势
在并发任务调度中,贪心调度是一种有效的策略。通过分析调度步骤和最长有向路径,我们可以得出贪心调度的空闲步骤上限。具体来说,贪心调度最多有 $T_{\infty}$ 个空闲步骤,每个空闲步骤最多添加 $(P - 1)$ 个令牌,因此空闲桶中最多包含 $T_{\infty}(P - 1)$ 个令牌。两个桶中的令牌总数满足 $\sum_{i = 0}^{T - 1} p_i \leq T_1 + T_{\infty}(P - 1)$。
值得注意的是,这个边界与最优调度的边界相差不超过两倍。由于实现最优调度是一个 NP 完全问题,贪心调度成为了一种简单且实用的方法,能够让程序性能接近最优。
工作分配算法
实现良好加速比的关键在于为用户级线程持续提供任务,使调度尽可能贪心。然而,多线程计算会动态地创建和销毁任务,有时甚至难以预测。因此,需要一种高效的工作分配算法,将就绪任务分配给空闲线程。
常见的工作分配方法有工作处理和工作窃取。工作处理是指过载线程将任务卸载到负载较轻的线程,但如果大多数线程都过载,这种方法会导致任务交换的徒劳努力。而工作窃取则是当线程任务耗尽时,从其他线程“窃取”工作。这种方法的优势在于,当所有线程都忙碌时,不会浪费时间进行任务卸载。
工作窃取算法
每个线程维护一个双端队列(DEQueue)来存储待执行的任务,提供 pushBottom
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



