从内核runqueue添加/删除进程

时间:2015-06-08 16:25:48

标签: c linux operating-system kernel scheduler

我正在尝试将自己的策略添加到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);
        }
    }
}

就像我说的,有时它不起作用:( 我究竟做错了什么?感谢。

1 个答案:

答案 0 :(得分:0)

我已经完成了你的逻辑。我已经写了一些你可以检查的假设。逻辑似乎正常,当前正在运行的进程将继续运行,或者另一个进程将被激活运行,但是,在您的逻辑中,可能在当前运行的任务之前激活任务停用。当要激活的任务在for_each_task循环中停用任务之前发生这种情况。 activate_task将如何处理这个问题?

假设是:

  • 目前有一个进程正在运行(即计划使用CPU)。 (如果没有确定其他进程具有更高的优先级,则逻辑允许此进程继续运行。)

  • 所有其他流程都有is_waiting_policy == 1

  • it->state{TASK_RUNNING | TASK_UNINTERRUPTIBLE };没有其他州。