Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

38111
637
415414


[리눅스커널][스케줄링] ftrace로 컨택스트 스위칭 동작 확인 10. 프로세스 스케줄링

ftrace로 컨택스트 스위칭 동작 확인

이전 절에 봤던 ftrace 로그를 살펴보면서 스케줄링 동작을 살펴봅시다.
lxpanel-718   [002] d...  7831.739824: sched_switch: prev_comm=lxpanel prev_pid=718 prev_prio=120 prev_state=D ==> next_comm=Xorg next_pid=552 next_prio=120

먼저 메시지 가장 왼쪽 부분을 보겠습니다. CPU2에서 lxpanel(pid-718) 프로세스가 실행 중입니다.

휴면에 진입할 프로세스는 lxpanel(pid=718) 이고 다음에 실행될 프로세스는 Xorg(pid=552)입니다.
 - struct task_struct *prev: prev_comm=lxpanel prev_pid=718 prev_prio=120
 - struct task_struct *next: ext_comm=Xorg next_pid=552 next_prio=120


여기서 한 가지 의문점이 생깁니다.
Q: 현재 스케줄링 관련 코드는 어느 프로세스가 실행하고 있을까요?

스케줄링 코드는 컨택스트 스위칭되는 prev 프로세스가 실행합니다. 즉, schedule() 함수에서 prev로 지정된 프로세스입니다. ftrace 로그에서도 같은 정보를 확인할 수 있습니다.
lxpanel-718   [002] d...  7831.739824: sched_switch: prev_comm=lxpanel prev_pid=718 prev_prio=120 prev_state=D ==> next_comm=Xorg next_pid=552 next_prio=120

lxpanel-718 프로세스가 스케줄링 코드를 실행하는데 이 프로세스는 스케줄링으로 CPU를 비우게 됩니다.

스케줄링을 실행하는 주체가 프로세스입니다. 프로세스는 자신에게 주어진 특정 미션을 수행하려고 생성됐습니다. 예를 들어 워커 스레드는 스레드 핸들러인 worker_thread() 함수에서 워크를 실행 및 관리합니다. 그런데 프로세스는 자신의 미션과 함께 추가로 스케줄링 코드를 실행합니다. 프로세스 입장에서 스케줄링 코드는 오버해드입니다. 스케줄링 빈도가 높으면 전체 프로세스 실행에 부하를 줄 수 밖에 없습니다.

소프트웨어 세상에서 가장 어려운 과제가 최적화입니다. 하지만 트레이드 오프없이 스케줄링을 적게 실행하면서 프로세스를 최대한 골고루 실행하는 것이 스케줄러의 역할이자 목표입니다.

컨택스트 스위칭 동작을 휴면에 진입할 프로세스와 다음에 실행할 프로세스 입장에서 생각해봅시다.

먼저 휴면에 진입할 프로세스는 실행 정보를 어딘가에 저장해야 합니다. 다음에 스케줄러가 자신을 깨우면 다시 실행할 정보입니다. 이 실행 정보는 struct thread_info 구조체 cpu_context 필드에 저장합니다. 여기서 실행 정보는 레지스터 세트를 의미합니다.

이번에 컨택스트 스위칭 동작을 휴면에 진입할 프로세스와 다음에 실행할 프로세스 입장에서 생각해봅시다.

먼저 휴면에 진입할 prev 프로세스 관점으로 생각해 봅시다.
휴면에 진입할 prev 프로세스는 실행 정보를 어딘가에 저장해야 합니다. 다음에 스케줄러가 자신을 깨우면 다시 실행할 레지스터 세트입니다. 이 레지스터 세트는 struct thread_info 구조체 cpu_context 필드에 저장합니다. 

위에서 언급한 ftrace를 예로 들겠습니다. 
struct task_struct *prev: prev_comm=lxpanel prev_pid=718 prev_prio=120

lxpanel 프로세스는 자신의 current_thread_info()->cpu_context 필드에 현재 실행 중인 레지스터 세트를 저장해야 합니다.

이번에는 다음에 실행할 next 프로세스 관점으로 생각해 봅시다.
다시 실행할 프로세스는 이전에 자신이 실행했던 정보를 ARM 레지스터에 로딩해야 합니다. 
어디서 이전에 자신이 실행했던 정보를 로딩할까요? struct thread_info 구조체 cpu_context 필드에서 로딩합니다. 이전에 휴면에 진입할 때 저장했던 정보입니다.

위에서 언급한 ftrace를 예로 들겠습니다. 
struct task_struct *next: next_comm=Xorg next_pid=552 next_prio=120

Xorg 프로세스는 자신의 struct thread_info 구조체 cpu_context 필드에 있는 레지스터 세트를 ARM 레지스터로 로딩합니다.

* 유튜브 강의 동영상도 있으니 같이 들으시면 더 많은 걸 배울 수 있습니다. 





"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)

Reference(프로세스 스케줄링)

스케줄링 소개
프로세스 상태 관리
   어떤 함수가 프로세스 상태를 바꿀까?
스케줄러 클래스
런큐
CFS 스케줄러
   CFS 관련 세부 함수 분석  
선점 스케줄링(Preemptive Scheduling)   
프로세스는 어떻게 깨울까?
스케줄링 핵심 schedule() 함수 분석
컨택스트 스위칭
스케줄링 디버깅
   스케줄링 프로파일링
     CPU에 부하를 주는 테스트   
     CPU에 부하를 주지 않는 테스트 

# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2









핑백

덧글

댓글 입력 영역