본문 바로가기

Enginius/Linux

Real-Time class의 load_balancing


2.6.2x에서는 rt 클래스와 fair 클래스의 lb가 별 차이가 없었다. 

두 가지 모두 load_balance_fair혹은 load_balance_rt함수를 호출해서 lb를 수행했다. 

하지만 2.6.3x로 넘어오면서 load_balance_rt 함수는 빈 함수가 되었고, push와 pull이라는 새로운 함수가 생겼다. 

이 함수들은 schedule()함수 내부의 pre_schedule과 post_schedule에서 호출이 된다. 이 두 함수의 사이에서는 실제로 context swti tching이 일어난다. 

pull_rt_task is called inside pre_schedule_rt(), switched_from_rt(), prio_changed_rt()
push_rt_task is called inside switched_to_rt(), push_rt_tasks()
push_rt_tasks is called inside post_schedule_rt(), task_wake_up_rt() <- 작업이 일어났는데 런큐가 작동하지 않을 때 push 함

switched_from(), switched_to(), prio_changed() is called inside check_class_changed()
check_class_changed is called inside rt_mutex_setprio(), __sched_setscheduler() <- 즉 스케쥴러의 policy를 바꾸거나 task의 priority를 바꿀 때 호출된다.


(+)switched_to => switched_to_rt <- 작업이 Normal type에서 RT type으로 바뀔 때 호출된다. reschedule를 여부를 설정하고 런큐가 넘치면 다른 런큐에 보낸다(push).
(+)switched_from => switched_from_rt <- 작업이 RT type에서 normal type으로 바뀔 때 호출된다. 큐에 있는 마지막 작업이면 pull을 통해 다른 작업을 불러온다.
(+)prio_changed => prio_changed_rt, prio_changed_fair       <- 작업의 priority가 같은 type 내에서 바뀔 때 호출
(+)pre_schedule => pre_schedule_rt
(+)post_schedule => post_schedule_rt


pull_rt_task

1. 루트 도메인이(this rq뿐 아니라 모든 rq들을 포함한 개념으로 추측) 과열돼있는지 확인
2. 과열돼있다면 모든 CPU를 돌아다니면서 
1) 알맞은 src_rq를 찾음
src_rq의 조건 : 2개 이상의 작업을 가지고, 
현재 실행중인 작업 다음으로 우선권이 높은 대기 작업이
목적지(this_cpu)에서 현재 실행 중인 작업보다 우선권이 높아야함.
(실행 대기 작업이면서 현재 실행 중인 작업보다 우선권이 높은 경우엔 가려내서 해당 큐에서 스케쥴되어 실행되게 함)
2) src_rq에서 작업을 제거함
3) 작업의 cpu 해당 변수를 this_cpu로 설정함
4) 작업을 this_cpu의 런큐로 옮김


push_rt_task

1. 해당 런큐가 과열돼있는지 확인
2. 과열돼있다면 push할 수있는 적절한 next_task를 찾음
3. 적절한 next_task와 lowest_rq 쌍을 찾을 때까지 루프를 돔
1) next_task가 현재 실행중인 작업보다 우선권이 높다면 해당 큐에서 리스케쥴함
2) 1)이 아니라면 테스크를 사용할 것이라고 표시함(get_task_struct)
3) next_task와 affinity가 잘 맞으면서 현재 실행중인 작업의 우선권이 낮은 큐를 찾아봄
4) 큐가 없다면 새롭게 push할 수 있는 작업을 찾아봄
4-1) 새롭게 찾은 작업이 없거나 있더라도 기존에 찾았던 next_task와 같다면 함수를 빠져나옴
5) 기존에 next_task를 사용 안 한다고 표시하고(put_task_struct)
  새롭게 찾은 task를 next_task로 둠
4. 적절한 큐(lowest_rq)도 찾았다면 next_task를 원래 큐에서 제거함
5. next_task의 cpu 해당 변수를 lowest_rq로 설정함
6. next_task를 lowest_rq로 옮김 

'Enginius > Linux' 카테고리의 다른 글

Linux Kernel Compile !  (0) 2011.09.03
DWRR_patch guideline -SJ  (0) 2011.09.03
"Buddy" in Linux  (0) 2011.08.22
"all_pinned logic" in Linux  (0) 2011.08.19
linux-2.6.24에서 linux-2.6.32로 porting하기 (dec_load(), )  (0) 2011.08.18