调度子系统1_调度子系统初始化(三)
的移动,达到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
};