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

v6.6 / kernel/sched/fair.c

Linux v6.6의 fair 스케줄러에도 EEVDF가 들어 있습니다. 가장 작은 vruntime만 고른다는 과거 CFS 설명으로 끝내면 실제 선택 기준을 놓칩니다. 이 버전의 update_deadline은 요청 소진 뒤 다음 가상 마감 시각을 만들고, 경쟁자가 있으면 함수 안에서 재스케줄을 요청합니다.

## update_deadline

```c

static void update_deadline(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
	if ((s64)(se->vruntime - se->deadline) < 0)
		return;

	/*
	 * 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.
	 */
	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);

	/*
	 * The task has consumed its request, reschedule.
	 */
	if (cfs_rq->nr_running > 1) {
		resched_curr(rq_of(cfs_rq));
		clear_buddies(cfs_rq, se);
	}
}

```

### 1019행

```c

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

```

Linux v6.6의 EEVDF 요청 마감 시각 갱신 함수입니다. 반환형은 void이며 조건에 따라 내부에서 재스케줄 요청도 처리합니다.

### 1021행

```c

	if ((s64)(se->vruntime - se->deadline) < 0)

```

vruntime과 deadline의 차이를 signed 64비트로 해석하여 현재 가상 실행 시간이 아직 마감 전인지 판단합니다. 실제 벽시계 비교가 아닙니다.

### 1022행

```c

		return;

```

요청이 남았다면 아무 값도 반환하지 않고 함수를 끝냅니다. 이 버전에는 false 반환이 없습니다.

### 1029행

```c

	se->slice = sysctl_sched_base_slice;

```

다음 요청 길이를 기본 slice 값으로 설정합니다. 이 버전의 이 함수에는 custom_slice 조건 분기가 없습니다.

### 1034행

```c

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

```

slice를 entity 가중치에 따른 가상 시간으로 바꾼 뒤 현재 vruntime에 더하여 새 deadline을 만듭니다.

### 1039행

```c

	if (cfs_rq->nr_running > 1) {

```

이 fair 실행 큐에 실행 가능한 entity가 둘 이상인지 확인합니다. 혼자라면 불필요한 경쟁자 재선택 요청을 생략합니다.

### 1040행

```c

		resched_curr(rq_of(cfs_rq));

```

해당 CPU runqueue에 재스케줄이 필요함을 요청합니다. 이 호출 자체가 레지스터를 교체하는 context switch는 아닙니다.

### 1041행

```c

		clear_buddies(cfs_rq, se);

```

소진한 entity에 대한 buddy 선택 힌트를 정리하여 다음 선택 판단에 오래된 힌트가 남지 않게 합니다.

