进程调度杂项汇总
1. sched class与sched policy的对应关系
完全公平调度:SCHED_NORMAL SCHED_BATCH
实时进程调度:SCHED_FIFO SCHED_RR
空闲调度:SCHED_IDLE
Deadline调度: SCHED_DEADLINE
//kernel/sched/sched.h static inline int idle_policy(int policy) { return policy == SCHED_IDLE; } static inline int fair_policy(int policy) { return policy == SCHED_NORMAL || policy == SCHED_BATCH; } static inline int rt_policy(int policy) { return policy == SCHED_FIFO || policy == SCHED_RR; } static inline int dl_policy(int policy) { return policy == SCHED_DEADLINE; }
5.10 内核上,SCHED_NORMAL 和 SCHED_BATCH 几乎没有区别,整个内核的检索,只有 yield_task_fair() 中若是 SCHED_BATCH 类型的就不更新rq时钟,也不调用 update_curr()。
5.4 内核上,检索 SCHED_IDLE 发现其也没有什么用。
应该起作用的主要是 p->sched_class !
2. 5.4内核上SCHED_BATCH 与 SCHED_NORMAL 的区别
(1) CPU在热插拔的时候,只有current是SCHED_NORMAL策略才允许切为RT线程
cpu_up //kernel/cpu.c 传参 (cpu, CPUHP_ONLINE) write_cpuhp_target do_cpu_up //kernel/cpu.c switch_to_rt_policy //kernel/cpu.c if (policy == SCHED_BATCH || policy == SCHED_IDLE || policy == SCHED_DEADLINE) //这些调度策略是不允许切为RT调度类的 return -EPERM; if (policy == SCHED_FIFO || policy == SCHED_RR) return 1; sched_setscheduler_nocheck(current, SCHED_FIFO, ¶m); //只剩下SCHED_NORMAL了
(2) 当任务主动放弃CPU时,若是 SCHED_BATCH 则不更新rq时钟和当前任务的时间统计(包含虚拟时间)。
fair_sched_class.yield_to_task yield_to_task_fair //fair.c fair_sched_class.yield_task //fair.c yield_task_fair //fair.c if (curr->policy != SCHED_BATCH) update_curr(cfs_rq);
3. cpu_clock(i) 获取的CPU时间,单位ns,CPU0的要比其它CPU的大100多倍。
/* while (i < CPU_NUM) { seq_printf(m, "%llu ", cpu_clock(i)); i++; } //CPUn+1 - CPUn: 1660272816947540 18864659493969 18864659494281 18864659494541 18864659494802 18864659495010 18864659495219 18864659495427 18864659495635 -1641408157453570 312 260 261 208 209 208 208 */
posted on 2021-01-01 23:07 Hello-World3 阅读(167) 评论(0) 编辑 收藏 举报