반응형

선점과 컨텍스트 전환

 

실행중인 한 작업에서 다른 작업으로 전환하는 것을 뜻하는 컨텍스트 전환 (Context-Switching)은 kernel/sched.c에 정의된 context_switch() 함수를 통해 처리     

 

context_switch() 함수

  1. <asm/mmu_context.h>에 정의된 switch_mm() 함수를 호출해 프로세스의 가상 메모리 매핑(virtual memory mapping)을 새 프로세스의 것으로 바꾼다
  2. <asm/system.h>에 정의된 switch_to() 함수를 호출해 이전 프로세스의 프로세서 상태를 현재 프로세스의 프로세서 상태를 바꾸고 이과정에서 프로세서 단위로 관리가 필요한 스택정보, 프로세서 레지스터 등의 특정 하드웨어 관련 정보를 저장하고 복원하는 일이 포함

※ 커널은 언제 schedule()함수를 호출할 것인가를 알고 있어야 한다.

※ 만일 코드에 명시된 경우에만 schedule()함수를 호출한다면, 사용자 프로그램이 영원히 실행 될 수 도 있다.

 

선점(preemption)

 

유저 선점 : 커널이 사용자 공간으로 돌아가는 순간 need_resched

  플래그가 설정되어 있어 스케줄러가 호출되면 발생한다

  따라서, 커널은 인터럽트 처리를 끝내거나 시스템 호출을 마치고

  사용자 공간으로 돌아갈 때마다 need_resched 값을 확인

 

  < 유저 선점 발생 조건> 

-시스템 호출에서 사용자 공간으로 돌아갈 때
-인터럽트 처리를 끝내고 사용자 공간으로 돌아갈 때

 

커널 선점 : 리눅스 커널은 완벽한 선점형 커널

  실행중인 작업이 잠금을 설정하고 있지 않은 상태라면 커널은 선점

  -> 선점 불가능한 영역을 표시 하는데 잠금을 사용

 

  < 커널 선점 발생 조건>    

-인터럽트 처리를 마치고 커널 공간으로 돌아갈 때
-커널 코드가 다시 선점 가능한 상태가 되었을 때
-커널 내부 작업이 명시적으로 schedule() 함수를 호출
-커널 내부 작업이 중단돼 대기 상태일 때
·schedule() 함수를 호출하게 되는 경우
반응형

+ Recent posts