운영체제 - 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)
'운영체제 > 프로세스(process)' 카테고리의 다른 글
운영체제 - 멀티 쓰레드(Multi-Thread) (0) | 2019.03.11 |
---|---|
운영체제 - 프로세스(process)의 생성과 종료 (0) | 2019.03.11 |
운영체제 - 프로세스 스케쥴링(process scheduling) (0) | 2019.03.09 |
운영체제 - 프로세스 상태 전이(Process State Transition), PCB(process control block) (0) | 2019.03.09 |
운영체제 - 프로세스(process)란? (0) | 2019.03.09 |