2014年9月14日 星期日

struct sched_class()


source:sched_class


1103 struct sched_class {
/*會指向下一個Scheduling Class,Scheduling Class的順序為stop_sched_class->rt_sched_class->fair_sched_class->idle_sched_class*/
1104         const struct sched_class *next;
/*當Task屬於Runnable狀態時,就會呼叫這個函式把Task配置到RunQueue RBTree中,進行排程動作,並呼叫inc_nr_running將RunQueue中nr_running的值加一.(nr_running用以代表目前RunQueue有多少Runnable Task進行排程)*/
1106         void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);
/*當Task不需要執行時,就會呼叫這個函式把Task從RunQueue RBTree中移除,並呼叫dec_nr_running將RunQueue中nr_running的值減一.*/
1107         void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);
/*用以暫停目前正在執行中的Task,如果sysctl_sched_compat_yield有設定,就會找出目前RBTree中最右邊的Task(也就是vrruntime最多的Task),讓目前Task的vrruntime值等於最右邊Task值的vrruntime加一(可參考:se->vruntime = rightmost->vruntime + 1),如此在下次排程觸發時就會透過函式put_prev_task把目前的Task放到RBTree的最右邊,也就等同於暫停Task,讓該Task下次被執行到的機會最低.*/
1108         void (*yield_task) (struct rq *rq);
1109         bool (*yield_to_task) (struct rq *rq, struct task_struct *p, bool preempt);
/*用以決定一個Task是否可以中斷目前正在運作的Task,取得執行權.以CFS本身的實作來說 (in sched_fair.c).如果想要取代目前Task的Task本身的Scheduling Policy為 Batch或是Idle時,會直接返回,不會用來取代目前正在執行中的Task.反之,如果目前正在執行中的Task的Scheduling Policy為Idle,就會直接由所傳入的Task取代目前正在執行的Task*/
1111         void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int flags);
1113         /*
1114          * It is the responsibility of the pick_next_task() method that will
1115          * return the next task to call put_prev_task() on the @prev task or
1116          * something equivalent.
1117          *
1118          * May return RETRY_TASK when it finds a higher prio class has runnable
1119          * tasks.
1120          */
/*用以在排程觸發時,從RunQueue RBTree中,取出符合目前Scheduling邏輯的下一個要被執行的Task*/
1121         struct task_struct * (*pick_next_task) (struct rq *rq,
1122                                                 struct task_struct *prev);
/*用以在排程觸發時,把上一個執行完畢的Task放到目前RunQueue RBTree中對應的位置*/
1123         void (*put_prev_task) (struct rq *rq, struct task_struct *p);
1125 #ifdef CONFIG_SMP
/*通常用在執行一個新的程序,或是WakeUp一個Task時,會根據目前SMP下每個處理器的負荷,決定Task是否要切換到另一個處理器的RunQueue去執行,執行時會返回最後目標處理器的值.*/
1126      int  (*select_task_rq)(struct task_struct *p, int task_cpu, int sd_flag, int flags);
1127         void (*migrate_task_rq)(struct task_struct *p, int next_cpu);
1129         void (*post_schedule) (struct rq *this_rq);
1130         void (*task_waking) (struct task_struct *task);
1131         void (*task_woken) (struct rq *this_rq, struct task_struct *task);
1133         void (*set_cpus_allowed)(struct task_struct *p,
1134                                  const struct cpumask *newmask);
1136         void (*rq_online)(struct rq *rq);
1137         void (*rq_offline)(struct rq *rq);
1138 #endif
1140         void (*set_curr_task) (struct rq *rq);
1141         void (*task_tick) (struct rq *rq, struct task_struct *p, int queued);
1142         void (*task_fork) (struct task_struct *p);
1143         void (*task_dead) (struct task_struct *p);
1145         void (*switched_from) (struct rq *this_rq, struct task_struct *task);
1146         void (*switched_to) (struct rq *this_rq, struct task_struct *task);
1147         void (*prio_changed) (struct rq *this_rq, struct task_struct *task,
1148                              int oldprio);
1150         unsigned int (*get_rr_interval) (struct rq *rq,
1151                                          struct task_struct *task);
1153 #ifdef CONFIG_FAIR_GROUP_SCHED
1154         void (*task_move_group) (struct task_struct *p, int on_rq);
1155 #endif
1156 };

沒有留言:

張貼留言