Linux 内核分析 -- 进程调度实现原理简单分析
进程调度时机 --
schedule()
所有可能执行调度的时间点:
- 主动调度
- 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();
- 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;
- 被动调度
- 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
总的来说,发生
中断
或者在内核线程
中时才会出现进程调度调度,调用schedule()
。
调用顺序
schedule()
schedule()
函数调用pick_next_task
选择一个新的进程来运行,并调用context_switch
完成进程上下文的切换。context_switch
靠调用switch_to
这个宏来进行关键上下文切换
next = pick_next_task(rq, prev);//进程调度算法都封装这个函数内部,选择出来下一个将要执行的进程
context_switch(rq, prev, next);//进程上下文切换
switch_to
利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程
1 |
|
只将汇编逻辑代码提出来,将前一个进程记做1号进程,后面的记做2号进程
1 |
|
Linux 内核分析 -- 进程调度实现原理简单分析
http://blog.soul11201.com/2016/04/11/mooc-linux-kernel-8/