CFS Scheduler

Download Report

Transcript CFS Scheduler

CFS
What is CFS ?
• I Have no Idea..
What is CFS ?
• 프로세서 시간을 제공할 때 밸런스를 유지
• Virtual runtime
– VR이 작을 수록(프로세서에 액세스할 수 있도록
허용된 시간이 작을 수록) 더 많은 프로세서 시간이
필요하다?
• 대기자 공평성 – 대기한 만큼 보상
• RB Tree를 이용.
– 1. 스스로 밸런스 조절- 모든 경로는 다른 경로보다
두 배 이상 길어지지 않는다.
– 2. O(log n)
What is CFS ?
• RB tree
• VR이 낮은(프로세서에 대한 요구가 높은) 차례대로 트리의 왼쪽에
저장.
• LMN(Left most node)를 선택
• 작업
• 해당 실행 시간을 가상 런터임에 추가하여 CPU 사용 시간을
계산한 다음 실행 가능한 경우 트리로 다시 삽입한다 (?)
What is CFS ?
• Linux 내의 모든 작업은 task_struct 라는
작업 구조체로 표시.
– 작업의 현재 상태, 해당 스택, 프로세스 플래그,
우선 순위 등을 포함한다.
• ./linux/include/linux/sched.h
– 하지만 여기에는 CFS관련 필드가 없다.
– sched_entity 라는 새 구조체가 작성
What is CFS ?
• sched
– 트리의 루트는 ./kernel/sched.c에
있는 cfs_rq구조체의 rb_root
요소를 통해 참조된다. Red-black
트리의 리프에는 아무 정보도
없지만 내부 노드는 실행 가능한
하나 이상의 작업을 나타낸다.
– RB 트리의 각 노드는 rb_node로
표시되며 하위 참조와 상위
노드의 색만 포함한다.
– rb_node는 sched_entity 구조체
내에 포함되며 여기에는 다양한
통계 데이터가 포함되어 있다.
– sched_entity에는 rb트리의
인덱스로 작동한 시간을
나타내는 vruntime이
포함되어있다.
– task_struct는 이 sched_entity를
포함하는 구조체이다.
What is CFS ?
• /kernel/sched.c 에는 yield()가 불리지 않는한 현재 실행
중인 작업을 선취하는 일반 schedule()함수가 있다. 현재
실행 중인 작업(선취된 작업)이 put_prev_task(스케쥴링
클래스를 통해)에 대한 호출을 통해 RB tree로 리턴된다.
스케줄링한 다음 작업을 식별할 때가 되면 schedule
함수가 pick_next_task 함수를 호출한다. 이 함수도
/kernel/sched.c 에 있는 일반 함수이지만 스케줄러
클래스를 통해 CFS 스케줄러를 호출한다.
– pick_next_task 함수는
/kernel/sched_fair.c(pick_next_task_fair()라고 함) 에 있다. 이
함수는 RB 트리에서 LMN를 선택하여 연관된 sched_entity를
리턴한다. 간단한 task_of() 호출에서 이 참조를 사용하여
리턴된 task_struct 참조를 식별한다. 마지막으로 일반
스케줄러가 이 작업에 프로세서를 제공한다.
What is CFS ?
• 우선 순위와 CFS
– CFS에서는 우선 순위를 직접 사용하지 않는 대신 작업에 허용된
실행 시간에 대한 지연 인수가 있다. 우선 순위가 낮을 수록 지연
인수가 높고, 우선 순위가 높을수록 지연 인수가 낮다.
• 지연 인수가 크다는 것은 우선 순위가 낮다는 것이고, 작업에 허용된 실행
시간이 더 빨리 소진된다.
• 그룹 스케쥴링
– 2.6.24에서 도입된 개념
– 스케줄링 공평성을 높일 수 있는 또 다른 방법으로, CFS에서는 모든
작업을 균등하게 처리하는 대신 이 동작을 처리하기 위해 그룹을
사용한다.
– 작업이 발생하는 서버 프로세스는 계층 구조로 되어 있는 전체
그룹에 대한 가상 런타임을 공유하는 반면 단일 작업은 고유한
독립 가상 런타입을 관리한다.
• 이 방법에서는 단일 작업이 그룹과 거의 비슷한 스케줄링 시간을 받는다.
/proc 인터페이스는 프로세스 계층 구조를 관리하는데 사용된다.
What is CFS ?
• 스케쥴링 클리스 및 도메인
– CFS에서는 스케줄링 클래스라는 개념이 도입
– 각 작업은 스케줄링 클래스에 속하며, 이 클래스에
따라 작업의 스케줄링 방법이 결정된다.
– sched_class 를 통해 스케줄러의 동작을 정의하는
공통 함수 세트를 정의한다.
• 각 스케줄러는 스케줄링한 작업을 추가하고, 실행할 다음
작업을 가져오고, 스케줄러에게 양도하는 등의 작업을
수행할 수 있는 방법을 제공한다.
– 이런 클래스는 single linked list를 통해 다른
스케줄러와 연결되어있으므로 이 연결을 따라
클래스를 반복할 수 있다. (지정된 프로세서의
비활성화를 활성화 하기 위해)
What is CFS ?
• enqueue_task 및 dequeue_task 함수는 특정
스케줄링 구조체에 작업을 추가하거나
제거하는 단순한 작업을 수행한다.
• pick_next_task 함수는 스케줄링 클래스의
특정 정책에 따라 실행할 다음 작업을
선택한다.
What is CFS ?
static inline void check_preempt( struct rq *rq, struct task_struct *p )
{
rq->curr->sched_class->check_preempt_curr( rq, p );
}
• 위의 함수는 새 작업을 사용하여 현재 실행 중인
작업을 ./kernel/sched.c 로부터 선취한다. (여기서 curr 은 현재
실행 중인 작업을 정의하고, rq는 CFS에 대한 RB 트리를
나타내며 p는 스케줄링할 다음 작업이다.
• 이 작업이 공평한 스케줄링 클래스를 사용하고 있다면
check_preemp_curr()이 check_preempt_wakeup()으로 해석된다.
• sched_rt.c, sched_fair.c, sched_idle.c에서 이러한 관계를 볼 수
있다.
• 스케줄링 클래스는 스케줄링 도메인의 추가로 그 기능이
확정되었다. 이러한 도메인을 사용하면 로드 밸런싱 및 분리를
위해 하나 이상의 프로세서를 그룹화할 수 있다. ??
What is CFS ?
• ㅁ