Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


[리눅스커널][스케줄링] 컨택스트 스위칭이란 무엇인가 10. Process Scheduling

컨택스트 스위칭이란 무엇인가
컨택스트 스위칭 세부 동작을 알기 위해서 context_switch() 함수를 분석할 필요가 있습니다. context_switch() 함수를 분석하기 전 컨택스트 스위칭의 개념을 소개하겠습니다.
 
먼저 컨택스트 스위칭이란 용어에 대해서 살펴봅시다. 컨택스트 스위치란 용어는 컨택스트 + 스위치란 단어의 합성어입니다. 컨택스트를 바꾼다는 의미입니다. 여기서 컨택스란 용어는 무슨 뜻일까요? 컨택스트는 프로세스가 실행 중인 그 자체를 의미합니다. 이 표현은 추상적이라 이해하기 어렵습니다. 프로세스 실행 그 자체를 어떻게 표현할까요?  그것은 레지스터 세트입니다. CPU 레지스터 세트가 프로세스 실행 자체를 표현하기 때문입니다.

다음 테이블을 보면서 컨택스트 스위칭에 대한 개념을 알아봅시다.
 

컨택스트는 먼저 프로세스가 실행 중인 그 자체를 뜻합니다. 프로세스는 CPU에서 실행합니다. 프로세스가 CPU에서 실행할 때는 현재 실행 중인 함수에 대한 세부 정보가 CPU 레지스터 세트에 채워집니다. 즉, 프로세스 실행 세부 정보를 담고 있는 레지스터 세트 자체가 컨택스트인 것입니다.

컨택스트 스위칭은 CPU에서 실행 중인 프로세스를 비우고 새로운 프로세스를 CPU에 채우는 동작입니다. 우선순위에 따라 다음에 실행할 프로세스를 선택하는 일은 스케줄러가 합니다.   

다음 컨택스트 스위칭 세부 동작을 설명할 때 prev와 next 프로세스로 명시한 부분이 있습니다.
 
 
위 그림과 같이 prev는 현재 CPU에서 실행 중인 프로세스를 의미하며 컨택스트 스위칭으로 CPU를 비울 프로세스입니다. next는 스케줄러가 다음에 실행할 프로세스로 선택한 프로세스입니다. 컨택스트 스위칭 후 CPU에서 실행할 프로세스입니다.

prev 프로세스는 CPU를 비울 것이니 자신의 실행 정보가 채워져 있는 레지스터 세트를 어딘가에 저장해야 합니다. 그래야 다음에 깨어나서 이전 실행 정보를 다시 로딩해야 다시 실행할 수 있을 것입니다.

next 프로세스 입장은 조금 다릅니다. 기존에 실행했던 정보를 다시 CPU 레지스터에 채워줘야 합니다. 

프로세스가 실행했던 레지스터 세트를 어딘가에 저장해야 합니다. 그래야 다시 실행할 때 레지스터 세트를 로딩할 수 있습니다. 다음 공간과 자료구조로 이 정보를 저장합니다.
 - 공간: 프로세스 스택 최상단 주소
 - 자료구조: struct thread_info cpu_context

prev와 next로 명시했지만 prev는 next 프로세스가 되고 next는 prev 프로세스가 됩니다.  
CPU를 비우는 prev 프로세스는 시간이 지나 스케줄러가 next 프로세스로 선택할 수 있습니다. next 프로세스는 CPU를 점유하면서 실행 중이다가 선점되면 prev 프로세스가 됩니다.

다음 소절에서는 이어서 컨택스트 스위칭 자료구조에 대해 소개합니다.


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

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

Reference(프로세스 스케줄링)

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

핑백

덧글

댓글 입력 영역