在sheduler_tick->task_tick_fair->entity_tick->check_preempt_tick 这个函数中会检查当前进程是否要 被调度出去,从这个函数中我们可以知道在cfg调度中一个进程最小运行时间是0.75ms 源码分析如下: static void check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) { unsigned long ideal_runtime, delta_exec; struct sched_entity *se; s64 delta; #当前进程理论运行时间 ideal_runtime = sched_slice(cfs_rq, curr); #当前进程实际运行时间 delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; #如果实际运行时间已经大于理论运行时间,则调用resched_curr 来设置TIF_NEED_RESCHED 标志位,表示 #当前进程需要被调度出去 if (delta_exec > ideal_runtime) { resched_curr(rq_of(cfs_rq)); /* * The current task ran long enough, ensure it doesn't get * re-elected due to buddy favours. */ clear_buddies(cfs_rq, curr); return; } /* * Ensure that a task that missed wakeup preemption by a * narrow margin doesn't have to wait for a full slice. * This also mitigates buddy induced latencies under load. */ #从这里知道每个进程最小运行时间是sysctl_sched_min_granularity,这个值是0.75ms,如果进程运行时间小于 #这个值则不能调度 if (delta_exec < sysctl_sched_min_granularity) return; #获得调度实体 se = __pick_first_entity(cfs_rq); #获得调度实体的实际运行时间 delta = curr->vruntime - se->vruntime; #如果时间小于零,则不用调度 if (delta < 0) return; #如果这个调度实体实际运行时间超过理论运行时间,则调用resched_curr 来设置TIF_NEED_RESCHED 标志位开始调度 if (delta > ideal_runtime) resched_curr(rq_of(cfs_rq)); } unsigned int sysctl_sched_min_granularity = 750000ULL; 进程最小运行时间默认是0.75ms,可以通过sysctl来改变
cfs调度中进程最小运行时间是0.75ms
猜你喜欢
转载自blog.csdn.net/tiantao2012/article/details/80494425
今日推荐
周排行