12
CFS

CFS

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: CFS

CFS

Page 2: CFS

What is CFS ?

• I Have no Idea..

Page 3: CFS

What is CFS ?

• 프로세서 시간을 제공할 때 밸런스를 유지• Virtual runtime– VR 이 작을 수록 ( 프로세서에 액세스할 수 있도록

허용된 시간이 작을 수록 ) 더 많은 프로세서 시간이 필요하다 ?

• 대기자 공평성 – 대기한 만큼 보상• RB Tree 를 이용 .– 1. 스스로 밸런스 조절 - 모든 경로는 다른 경로보다 두

배 이상 길어지지 않는다 .– 2. O(log n)

Page 4: CFS

What is CFS ?

• RB tree • VR 이 낮은 ( 프로세서에 대한 요구가 높은 ) 차례대로 트리의 왼쪽에

저장 . • LMN(Left most node) 를 선택• 작업

• 해당 실행 시간을 가상 런터임에 추가하여 CPU 사용 시간을 계산한 다음 실행 가능한 경우 트리로 다시 삽입한다 (?)

Page 5: CFS

What is CFS ?

• Linux 내의 모든 작업은 task_struct 라는 작업 구조체로 표시 . –작업의 현재 상태 , 해당 스택 , 프로세스 플래그 ,

우선 순위 등을 포함한다 .• ./linux/include/linux/sched.h

–하지만 여기에는 CFS 관련 필드가 없다 . – sched_entity 라는 새 구조체가 작성

Page 6: CFS

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 를 포함하는 구조체이다 .

Page 7: CFS

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 참조를 식별한다 . 마지막으로 일반 스케줄러가 이 작업에 프로세서를 제공한다 .

Page 8: CFS

What is CFS ?• 우선 순위와 CFS

– CFS 에서는 우선 순위를 직접 사용하지 않는 대신 작업에 허용된 실행 시간에 대한 지연 인수가 있다 . 우선 순위가 낮을 수록 지연 인수가 높고 , 우선 순위가 높을수록 지연 인수가 낮다 . • 지연 인수가 크다는 것은 우선 순위가 낮다는 것이고 , 작업에 허용된 실행 시간이 더

빨리 소진된다 .

• 그룹 스케쥴링– 2.6.24 에서 도입된 개념– 스케줄링 공평성을 높일 수 있는 또 다른 방법으로 , CFS 에서는 모든 작업을

균등하게 처리하는 대신 이 동작을 처리하기 위해 그룹을 사용한다 . – 작업이 발생하는 서버 프로세스는 계층 구조로 되어 있는 전체 그룹에 대한

가상 런타임을 공유하는 반면 단일 작업은 고유한 독립 가상 런타입을 관리한다 . • 이 방법에서는 단일 작업이 그룹과 거의 비슷한 스케줄링 시간을 받는다 . /proc

인터페이스는 프로세스 계층 구조를 관리하는데 사용된다 .

Page 9: CFS

What is CFS ?

• 스케쥴링 클리스 및 도메인– CFS 에서는 스케줄링 클래스라는 개념이 도입– 각 작업은 스케줄링 클래스에 속하며 , 이 클래스에 따라

작업의 스케줄링 방법이 결정된다 . – sched_class 를 통해 스케줄러의 동작을 정의하는 공통

함수 세트를 정의한다 . • 각 스케줄러는 스케줄링한 작업을 추가하고 , 실행할 다음 작업을

가져오고 , 스케줄러에게 양도하는 등의 작업을 수행할 수 있는 방법을 제공한다 .

– 이런 클래스는 single linked list 를 통해 다른 스케줄러와 연결되어있으므로 이 연결을 따라 클래스를 반복할 수 있다 . ( 지정된 프로세서의 비활성화를 활성화 하기 위해 )

Page 10: CFS

What is CFS ?

• enqueue_task 및 dequeue_task 함수는 특정 스케줄링 구조체에 작업을 추가하거나 제거하는 단순한 작업을 수행한다 .

• pick_next_task 함수는 스케줄링 클래스의 특정 정책에 따라 실행할 다음 작업을 선택한다 .

Page 11: CFS

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 에서 이러한 관계를 볼 수 있다 .

• 스케줄링 클래스는 스케줄링 도메인의 추가로 그 기능이 확정되었다 . 이러한 도메인을 사용하면 로드 밸런싱 및 분리를 위해 하나 이상의 프로세서를 그룹화할 수 있다 . ??

Page 12: CFS

What is CFS ?

• ㅁ