Operating System : 운영체제

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

3) Context Switching

@ 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값(register)을 저장하고

        > PC(register)에서 return address를 저장합니다.

        

@ Interrupt Service routine의 초반부에서는 어떤 일을 할까요

    // Stack에 CPU register값을 대피시킵니다.

        > 만약 대피시키지 않으면 Interrupt Service routine에서 CPU Register가 Override됩니다.

        

@ 그럼 Mechanism을 한번 확인해보겠습니다.

    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을 각각 가지게 됩니다.

댓글

댓글 본문
작성자
비밀번호
버전 관리
박천명
현재 버전
선택 버전
graphittie 자세히 보기