오퍼레이팅 시스템 [6] - Process Switch의 상세과정

‘프로세스 스위치의 과정’


Modes

  • 앞서 다룬것처럼 프로세스는 2개의 모드로 실행 가능하다.
    1. Kernel(System) Mode
      모든 OP-Code의 사용이 가능하며 모든 메모리영역, 모든 레지스터 사용가능
    2. User Mode
      일부 OP-Code만 사용가능하며, 자신의 메모리영역, 특수목적 레지스터를 제외하고 사용가능.

Mode Switch

  • 다른 모드로 실행되는 프로세스로 바꾸는것
    • 현재 수행되고 있는 프로세스의 상태가 변화하는것이 아니다.
    • 현재 프로세스의 상태를 저장하고, 복구하는데 OverHead가 발생한다.
  • 모드 스위치를 유발하는 상황
    1. 프로그램 스스로가 System call을 실행시키거나 Exception이 발생할때
      프로세스에 의해 실행된 커널로, process context에 있다고 말한다.
    2. Interrupt Handler를 실행할때
      프로세스와 무관하게 외부에서 현재 프로세스를 방해하며 Interrupt를 발생 시킨다. 커널이 interrupt context 에 있다.
      • 현재 프로세스가 방해받은 것이므로, 최대한 빠르게 간단하게 처리해야한다.

system call로 인해 이루어지는 Mode switch

Kernel stack

  • 유저 레벨에서 접근할수 있는 메모리와 커널 레벨 메모리를 분리하기 위해서, Kernel Stack의 공간이 메인메모리에 따로 필요하다.
    • 커널도 함수로 이루어져있으므로 Instruction과 Data, Stack을 필요로 하므로 메모리에 저장이 되어있어야 한다.
    • 둘을 분리함으로 인해 유저 레벨에서의 커널 접근을 막고, User Stack이 방해받더라도 Kernel은 실행될 수 있게된다.

Process Switch

과정

  • Mode Switch보다 더 많은 과정이 필요하다.
    1. 현재 프로세스의 프로세서 상태를 저장한다.
    2. 현재 프로세스의 PCB를 업데이트한다.(Ready, Blocked, Exit 등의 상태)
    3. PCB를 적절한 state의 Queue로 이동시킨다.
    4. 실행될 다른 프로세스를 선택한다.(=Scheduling)
    5. 선택한 프로세스의 PCB를 업데이트한다.(Running)
    6. PCB에 의해 저장된 레지스터값들을 복구한다.
    7. 실행한다.
  • 이 과정 도중 Instruction Fetch가 일어날 수 없으므로, 하드웨어로 구현한다.

EXAMPLE

  • Source: modified from [Kevin Webb at Swarthmore College]
  • 유저 프로그램 P가 실행되고 있는 상황에서, Process Switch가 발생하는 예시 상황이다.

1. 프로그램 P 가 실행되며 System call을 포함하는yield()함수를 실행한다.

  • yield system call : CPU 점유를 포기하며 코드 실행을 함수 바깥으로 양보한다.
  • PC : 다음 실행될 명령어를 가르키는 레지스터
  • SP : Stack의 마지막 주소
  • 이때 메모리의 Stack은 당연히 유저 영역의 Stack이 된다.

2. yield() 함수내부의 int 0x80을 실행함으로 System call을 요청한다.


3. Mode Switch가 발생하며 현재 PCSP의 값이 커널영역 메모리의 Stack에 저장된다.

  • 이때 지역변수인 x의 Data는 유저Stack에서 사라진다.
  • PCSP는 각각 새롭게 System call 함수 sys_yield()와, 커널 Stack을 가르킨다.
  • USER -> KERNEL

4. process_switch()함수가 실행된다.

  • 이때 다음 실행될 프로그램은 차후에 다룰 Scheduling에 따라 정해진다.
  • 커널 Stack에 변수 old(=프로세스 P), new(=프로세스 Q) 가 저장된다.

  • 여기서부터 복잡하니 자세히 설명해보겠다!

5. process_switch()함수 내부에 in_progress 변수를 0으로 설정하고, 현재 프로세스 P의 상태를 P의 PCB에 저장해둔다.


6. P의 PCB가 메모리에 저장되었고, 이는 차후 프로세스 Q가 완료되고 프로세스 P가 다시 실행될 차례가 되었을때 이어서 실행될 경우를 위해 사용된다.

  • Mode Switch가 발생했을때 저장했던 PC, SP값은 P의 유저모드로 돌아오기 위해 저장된 값이므로 구분하여야 한다.

7. PCB에 저장된 PC값은 save_context()함수를 가르키고 있다.

  • 프로세스 P의 상태를 저장한 후에, Flag역할을 하는 in_progress의 값이 0이다.
  • in_progress변수는 나중에 프로세스 P의 차례가 다시 돌아왔을때, 다시 Process switch가 발생하지 않도록 하는 Flag역할을 한다.

8. in_progress변수의 값이 1로 설정된다. 이는 다시 P로 돌아왔을때 restore_context()를 실행하지않게 하기위함이다.


9. restore_context()함수를 통해 새로운 프로세스 즉, new(=Q)의 상태를 Q의 PCB를 통해 복구시키며, 프로세스 Q가 실행된다.


10. 프로세스 Q 실행중.


11. 이제부터는 프로세스 Q의 실행이 종료 혹은 process switch된 후 PScheduling되었을 상황이다.

  • P의 PCB에서 상태를 복구하여 process_switch()함수 내부의save_context()함수부터 실행한다.

12. Flag in_progress의 값이 1이므로, restore_context()함수가 실행되지 않고 return된다.


13. 프로세스 P의 sys_yield()함수로 다시 돌아오며, PCB는 다시 사용되지 않으므로 표시하지 않았다.


14. 커널 Stack에 저장되어 있었던 PCSP의 값을 통해 다시 P의 User Mode로 돌아와 실행된다.

  • CPU가 User Mode로 돌아왔으므로 Kernel 의 메모리영역은 표시하지 않았다.
  • 다른 프로세스가 자원에 접근하는 상황을 막기 위해 Process Switch커널모드에서 실행된 것을 볼 수 있다.