[임베디드 OS 개발 프로젝트] 9. 스케줄러

Sijin·2025년 7월 13일

간단한 스케줄러

  • 스케줄러는 지금 실행중인 태스크 다음에 실행할 태스크가 무엇인지 골라주는 역할을 수행한다
  • 우선 가장 간단하게 라운드 로빈 방식으로 구현해보자
    • 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설명
FCFSnon-preemptive태스크가 준비 큐에 도착한 순서대로 CPU 할당
SJFnon-preemptive실행 시간이 짧은 프로세스부터 실행, 평균 대기시간이 가장 짧은 알고리즘이지만 프로세스 실행 시간을 미리 알기 힘드므로 실사용 힘듬
Round Robinpreemptive각 프로세스에 동일한 시간 할당량을 주고 순서대로 CPU를 할당
CFSpreemptive모든 프로세스에 가능한 공정하게 CPU 시간을 분배, CPU를 사용한 시간을 vruntime으로 누적해 관리하고 vruntime이 가장 작은 프로세스가 다음에 실행, 프로세스 우선순위(nice)에 따라 vruntime 증가 속도가 달라짐

0개의 댓글