120 likes | 279 Views
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
E N D
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( structrq *rq, structtask_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 ? • ㅁ