gpt4 book ai didi

linux-kernel - 在 schedule() 之后恢复线程

转载 作者:行者123 更新时间:2023-12-04 04:23:27 26 4
gpt4 key购买 nike

另一个新手问题:

在下面的代码中,如果线程在调用“set_current_state”之后但在调用“schedule”之前被抢占怎么办。再次调度代码时,它是否从"dispatch"调用开始并从运行队列中删除?或者这次 'schedule' 调用被忽略并从 set_current_state(TASK_RUNNING) 语句开始?

{
...
set_current_state(TASK_INTERRUPTIBLE); /* suppose thread is preempted just after this function call */
schedule();
set_current_state(TASK_RUNNING);
...
}

最佳答案

以下是(或多或少)如果非自愿抢占发生在第一行之后和第二行之前会发生什么:

  1. 调度程序将运行(来自 sched.c 的 scheduler() 函数)- 因为这就是被抢占的意思。

  2. 由于您的任务被标记为不可运行,调度程序会将其从运行队列中移除并选择另一个任务。

  3. 现在您的任务将不会被安排,直到外部的东西再次将其标记为可运行。这可能是由于发送到任务的信号,或者假设任务在等待队列中排队,由于唤醒队列属于发生的事件,但外部必须再次将任务标记为可运行,否则它将永远不会被调度.这就是为什么如果您查看等待队列代码,它首先将任务放入等待队列,然后才执行与您的代码类似的操作。

  4. 当您的任务被标记为可运行时,调度程序会在某个时候选择它并将上下文切换到任务代码中。

  5. 然后 schedule() 函数将被调用。调度程序很可能会再次选择相同的任务,因为它刚刚被选择为最有资格运行的任务,而且这种情况不太可能发生变化。

  6. 在从调度程序返回的路上,最后一个 set_current_state 基本上是一个空操作,因为此时的任务在这种情况下已经被标记为可运行。

关于linux-kernel - 在 schedule() 之后恢复线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6808192/

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