algorithm - 线程间负载均衡的启发式算法

标签 algorithm scheduling load-balancing heuristics

我正在开发一个多线程程序,其中有许多工作线程执行长度不等的任务。我想对任务进行负载平衡,以确保它们完成大致相同的工作量。对于每个任务 Ti,我都有一个数字 ci,它提供了该任务所需工作量的一个很好的近似值。

我正在寻找一种高效的(O(N) N = 任务数或更好)的算法,在给定 ci 的值的情况下,该算法将“大致”提供良好的负载平衡。它不一定是最佳的,但我希望能够对结果分配的糟糕程度有一些理论上的限制。

有什么想法吗?

最佳答案

您想实现一个 work stealing algorithm .每个工作线程都有一个双端队列,新任务被添加到最小队列的底部。工作人员从自己队列的顶部移除任务(顶部/底部分离减少了争用),当工作人员没有更多工作要做时,它会从最大队列的底部窃取工作。它很简单,而且效果很好,我相信这就是微软.net4.0 附带的并行系统所基于的算法。

结果分配非常好,只有在整个系统中没有更多工作可用时,工作线程才会无事可做。

铌。如果你想拆开一些示例代码,我的 friend 为 C# 编写了一个工作窃取系统,你可以找到它 here

关于algorithm - 线程间负载均衡的启发式算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2447089/

相关文章:

c# - Windows 操作系统如何检测算法是否符合 FIPS?

c# - 从表生成树结构

python - 使用 python apscheduler 调度作业

algorithm - MPI:负载均衡算法(Master-Slave模型)

spring - Spring +负载平衡/集群

c# - 计算字符串中的箭头

algorithm - 找到二维空间中最远的两个点(曼哈顿距离)

php - 我应该在 PHP 项目中使用什么进行简单的 cron 作业管理?

c# - 优先使用多线程的作业调度程序

linux - 负载均衡器 Nginx 502 网关错误,没有实时上游 Docker