我们需要在调用 schedule 之前调用 set_current_state(TASK_INTERRUPTIBLE) 吗?

md.*_*mal 2 c scheduling linux-device-driver linux-kernel

我是否需要在调用set_current_state()之前调用schedule()以安排运行队列中的下一个进程?

我看过很多代码,其中内核线程函数set_current_state()用于将状态设置为TASK_RUNNINGTASK_UNINTERRUPTIBLE

set_current_state(TASK_INTERRUPTIBLE);

while (!kthread_should_stop()) {
        ....
        schedule();
        .....
}
__set_current_state(TASK_RUNNING);
Run Code Online (Sandbox Code Playgroud)

是否有必要调用set_current_state()TASK_INTERRUPTIBLE调用之前schedule()

在这个示例代码中,将状态设置为TASK_RUNNING退出kthread_should_stop()循环后有什么用?

caf*_*caf 5

是的,您必须在调用set_current_state()之前调用schedule(),否则调度程序不会从运行队列中删除任务(如果您只想潜在地允许其他任务在不进入睡眠状态的情况下运行,您应该cond_resched()改为调用)。

你设置的任务状态取决于你是否想被信号唤醒:

  • TASK_UNINTERRUPTIBLE 不被信号唤醒;
  • TASK_KILLABLE 只会被致命的信号唤醒;
  • TASK_INTERRUPTIBLE 被任何信号唤醒。

此外,TASK_IDLE类似于TASK_UNINTERRUPTIBLE但对平均负载没有贡献。

代码将状态设置回的原因TASK_RUNNING是因为kthread_should_stop()可能在while()循环的第一次迭代中返回了 true ,因此schedule()从未被调用(TASK_RUNNING从返回后您不需要将任务状态设置回schedule())。

通常,您将等待一个waitqueue,在这种情况下,您不需要直接设置任务状态——相反,您可以以如下模式使用waitqueue 助手:

DEFINE_WAIT(wait);

prepare_to_wait(waitqueue, &wait, TASK_UNINTERRUPTIBLE);
schedule();
finish_wait(waitqueue, &wait);
Run Code Online (Sandbox Code Playgroud)