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 | +struct sched_entity { |
태스크 관리를 위한 자료구조인 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)
실시간 우선순위 스케줄링을 위한 부분이라고 합니다.