进程调度涉及到的时间有两类:
① 真实时间:exec_start(tick, schedule更新),sum_exec_runtime,pre_sum_exec_runtime;
② 加权时间:vruntime;
关于时间的操作有二:
① 更新自己;
② 与人比较:
a. 检查抢占;
b. 选择next执行;
时间的更新在tick和schedule函数中都有,都是调用update_curr()函数,其中:
- delta_exec = (unsigned long)(now - curr->exec_start); 实际执行时间delta;
- curr->exec_start = now; (now = cpu_rq(cfs_rq)->clock)
- curr->sum_exec_runtime += delta_exec; 更新总运行时间
- delta_exec_weighted = calc_delta_fair(delta_exec, curr);
- 将运行时间加权,优先级越高,计算出来的已执行时间越少
- curr->vruntime += delta_exec_weighted; 更新vruntime,vruntime是加权时间;
与人比较中的检查抢占(check_preempt_tick),有三个步骤:
① 计算理想运行时间(ideal_runtime):
a. 计算所有进程(nr_running)总运行时间;
b. 按se.load占cfs_rq->load的比重,计算该进程应当运行的时间,即理想运行时间;
其中se.load即是nice值,故优先级越高,计算出来的可执行时间越多;
② 如果该进程执行时间超过ideal_runtime,则执行抢占;
③ 如果该进程执行时间比执行时间最少的进程的多出ideal_runtime,则执行抢占;
进程的优先级是执行时间加权时的权重:
① 优先级越高,计算出来的已执行时间越少;(delta_exec_weighted)
② 优先级越高,计算出来的可执行时间越多;(ideal_runtime)
阅读(2929) | 评论(0) | 转发(0) |