gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:23 25 4
gpt4 key购买 nike

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

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

set_current_state(TASK_INTERRUPTIBLE);

while (!kthread_should_stop()) {
....
schedule();
.....
}
__set_current_state(TASK_RUNNING);

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

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

最佳答案

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

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

  • TASK_UNINTERRUPTIBLE 没有被信号唤醒;
  • TASK_KILLABLE 仅被致命信号唤醒;
  • TASK_INTERRUPTIBLE 被任何信号唤醒。

此外,TASK_IDLETASK_UNINTERRUPTIBLE 类似,但不影响平均负载。

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

通常,您将在等待队列中等待,在这种情况下,您不需要直接设置任务状态 - 相反,您可以按照以下模式使用等待队列助手:

DEFINE_WAIT(wait);

prepare_to_wait(waitqueue, &wait, TASK_UNINTERRUPTIBLE);
schedule();
finish_wait(waitqueue, &wait);

关于c - 我们需要在调用 schedule 之前调用 set_current_state(TASK_INTERRUPTIBLE) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58055527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com