□ 런 큐와 스케줄링

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

 

 리눅스의 태스크는 실시간 태스크0~99단계(숫자가 높을수록 우선순위가 높음), 일반 태스크100~139까지 사용하며,

 

 실시간 태스크는 항상 일반 태스크 보다 우선하여 실행된다.

 

 

○ 런 큐와 태스크

 - 리눅스에선 스케줄링 작업을위해 런 큐(Runqueue) 자료구조를 통해 관리한다.

 

스케줄러가 수행되면 해당 CPU의 런 큐에서 다음번 수행시킬 태스크를 골라낸다.

 

어떤 태스크를 선택할지는 일반 태스크를 위해 CFS(Completely Fair Scheduler)를 사용하며,

 

실시간 태스크를 위해서는 FIFO, RR, DEADLINE 정책을 제공한다.

 

 

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

 

 - 리눅스의 실시간 태스크란 SCHED_FIFO, SCHED_RR, SCHED_DEADLINE 정책을 사용하는 태스크를 의미한다.

 

즉, 실시간 태스크를 생성하는 별도의 함수가 존재하는 것이 아니라 sched_setscheduler() 등의 함수를 통해

 

태스크의 스케줄링 정책을 위 세 가지 중 하나로 바꾸게 되면 실시간 태스크가 되는 것이다.

 

실시간 태스크는 우선순위 설정을 위해 task_struct 구조체의 rt_priority 필드를 사용한다. rt_prior-ity는

 

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

 

다 쓸 때까지(이 경우 SCHED_RR 정책만 해당) CPU를 사용한다. 즉, RR인 경우 동일 우선순위를 가지는

 

태스크가 복수개인 경우 타임 슬라이스 기반으로 스케줄링 된다. 만약, 동일 우선순위를 가지는 RR태스크가 없는 경우라면

 

FIFO와 동일하게 동작된다. 또한 실시간 정책을 사용하는 태스크는 고정 우선순위를 가지게 된다.

 

 

○ 일반 스케줄링 (CFS)

 

 -  리눅스가 일반 태스크를 위해 사용하고 있는 스케줄링 기법은 CFS(Completely Fair Schedluer)라 불린다.

이 스케줄러는 기법의 이름이 의미하듯 완벽하게 공평한 스케줄링을 추구한다.

만약, A,B 두 개의 태스크가 수행  중이라면, A와 B의 CPU 사용시간이 항상 1:1로 같아야 하는 것이다.

 

그러나, 두 태스크가 번갈아 가며 수행되므로 임의의 시점에 두 태스크의 CPU 사용 시간이 항상 1:1로 같을 수 없다.

따라서 CFS는 정해진 '시간 단위'로 봤을때 시스템에 존재하는 태스크들에게 공평한 CPU 시간을 할당하는 것을

목표로 한다.

 

만약, 1초를 '시간 단위'로 한다면, 0.5초 동안 A 태스크를 수행시키고, 그런 뒤 0.5초간 B 태스크를 수행시킴으로써 1초가 지난 이후

A와 B의 CPU 사용시간이 1:1이 되도록 하는 것이다.

'Linux > Kernels' 카테고리의 다른 글

메모리(Memory)관리-(1)  (0) 2016.09.06
태스크(task)관리-(5)  (0) 2016.09.02
태스크(task)관리-(4)  (0) 2016.09.02
태스크(task)관리-(3)  (0) 2016.09.01
리눅스 커널  (0) 2016.08.31
태스크(task)관리-(2)  (0) 2016.08.30

+ Recent posts