cfs调度中进程最小运行时间是0.75ms

在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来改变

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值