1.理解进程调度时机跟踪分析进程调度与进程切换的过程
进程调度的时机主要有以下几个:
- 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();
- 内核线程(只有内核态没有用户态的特殊进程)可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;
- 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
不难看出,无论是中断处理过程,还是内核线程进行进程调度,都需要调用schedule函数(一个内核函数,不是系统调用)实现。
schedule函数的作用:在运行队列中找到一个进程,把cpu分配给他。
进程上下文切换过程:
进程上下文切换与中断上下文切换的区别:
-
中断前后是在同一个进程上下文中,只是由用户态转向内核态执行;
-
进程上下文包含了进程执行需要的所有信息
-
用户地址空间: 包括程序代码,数据,用户堆栈等
-
控制信息 :进程描述符,内核堆栈等
-
硬件上下文(注意中断也要保存硬件上下文只是保存的方法不同)
-
相关代码分析: