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 그룹 스케쥴링 지연 인수가 크다는 것은 우선 순위가 낮다는 것이고, 작업에 허용된 실행 시간이 더 빨리 소진된다. 그룹 스케쥴링 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 ? ㅁ