# 공정 스케줄링: 실행한 시간으로 다음 가상 마감 시각 갱신하기

v6.18.37 / kernel/sched/fair.c

이 버전의 fair 스케줄러를 과거의 가장 작은 vruntime만 고르는 CFS 설명으로 끝내면 실제 선택 방식과 어긋납니다. Linux 6.18.37의 이 경로는 EEVDF의 가상 마감 시각을 사용합니다. update_deadline은 현재 실행 요청을 다 썼는지 보고 다음 요청의 마감 시각을 갱신합니다.

## update_deadline

```c

static bool update_deadline(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
	if (vruntime_cmp(se->vruntime, "<", se->deadline))
		return false;

	/*
	 * For EEVDF the virtual time slope is determined by w_i (iow.
	 * nice) while the request time r_i is determined by
	 * sysctl_sched_base_slice.
	 */
	if (!se->custom_slice)
		se->slice = sysctl_sched_base_slice;

	/*
	 * EEVDF: vd_i = ve_i + r_i / w_i
	 */
	se->deadline = se->vruntime + calc_delta_fair(se->slice, se);
	avg_vruntime(cfs_rq);

	/*
	 * The task has consumed its request, reschedule.
	 */
	return true;
}

```

### 1112행

```c

static bool update_deadline(struct cfs_rq *cfs_rq, struct sched_entity *se)

```

fair 실행 큐와 그 안의 scheduling entity를 받아 요청 소진 여부를 알려 줍니다. entity는 task 또는 스케줄링 그룹을 나타낼 수 있습니다.

### 1114행

```c

	if (vruntime_cmp(se->vruntime, "<", se->deadline))

```

vruntime_cmp로 현재 vruntime이 deadline보다 작은지 봅니다. 단순 벽시계 비교가 아니라 가상 시간 비교에 맞춘 보조 표현입니다.

### 1115행

```c

		return false;

```

아직 요청 시간이 남았으므로 deadline을 바꾸지 않고 false를 반환합니다.

### 1122행

```c

	if (!se->custom_slice)

```

이 entity가 사용자 지정 slice를 사용하지 않는지 확인합니다.

### 1123행

```c

		se->slice = sysctl_sched_base_slice;

```

지정값이 없다면 현재의 기본 slice 설정을 적용합니다. 기본 설정 변경을 다음 요청에 반영할 수 있습니다.

### 1128행

```c

	se->deadline = se->vruntime + calc_delta_fair(se->slice, se);

```

요청 slice를 entity 가중치에 따른 가상 시간 증가량으로 환산한 뒤 현재 vruntime에 더합니다. 이것이 새 가상 deadline입니다.

### 1129행

```c

	avg_vruntime(cfs_rq);

```

실행 큐의 평균 가상 시간 관련 상태를 갱신합니다. entity 하나의 deadline뿐 아니라 큐의 시간 기준도 함께 다룹니다.

### 1134행

```c

	return true;

```

기존 요청을 다 사용했음을 true로 알려 재스케줄 판단으로 이어지게 합니다. 이 줄이 직접 task를 교체하는 것은 아닙니다.

