-여러 개의 태스크들 중에서 다음번 수행시킬 태스크를 선택하여 CPU라는 자원을 할당하는 과정을 스케줄링 이라고 함

-  리눅스의 태스크는 실시간 태스크와 일반 태스크로 나뉘며 각각 스케줄링 알고리즘이 구현

* 리눅스가 총 140단계의 우선순위 제공

실시간 태스크 (0~99)

일반 태스크 (100~139)

 

(1) 런 큐와 태스크

- 운영체제는 스케줄링 작업 수행을 위해, 수행 가능한 상태의 태스크를 자료구조를 통해 관리

- 이 자료구조를 런 큐(Runqueue)라 함

- 운영체제의 구현에 따라 런큐는 한개 혹은 여러개 존재 가능

- 자료구조의 모양이나 관리 방법도 달라짐

- ~/kernel/sched/sched.h 파일 내에 struct rq라는 이름으로 정의

- 부팅 이후 각 CPU별로 하나씩의 런큐를 유지

복수개의 CPU를 가진 시스템에서 리눅스의 런큐 자료구조와 태스크의 관계

 

- 새로 생성된 태스크는 부모 태스크가 존재하던 런 큐로 삽입 (더 높은 캐시 친화력 (cache affinity)를 얻을 수 있기 때문에)

- 대기 상태에서 깨어난 태스크는 대기전에 수행되던 CPU의 런 큐로 삽입

 

* 스케줄러가 수행되면 해당 CPU의 런큐에서 다음번 수행시킬 태스크를 고를 때 고려사항

1. 어떤 태스크를 선택할 것인가

   - 일반 태스크를 위해 CFS를 사용하며 실시간 태스크를 위해서 FIFO, RR, DEADLINE 정책을 제공

2. 런 큐간의 부하가 균등하지 않은 경우 어떻게 할 것인가

   - 부하 균등 (load balancing)기법을 제공

        # load_balance() 함수 : 특정 CPU가 많은 작업을 수행하고 있느라 매우 바빠 한가한 다른 CPU에 태스크를 이주(migration) 시켜서 성능 향상

 

 

(2) 실시간 태스크 스케줄링 (FIFO, RR and DEADLINE)

  - 가장 급한 태스크를 한가한 태스크보다 먼저 수행될 수 있도록 해줌 -> 높은 반응성을 보임

  - 어떤 기준에 근거하여 태스크를 골라내는지?

         -> task_struct 구조체는 policy, prio, rt_priority 등의 필드가 존재

  - 실시간 태스크 ( SCHED_FIFO, SCHED_RR, SCHED_DEADLINE)

  - 일반 태스크 (SCHED_NORMAL) , 이와 더불어 중요하지 않은 일을 수행하는 태스크가 CPU 점유를 막기 위해 SCHED_IDLE 정책, SCHED_BATCH정책이 존재

     * 리눅스 실시간 태스크란?  sched_setscheduler()등의 함수를 통해 태스크의 스케줄링 정책을 위 세가지 중 하나로 바꾸게 되면 실시간 태스크가 되는 것

  - 우선순위 설정을 위해 task_struct 구조체의 rt_priority 필드를 사용

      -> 0~99까지의 우선순위를 가질 수 있으며 태스크가 수행을 종료하거나 스스로 중지하거나 혹은 자신의 타임 슬라이스를 다쓸때까지 CPU를 사용

           => 즉 RR인 경우 동일 우선순위를 가지는 태스크가 복수개인 경우 타임 슬라이스 기반으로 스케줄링

 

  -

+ Recent posts