@ Dispatcher는 수행되게 되면 무엇을 해야 할 까요?
// 현재 프로세스의 스테이트를 저장시키고
// 다음 수행될 프로세스의 스테이트를 가져와야 합니다.
> 이것이 컨텍스트 스위칭입니다.
@ 나중에 OS를 공부하고 코드를 보게 되면,
// OS의 코딩 방식은 특이한 트릭이 필요합니다.
> 프로세스가 계속 바뀌고, CPU를 바꿔주어야 하기 때문입니다.
@ 우선 컨텍스트 세이빙을 먼저 보겠습니다.
// 컨텍스트 스테이트를 세가지로 먼저 나누겠습니다.
> Memory
> H/W
> System (kernel)
.. 이들을 어떻게 대피시킬까요?
@ 순서를 보겠습니다. (Override의 가능성을 생각하면 됩니다)
// H/W Context를 대피시킵니다.
// kernel Context은 내버려 둬도 됩니다 (Override할 경우가 없음)
// Memory Context(3가지 옵션이 있습니다)
> 1. 대피시키지 않습니다.
.. batch 시절에서는 모든 정보가 Main memory에 있었기 때문에
> 2. 모두 대피시킵니다. (Disk와 같은 곳에)
.. 유닛 프로그래밍을 할 때는 모두 대피시켜야 합니다.
.. 너무 느립니다. (roll out Swapping) (메모리가 작던 시절)
> 3. 부분적으로 Swap out 시킵니다.
.. Degree of Active job이 너무 많아질 때 그렇습니다.
? CPU Register는 어디로 대피를 시키나요?
// 메모리 하이라키의 관점에서 바로 다음으로 대피를 시키기에 이는,
> 메인 메모리로 대피를 시키게 됩니다.
@ CPU Register는 어떻게 대피할까요?
// 스텍에 어떤 데이터를 푸쉬하게 되면, 안전한 곳에 대피시킨다는 의미합니다.
> 팝은 다시 되돌린다는 의미입니다.
@ Interrupt가 발생하면
// 마지막 Instruction은 진행합니다.
// 그리고 PSW는 0으로 바뀝니다 (mode change)
// 이 다음 Instruction 주소는 Stack에 저장이 되게 됩니다.
// 그리고 자신의 mode가 무엇이었는지도 저장을 시켜두어야 합니다.
> (커널에서 Interrupt가 발생할 수도 있기에)
// 그리고 Interrupt Service routine으로 넘어갑니다.
? Question PSW 값과 다음 Instruction 주소는 누가 저장하는 것일까요?
// Interrupt Service routine의 첫번째 Instruction이 수행되기 전에 해야 합니다.
> 따라서 H/W가 저장해야 합니다. (H/W Support)
@ 따라서 Interrupt가 발생하면,
// Stack에 PSW값(mode)을 저장하고
> PC(register)에서 return address를 저장합니다.
@ Interrupt Service routine의 초반부에서는 어떤 일을 할까요
// Stack에 CPU register값을 대피시킵니다.
> 만약 대피시키지 않으면 Interrupt Service routine에서 CPU Register가 Override됩니다.
@ 그럼 Mechanism을 한번 확인해보겠습니다.
// 강의 5.2 20'm~
? Question register를 전부다 H/W적으로 대피시켜도 되지않을까요?
// 프로그래밍 상황에 따라서 특정 Register만 대피시키는 상황이 있기에
> S/W적으로 구현하는 편이 훨씬 좋습니다.
@ 다시 정리해보겠습니다.
// Interrupt가 걸렸을 때, H/W적으로으로 PSW와 return addreess가 저장됩니다.
// 그리고 Interrupt Service routine 초반부에서 Context saving을 하게 됩니다.
// 스케쥴러가 다음 프로세스를 골라주면, 그 프로세스의 PCB에서 Register value를 얻어오고
// return from Interrupt에서 context Switching이 일어납니다.
@ 이 법칙이 적용되지 않는, 예외가 있습니다.
// 이는 Process가 처음 만들어졌을 때는, 위 법칙을 따르지 못합니다.
> 이 때는 OS가 fake Stck을 만들어주게 됩니다.
.. 마치 한 번이라고 Context Switching을 당했던 것처럼
.. 일관성을 유지합니다.
@ Stack은 메인메모리에 저장되며,
// 각 프로세스 별로 stack을 각각 가지게 됩니다.