进程调度初始化
由于该过程涉及到进程的管理模块,这个模块的详细过程我们将在以后的机会介绍,所以这里,我们主要扣出与调度相关的内容。进程的创建内核入口为do_fork,首先我们简单的看一下它的主要行为:
上图我们只是画了do_fork最普通的fork操作,及正常的启动状态,上面的三个sched_class函数调用就是我们想要的进程调度初始化。我们分别来分析:
task_fork_fair:确定新进程的vruntime值。首先更新当前进程(父进程)的执行信息(update_curr),确定新进程的起始vruntime(place_entity),如果新的进程被设置了sysctl_sched_child_runs_first,并且父进程的vruntime大于子进程的,那么就交换它们的vruntime值,并且设置父进程的TIF_NEED_RESCHED,让它在下次主调度中结束运行,让其它更低vruntime的先运行(不能保证一定是它的子进程先运行,但在它退出运行后,它的子进程一定会比它先运行),然后标准化vruntime,因为现在的子进程还没有入队。