进程的调度策略
调度策略:一组规则,决定什么时候以怎样的方式选择一个新进程运行。
Linux的调度基于分时和优先级,进程根据优先级来排队
优先级是动态的
进程调度的时机:
-
中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();
-
内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;
-
用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
内核线程是只有内核态没有用户态的特殊进程。
进程的切换
进程的切换:挂起正在cpu上正在执行的进程,并恢复以前挂起的某个进程的执行,也叫任务切换。
中断上下文的切换是在同一个进程中的。
进程上下文包含了进程执行的所有信息:
用户地址空间;程序代码,数据,用户堆栈等等
控制信息:进程描述符,内核堆栈等
硬件上下文:使用switch_to函数,而中断仅仅只是保存现场和恢复现场
schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换