Linux kernel 在schedule()之后恢复线程

Linux kernel 在schedule()之后恢复线程,linux-kernel,Linux Kernel,另一个新手问题: 在下面的代码中,如果线程在调用“set_current_state”之后但在调用“schedule”之前被抢占,该怎么办。再次调度代码时,它是否从“schedule”调用开始,并从运行队列中删除?或者这次忽略“schedule”调用,并从set_current_state(TASK_RUNNING)语句开始 { ... set_current_state(TASK_INTERRUPTIBLE); /* suppose thread is preempted just after

另一个新手问题:

在下面的代码中,如果线程在调用“set_current_state”之后但在调用“schedule”之前被抢占,该怎么办。再次调度代码时,它是否从“schedule”调用开始,并从运行队列中删除?或者这次忽略“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);
...
} 
如果非自愿先占发生在第一行之后第二行之前,那么(或多或少)会发生以下情况:

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

  • 由于您的任务被标记为不可运行,因此计划程序将从运行队列中将其删除,并选择另一个任务

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

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

  • 然后调用schedule()函数。调度程序很可能会再次选择同一个任务,因为它刚刚选择了最适合运行的任务,并且不太可能会改变

  • 在从调度程序返回的过程中,最后一个set_current_状态基本上将是no op,因为此时任务已在该场景中标记为runnable


  • 谢谢!这将帮助我更好地理解优先购买权!:)