主动调度

调用 schedule() 函数, 主动让出 CPU.

  • 首先,在当前的 CPU 上,我们取出任务队列 rq。
  • 第二步,获取下一个任务,task_struct *next 指向下一个任务,这就是继任。
  • 第三步,当选出的继任者和前任不同,就要进行上下文切换,继任者进程正式进入运行。

进程上下文切换

上下文切换主要干两件事情:

  • 一是切换进程空间,也即虚拟内存
  • 二是切换寄存器和 CPU 上下文

  • context_switch: 切换内存

  • switch_to: 寄存器和栈的切换

所谓的进程切换,就是将某个进程的 thread_struct 里面的寄存器的值,写入到 CPU 的 TR 指向的 tss_struct,对于 CPU 来讲,这就算是完成了切换。

指令指针的保存与恢复

进程的调度都最终会调用到 __schedule 函数

总结

image.png