我正在尝试将自己的策略添加到linux内核调度程序中。
每个进程在int my_policy
中都有task_struct
,我的要求是只有具有最高策略的进程可以一次运行(没有策略集的进程,即my_policy = -1
可以定期运行)。
我试图相应地每隔scheduler_tick()
从runqueue添加/删除进程,并且大部分时间它都有效,但是另一次它被卡住了!
这是我的代码:(在scheduler_tick()函数内部)
struct task_struct *it;
int max_policy = -1;
for_each_task(it) {
if (it->my_policy != -1 && (it->state == TASK_RUNNING || (it->state == TASK_UNINTERRUPTIBLE && it->is_waiting_policy == 1))) {
if (it->my_policy > max_policy)
max_policy = it->my_policy;
}
}
if (max_policy > -1) {
for_each_task(it) {
/* don't look at process without policy */
if (it->my_policy == -1)
continue;
if (it->state == TASK_RUNNING && it->my_policy < max_policy) {
it->is_waiting_policy = 1;
it->state = TASK_UNINTERRUPTIBLE;
deactivate_task(it, rq);
} else if (it->state == TASK_UNINTERRUPTIBLE && it->is_waiting_policy == 1 && it->my_policy == max_policy) {
it->is_waiting_policy = 0;
it->state = TASK_RUNNING;
activate_task(it, rq);
}
}
}
就像我说的,有时它不起作用:( 我究竟做错了什么?感谢。
答案 0 :(得分:0)
我已经完成了你的逻辑。我已经写了一些你可以检查的假设。逻辑似乎正常,当前正在运行的进程将继续运行,或者另一个进程将被激活运行,但是,在您的逻辑中,可能在当前运行的任务之前激活任务停用。当要激活的任务在for_each_task
循环中停用任务之前发生这种情况。 activate_task
将如何处理这个问题?
假设是:
目前有一个进程正在运行(即计划使用CPU)。 (如果没有确定其他进程具有更高的优先级,则逻辑允许此进程继续运行。)
所有其他流程都有is_waiting_policy == 1
。
it->state
是{TASK_RUNNING | TASK_UNINTERRUPTIBLE }
;没有其他州。