리눅스 CFS 스케쥴러

Posted by Ho95

CFS에 대해


CFS(Completely Fair Scheduler)를 위키 백과에서 찾아보면 아래와 같이 나옵니다.

1
리눅스 커널의 2.6.23 (2007년 10월) 릴리스에 병합된 프로세스 스케줄러이며 현재의 기본 스케줄러이다.프로세스 실행을 위해 CPU 자원 할당을 관리하며 상호작용 성능을 극대화하면서도 전반적인 CPU 이용을 극대화하는 것을 목표로 한다.

위와 같이 리눅스 커널 2.6.23버전부터 도입된 스케줄러로써

이전 리눅스 스케줄러인 O(1) 스케줄러를 대체합니다.

O(1) 스케줄러를 간단하게 말해보면 OS(Operating System)에서 많은 프로세스가

실행 되고 있어도 상수 시간안에 스케줄링 할 수 있는 스케줄러입니다.

하지만 실제 프로세스 수가 많을때 성능차이가 현격하게 납니다.

CFS는 런큐를 제거 하였고 RB-tree(레드블랙트리) 구조를 사용한다고 합니다.

CFS의 특징

1.jiffies값을 사용하지 않는다. (커널 타이머를 실행하는 단위)

2.더이상 HZ 값에 의존하지 않는다. (HZ: 1초당 커널 타이머가 처리하는 횟수)

3.나노초 단위 정밀도

4.통계적 기법, 휴리스틱 기법에 의존X

CFS 끄적이기

(사실… 봐도 잘 모르겠습니다.)

include/linux/sched.h에 있습니다. sched_class라는 구조체 코드 참고

내용이 대부분 함수 포인터로 선언되어 있습니다.

스케줄링 관리는 sched_entity 구조체에서 관리한다고 합니다. 내용으로는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 +struct sched_entity {
+ long wait_runtime;
+ unsigned long delta_fair_run;
+ unsigned long delta_fair_sleep;
+ unsigned long delta_exec;
+ s64 fair_key;
+ struct load_weight load; /* for load-balancing */
+ struct rb_node run_node;
+ unsigned int on_rq;
+
+ u64 wait_start_fair;
+ u64 wait_start;
+ u64 exec_start;
+ u64 sleep_start;
+ u64 sleep_start_fair;
+ u64 block_start;
+ u64 sleep_max;
+ u64 block_max;
+ u64 exec_max;
+ u64 wait_max;
+ u64 last_ran;
+
+ u64 sum_exec_runtime;
+ s64 sum_wait_runtime;
+ s64 sum_sleep_runtime;
+ unsigned long wait_runtime_overruns;
+ unsigned long wait_runtime_underruns;
+#ifdef CONFIG_FAIR_GROUP_SCHED
+ struct sched_entity *parent;
+ /* rq on which this entity is (to be) queued: */
+ struct cfs_rq *cfs_rq;
+ /* rq "owned" by this entity/group: */
+ struct cfs_rq *my_q;
+#endif
+};

태스크 관리를 위한 자료구조인 task_struct에도 실시간 스케줄링을 위한 부분을 따로 나눴다고 합니다. CFS는 cfs_rq라는 구조체를 사용하고 실시간 스케줄링은 rt_rq 구조체를 사용합니다. 각각 구현은 CFS가 sched_fair.c / 실시간 스케줄러는 sched_rt.c에 구현되어 있습니다.

task_struct에 sched_class 멤버중 struct sched_class *sched_class 이 있는데, 이 부분으로

2개 이상의 cpu에게 서로 다른 종류의 스케줄링을 할 수 있다고 합니다…

(모든 내용 출처:https://enginius.tistory.com/97)

실시간 우선순위 스케줄링을 위한 부분이라고 합니다.