进程调度时机的跟踪分析

Posted on 2016-04-17 22:42  昆仑雪狐  阅读(150)  评论(0编辑  收藏  举报
用户态进程只能被动被调度
中断处理过程,直接调用schedule(),返回用户态时根据need_sched()调用schedule
内核线程可直接调用schedule(),也可在在中断处理过程中进行调度,作为特殊进程可以主动调度,也可以被动调度
用户态进程无法主动调度,仅能通过陷入内核态后的某个时间点进行调度
内核必须有能力挂起正在执行的进程,与中断不同,中断时同一个进程上下文,用户态内核态变化
进程上下文包含更多信息:
用户地址空间,代码数据用户堆栈
控制信息:进程描述符,内核堆栈
硬件上下文:中断也保存,方式不同
schedule-  __schedule    pick_next_task
context_switch
switch_to
next_ip一般是$1f,对于新创建的子进程是ret_from_fork
一般抽象:
一个用户态进程x,需要切换到用户态进程y
发生中断,压入x的内核堆栈,
SAVE_ALL
中断过程或返回之前调用schedule(),,switch_to做了关键的进程上下文切换
标号1之后开始运行用户态进程y,y曾被切换出去过。y的内核部分
restore_all
iret
继续用户态进程y

By:昆仑雪狐

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000