进程调度
- 计算机中有一个设备,叫定时器,准确说叫可编程定时/计数器
- 而这个滴答将会给 CPU 产生一个时钟中断信号
- 而这个中断信号会使 CPU 查找中断向量表,找到操作系统写好的一个时钟中断处理函数 do_timer
- do_timer 会首先将当前进程的 counter 变量 -1,如果 counter 此时仍然大于 0,则就此结束(原文为结束,本人认为是结束调度继续执行当前进程)
- 但如果 counter = 0 了,就开始进行进程的调度
- 进程调度就是找到所有处于 RUNNABLE 状态的进程,并找到一个 counter 值最大的进程,把它丢进 switch_to 函数的入参里
- switch_to 这个终极函数,会保存当前进程上下文,恢复要跳转到的这个进程的上下文,同时使得 CPU 跳转到这个进程的偏移地址处
- 接着,这个进程就舒舒服服地运行了起来,等待着下一次滴答的来临
阻塞
阻塞的本质,是将进程挂起,不再参与进程调度
而挂起的本质,其实就是将进程的 state 赋值为非 RUNNABLE,这样调度机制的代码(进程调度第六步)中,就不会把它作为下一个获得 CPU 运行机会的可选项了