본문 바로가기

운영체제/프로세스(process)

운영체제 - Context-switching

운영체제 - Context-switching


# Context switching?

- 현재 수행 중인 프로세스의 state를 저장하고 다음에 수행될 프로세스의 state를 불러오는 작업


# process의 state?

1. memory contest

- code, RW data, stack, heap

2. hardware context

- CPU registers

3. kernel context

- PCB(process control block)


Q. context-switching이 일어날 때 process의 state를 대피 시키는 이유가 무엇일까?

- process의 state정보가 손실되지 않도록 보호하기 위함이다. 예를 들어 hardware context인 cpu registers값을 대피하지 않으면 context-switching이 일어난 후에 데이터를 over-write하게 되어 다시 이전 프로세스로 돌아올때 state정보를 잃어버려 정상 동작을 수행할 수 없다.

- kernel context는 메모리 영역 중 운영체제 공간에서 관리되므로 대피시킬 필요가 없다.

- CPU registers는 무조건 대피시켜야 한다.

- 그런데, memory context의 경우 운영체제가 uni-programming이면 disk로 대피 시켜야하고 메모리 공간이 여유로운 multi-programming은 대피시킬 필요가 없다. ( degree of multi-programming이 높아서 메인 메모리 영역이 부족한 경우에는 multi-programming이더라도 swapping에 의해 disk로 memory context를 대피시킨다. )


* swapping은 memory hierarchy구조상 한 단계 아래로 대피된다.

즉, cpu registers -> main memory로 대피

main memory -> disk로 대피


0x100 : ADD R0, R1, R2 // interrupt 발생!

0x104 : 


CPU가 0x100주소에 있는 instruction을 수행하던 도중 interrupt 요청을 받았다고 가정해보자.

그러면, 0x100주소의 ADD instruction은 모두 끝낸 뒤, 아래와 같은 작업이 일어난다.



# Context-switching 절차

Interrupt 요청에 의해 수행이 중지된 프로세스를 process-A라 하자.

scheduler에 의해 선택된 다음에 수행할 프로세스를 process-B라 하자.

1. interrupt 요청이 발생하면 제일 먼저 하드웨어는 현재 PSW(Process State Word) register값과 현재 PC(program counter)값을 process-A 스택에 push한다.

2. 그리고, 하드웨어는 PSW의 mode bit을 0으로 설정하여 kernel mode로 mode change한다.(interrupt가 발생하기 전 mode값을 유지하기 위함)

3. 이후 운영체제는 전달받은 IRQ number(Interrupt Request Number)에 따른 ISR을 Interrupt Vector Table에서 찾고 매칭되는 ISR로 jump한다.

4. ISR 첫번째 라인에서 Dispatcher->Context Saving작업이 수행된다.

5. Context-saving 작업에 의해서 process-A의 hardware context(=cpu registers)값이 스택에 push된다.

6. process-A의 stack-pointer를 재 조정(=마지막에 push된 값을 가르키는 주소)하여 process-A의 PCB에 적는다.

7. dispatcher는 다음에 수행할 프로세스가 무엇인지 알기 위해 scheduler를 호출한다.

8. scheduler는 내부 메커니즘에 의해 다음에 수행할 프로세스를 결정하고 해당 프로세스의 PCB 주소를 리턴한다.

9. dispatcher는 OS_PCB_Cur값을 다음에 수행할 PCB를 가르키게 한뒤, 해당 PCB의 stkPtr로 jump한다.

10. Dispatcher->Context Loading작업이 수행된다.

11. process-B의 hardware context(=cpu registers)값을 pop하여 CPU registers에 대입한다.

12. 스택에 PSW값을 읽어 현재 PSW에 대입한다.

13. return address 를 pop하여 process-B가 중단됐던 주소로 jump한다.




++p.s.

stack 영역은 메인 메모리에 존재하며 각 프로세스마다 별도의 stack을 가진다.

단, cpu연산이 수행되는 active stack은 한개이다.


프로세스가 생성되는 시점에는 stack에 context정보가 없으므로 context-switching을 할 수 없다.

-> 이것을 위해 프로세스가 생성될때 운영체제에서 context 정보를 포함한 fake stack을 만들어준다



preemptive scheduling

- Interrupt에 의해 실행중이던 프로세스가 CPU를 빼앗기는 로직. via H/W interrupt.


non-preemptive scheduling

- 프로세스가 I/O operation 호출처럼 자기 스스로 CPU를 양보(=yield)하는 로직. via S/W interrupt(=trap)