【发布时间】:2013-03-07 14:10:43
【问题描述】:
我正在尝试实现一个任务调度程序,其中我有 n 个任务。我的任务调度器背后的想法是,在一个向量的队列循环中,任务应该被排入队列循环中最短的队列,这是通过以下代码完成的。
#include <vector>
#include <queue>
std::vector<std::queue<int> > q
int min_index = 0;
task t // implemented in the other part of the program
std::size_t size = q.size();
for( i=0; i<size; i++){ //accessing loop of queues
if(q[min_index].size() > q[i].size())
min_index = i; // Now q[min_index] is the shortest queue
}
q[min_index].push(Task);
接下来我试图扩展这个范式以减少调度程序的开销时间,而不是每次都搜索最短的队列,而是搜索一些条件,即。在 5 个任务入队后搜索最短队列。
我需要做这样的事情
#include <vector>
#include <queue>
std::vector<std::queue<int> > q
task t // implemented in the other part of the program
while(q[min_index].size()!=q[min_index].size()+5) // check whether current min_index queue's size is increased 5 more times if not goto enqueue
{
goto enqueue;
}
int min_index = 0;
std::size_t size = q.size();
for( i=0; i<size; i++){ //accessing loop of queues
if(q[min_index].size() > q[i].size())
min_index = i; // Now q[min_index] is the shortest queue
}
enqueue:
q[min_index].push(Task);
有人可以帮助我如何正确进行。在此先感谢
更新 我没有考虑 5(一个随机数),而是想到了一个每次都可靠且近似的数字。所以我想到了获取队列循环的 min_value 大小和 max_value 大小的差异,并每次与计数器进行比较。
// global variables
std::vector<std::queue<int> > q;
int counter = INT_MAX; //
int min_index = 0;
int max_size = -1;
void enqueue(scheduler::task new_task) {
if ( counter > diff_size ){
// look for new min and maximum
std::size_t size = q.size();
for( i=0; i<size; i++){
if(q[min_index].size() > q[i].size())
min_index = i;
if(q[i].size() > max_size)
max_size = q[i].size();
diff_size=max_size - min_index;
}
// counter reset
counter = 0;
}
// enqueue in minimum queue
q[min_index].push(new_task)
// increase counter
counter ++;
}
【问题讨论】:
-
一般来说,你应该只使用一个队列。多个队列几乎总是会增加开销并且导致不太理想的调度。
-
@JerryCoffin 是的,但是一种名为“工作窃取”的著名调度技术使用本地队列到线程,所以我只是想以另一种方式使用相同的想法。
-
好吧,如果您坚持这样做,最好的方法可能是维护您的队列的优先级队列,优先级基于它们的长度,因此您始终可以轻松访问最短队列。
-
@JerryCoffin 好的,但我尝试了这个,我显着减少了开销时间,而不是使用单个全局队列,但仍然比“工作窃取”慢。所以我要通过这个新的更新来减少开销。你能帮我正确处理更新的部分吗
-
那么,@billa,您想找到最短的队列,将接下来的 5 个任务添加到其中,然后再进行搜索吗?这样您就不必每次都搜索。这就是你想要的吗?
标签: c++ loops for-loop queue goto