3

我知道内核调度程序会定期运行。该时间段由计时器确定。但是,我一直无法找到定时器中断的 IRQ 在哪里以及从调度程序代码开始到结束的整个流程。

我知道 schedule() 函数可能有几个入口和出口点。但有人可以指出我在哪里寻找这些吗?

从内核源代码中,我收集到 __schedule() 是主要的调度函数,似乎是从 schedule() 调用的......

4

1 回答 1

2

Linux 内核中实际上有两个调度程序,或者说是两个调度代码。有一个核心调度程序,您自己提到过,它称为 schedule(),它调用 __schedule()。schedule() 从内核中的许多点调用:

  1. 显式阻塞,例如信号量、互斥锁等。
  2. 在中断和返回用户空间时检查标志 TIF_NEED_RESCHED,如果设置则调用调度。
  3. 一个进程被唤醒。

还有另一个调度程序代码,名称为 scheduler_tick()[这也驻留在 core.c] 中,它是一个周期性调度程序,由定时器代码(timer.c) 通过中断频率为 HZ 调用,即 scheduler_tick()在一秒钟内称为 HZ 次。HZ 取决于硬件,其值在 100-1024 之间变化。scheduler_tick() 调用处理器上当前任务所属的调度类的 task_tick()。

于 2013-03-28T12:27:49.180 回答