cfs排程:
新程序建立會呼叫到do_fork
-->wake_up_new_task
-->activate_task(rq, p, 0);
-->enqueue_task(rq, p, flags); // 入就緒佇列
-->p->sched_class->enqueue_task(rq, p, flags);
-->check_preempt_curr(rq, p, wf_fork); // 檢查是否可搶占當前程序
對於cfs排程:會呼叫到fair_sched_class.enqueue_task = enqueue_task_fair
staticvoid
enqueue_task_fair(
struct rq *rq, struct task_struct *p, int
flags)
for_each_sched_entity(se)
hrtick_update(rq);
}
staticvoid
enqueue_entity(
struct cfs_rq *cfs_rq, struct sched_entity *se, int
flags)
update_stats_enqueue(cfs_rq, se);
check_spread(cfs_rq, se);
if (se != cfs_rq->curr)
__enqueue_entity(cfs_rq, se); // 將排程實體加入紅黑樹
se->on_rq = 1
;
if (cfs_rq->nr_running == 1
) list_add_leaf_cfs_rq(cfs_rq);
}
staticvoid __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
else
}/** maintain a cache of leftmost tree entries (it is frequently
* used):
*/if
(leftmost)
cfs_rq->rb_leftmost = &se->run_node;
rb_link_node(&se->run_node, parent, link);
rb_insert_color(
&se->run_node, &cfs_rq->
tasks_timeline);
}
對於實時程序:
enqueue_task_rt(struct rq *rq, struct task_struct *p, intflags)
staticvoid enqueue_rt_entity(struct sched_rt_entity *rt_se, bool
head)
check_preempt_curr(rq, p, wf_fork):呼叫排程類裡面的check_preempt_curr函式
實時程序:
1、優先順序比當前程序高:搶占-->schedule()
2、優先順序與當前程序相同:是否有其他cpu可以遷移,遷移
3、同一cpu核下同優先順序未搶占,下一次tick週期檢查是否搶占
非實時程序:
linux程序排程
排程 從就緒的程序選出最適合的乙個來執行。知識點 1 排程策略 2 排程時機 3 排程步驟 排程策略 sched normal sched other 普通的分時程序 sched fifo 先入先出的實時程序 sched rr 時間片輪轉的實時程序 sched batch 批處理程序 sched i...
linux程序排程
搶占就是程序排程,使用者程序搶占發生在以下情況 1 從系統呼叫返回使用者空間的時候 2 從中斷處理程式返回使用者空間時。在時鐘中斷中會呼叫scheduler tick 函式,該函式在程序時間片用完的時候會設定need resched標誌,當從時鐘中斷或者其他中斷返回後檢查need resched,核...
linux 程序排程
linux程序優先順序 1.nice值 20 19 預設0 nice值越大,程序優先順序越低 2.實時優先順序 0 99 實時優先順序越高,程序優先順序越高 任何實時程序的優先順序都高於普通的程序,也就是說實時優先順序和nice優先順序處於互補相交的兩個範疇 linux預設的程序排程模型是時間迴圈共...