md.*_*mal 2 c scheduling linux-device-driver linux-kernel
我是否需要在调用set_current_state()之前调用schedule()以安排运行队列中的下一个进程?
我看过很多代码,其中内核线程函数set_current_state()用于将状态设置为TASK_RUNNING或TASK_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()循环后有什么用?
是的,您必须在调用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)