LINUX CFS 调度tick逻辑

  1. 计算当前task在这个tick周期实际用时delta_exetime, 更新当前task的vruntime;
  2. 根据权重,重新计算调度period,计算当前task的应得时间片slice(idle_runtime,实际时间片);
  3. 若delta_exetime大于slice,则切下一个任务;否则继续检查4;
  4. 若delta_exetime小于最小调度粒度:0.75ms(sysctl_sched_min_granularity),则不切下一个任务;否则继续检查5;
  5. 取出run queue的rq_se(__pick_first_entity),比较curr_se和rq_se的vruntime,若curr_se->vruntime小于rq_se->vruntime,则不切下一个任务,否则继续检查6;
  6. 若curr_se->vruntime - rq_se->vruntime 大于 slice, 则切入下一个任务;

为啥第6点直接用 “虚拟时间差值” 与 “实际时间片” 作比较???是否会有误差?

参考:http://www.wowotech.net/process_management/452.html

内核代码:fair.c -> check_preempt_tick()

上一篇:一键解决端口号占用 Address/Port already in use


下一篇:centos MySQL无法启动 [Errno 98] Address already in use