linux程序排程

2022-07-27 17:36:08 字數 1792 閱讀 6531

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

static

void

enqueue_task_fair(

struct rq *rq, struct task_struct *p, int

flags)

for_each_sched_entity(se)

hrtick_update(rq);

}

static

void

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);

}

static

void __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, int

flags)

static

void 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預設的程序排程模型是時間迴圈共...