간단한 스케줄러
- 스케줄러는 지금 실행중인 태스크 다음에 실행할 태스크가 무엇인지 골라주는 역할을 수행한다
- 우선 가장 간단하게 라운드 로빈 방식으로 구현해보자
- i번째 task 다음으로 i+1번째 task를 실행
# task.c
static uint32_t sCurrent_tcb_index;
static KernelTcb_t* Scheduler_round_robin_algorithm(void)
{
sCurrent_tcb_index++;
sCurrent_tcb_index %= sAllocated_tcb_index;
return &sTask_list[sCurrent_tcb_index];
}
- 이 알고리즘을 이후에 컨텍스트 스위칭에 적용하면 된다
[참고] 스케줄링 알고리즘
- 선점형(preemptive)
- 실행 중인 태스크가 있어도, 더 높은 순위의 태스크가 도착하면 현재 실행중인 태스크를 중단하고 CPU에 새로운 태스크를 할당
- 응답성이 높은 대신, 컨텍스트 스위칭에 의한 오버헤드가 비교적 큼
- 비선점형(non-preemptive)
- 한번 할당받은 CPU는 다른 태스크가 도착해도 작업이 끝나거나 I/O 요청 등으로 스스로 CPU를 반납할 때 까지 계속 실행
- 긴작업이 먼저 실행되면 응답성이 낮아짐, 컨텍스트 스위칭에 의한 오버헤드 비교적 적음
| 알고리즘 | preemptive/non-preemptive | 설명 |
|---|
| FCFS | non-preemptive | 태스크가 준비 큐에 도착한 순서대로 CPU 할당 |
| SJF | non-preemptive | 실행 시간이 짧은 프로세스부터 실행, 평균 대기시간이 가장 짧은 알고리즘이지만 프로세스 실행 시간을 미리 알기 힘드므로 실사용 힘듬 |
| Round Robin | preemptive | 각 프로세스에 동일한 시간 할당량을 주고 순서대로 CPU를 할당 |
| CFS | preemptive | 모든 프로세스에 가능한 공정하게 CPU 시간을 분배, CPU를 사용한 시간을 vruntime으로 누적해 관리하고 vruntime이 가장 작은 프로세스가 다음에 실행, 프로세스 우선순위(nice)에 따라 vruntime 증가 속도가 달라짐 |