调度子系统1_调度子系统初始化(三)

2014-11-24 02:49:03 · 作者: · 浏览: 10
的移动,达到balancing的目的。 //在有支持smp的架构,会在sched_init中,、通过open_softirq注册SCHED_SOFTIRQ软中断,在周期性调度scheduler_tick中通过 //调用trigger_load_balance确认目前的jiffies值是否大于要触发load balance的时间戳,并通过raise_softirq触发SCHED_SOFTIRQ。 //在load balance软中断中就会通过调用run_rebalance_domains进行scheduling domain load balance. //有关scheduling domain进一步的 容,参考 //Documentation/scheduler/sched-domains.txt. struct sched_domain *sd; //为1表示目前cpu rq中执行的为idle task //为0表示执行非idle task unsigned char idle_at_tick; int post_schedule; //为1表示这个rq正在运行fair scheduling的load balance,此时会调用stop_one_cpu_nowait暂停该cpu的进程 //然后通过调用active_load_balance_cpu_stop把tasks从最忙碌的处理器移到idle的处理器上执行 int active_balance; //用以存储目前进入idle状态并且进行load balance流程的处理器id。 //整个流程为 // 进程调用schedule时, 若该处理器rq的nr_running为0(也就是目前没有正在执行的task),就会调用idle_balance并 // 触发后续load balance流程 int push_cpu; //用以存储目前运作这个rq的处理器id int cpu; int online; //如果rq中目前有task正在执行,这个值会等于目前该rq的load weight除以目前rq中task数目的均值 unsigned long avg_load_per_task; struct task_struct *migration_thread; struct list_head migration_queue; //此值由real-time scheduling class通过函数 update_curr_rt用以统计目前real-time task执行时间的均值, //在通过rq的clock_task减去目前task执行的起始时间,取得执行时间的delta值。 //然后通过sched_rt_avg_update把这delta值跟原本rq中的rt_avg值取平均值.从运行的周期来看, 这个值可反应目前系统 //中real-time task平均被分配到的执行时间值 u64 rt_avg; u64 age_stamp; //表示cpu进入idle状态的时间 u64 idle_stamp; u64 avg_idle; #endif //用以记录下一次计算cpu load的时间,初始值为当前的jiffies加上五秒与1次的scheduling tick的间隔 unsigned long calc_load_update; long calc_load_active; #ifdef CONFIG_SCHED_HRTICK #ifdef CONFIG_SMP int hrtick_csd_pending; struct call_single_data hrtick_csd; #endif struct hrtimer hrtick_timer; #endif };