进程调度与进程调度的时机分析

作者:20133205张卫东
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
所谓进程调度程序,即为确保进程能够有效工作的一个内核子系统,它负责决定哪个进程投入运行,何时运行以及运行多长时间。
进程调度的时机包括:中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
不同类型的进程有不同的调度需求。
第一种分类:
I/O-bound 频繁的进行I/O;通常会花费很多时间等待I/O操作的完成。
CPU-bound 计算密集型;需要大量的CPU时间进行运算。
第二种分类:
批处理进程
实时进程
交互式进程 shell
为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换,schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换。
实验截图:
http://s14/mw690/002JBYijgy70VrEHXIxbd&690
http://s15/mw690/002JBYijgy70VrH4QsC2e&690
http://s11/mw690/002JBYijgy70VrIjXsKea&690
http://s4/mw690/002JBYijgy70VrJYssX43&690Linux系统的一般执行过程:最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程。