![]() |
1
7
你想实现一个 work stealing algorithm . 每个工作线程都有一个双端队列,新任务被添加到最小队列的底部。工人从自己队列的顶部删除任务(顶部/底部分隔减少了争用),当工人没有更多的作业要做时,它会从最大队列的底部窃取一个作业。它很简单,而且运行良好,我相信这就是微软的并行系统.net4.0所基于的算法。 结果分配是相当好的,如果整个系统中没有更多的作业可用,工作线程将只剩下没有工作要做。 注意。如果你想把一些示例代码拆开,我的朋友为C#写了一个偷作品系统,你可以找到 here |
![]() |
2
3
我的倾向不是试图提前弄清楚如何分配任务,而是把它们都放到一个共同的工作队列中。任何无需其他操作的工作线程都会从队列中获取下一个任务,并在队列中检查下一个任务。 |
![]() |
3
2
这个算法应该给你最好的结果,但与O(N M) 时间,其中N是任务数,M是线程数。解决方案的总成本为O(N logn+N |
![]() |
4
1
|
![]() |
5
1
给每个线程一些“点”。让
对于连续操作,没有最小
编辑: 编辑2: 如果预先知道所有任务以及线程数,那么我认为计算最优调度类似于 knapsack problem 一般来说,它是NP完全的(所以你会在某处得到指数)。我在上面描述的一个简单的基于成本的分析将给你一个相对较好的近似值,只要所有单个任务相对于分配给每个线程的总成本有一个较小的成本。 |
![]() |
6
1
虽然关于背包问题的建议是有帮助的,但是您说您正在尝试最小化执行的净时间。采用背包方法需要你不断增加背包的大小,直到你得到一个可行的解决方案-不是很有效。 如果执行的净时间受到并行工作的所有线程中最长完成时间的限制,我希望分配任务,以便最小化所有线程的最大工作时间。这样做可能会导致一个或多个线程无法完成大量工作,因此我们并没有真正地“平衡”工作。如果你想平衡工作,那是一个不同的目标函数。例如,您可能希望最小化线程之间的工作差异。 看看车间作业计划。如果你只是不经常这样做,我建议使用遗传算法-如果你必须经常这样做,并以更自动化的方式,我建议做一些文献搜索确定性算法。希望这有帮助。 |
![]() |
prmph · javascript上抢占式后台工作调度的通用解决方案 7 年前 |
![]() |
Terry Pang · 当涉及多个通道时,select如何工作? 7 年前 |
![]() |
martine · 索引器:索引2超出大小为2的轴0的界限(列表调度) 7 年前 |
![]() |
user2887596 · scala中长时间间隔的任务调度 7 年前 |
|
Kevin SUN · 具有实时任务的多核Linux软锁定 9 年前 |
![]() |
Mounhim · Quartz.net的日常工作每分钟都在执行 11 年前 |