프로그래밍[Univ]/운영체제

[OS] Schedulers & Context switch

Cloud Travel 2012. 4. 5. 17:28

* Schedulers

 - Scheduler : 프로세스 상태의 변화를 결정하는 것


* Long-term scheduler and Short-term scheduler

 - Disk와 메모리사이에 존재하는 long-term scheduler와 

   메모리와 CPU사이에 존재하는 short-term scheduler가 존재한다.

 ⓐ Long-term scheduler

  - Disk에 있는 Job을 언제 메모리 큐로 보낼 것인가를 결정하는 스케쥴러

  - Job scheduler라고도 부른다.

  - Process가 종료되면(Memory 여유가 생길 때) Job을 불러들인다.

  - 몇초 또는 몇분에 한번씩 발생한다.

  - 느린 편이다.

 ⓑ Short-term scheduler

  - Memory에 있는 것을 언제 CPU로 보낼 것인가를 결정하는 스케쥴러

  - CPU scheduler라고도 한다.

  - Timer interrupt에 의해 많은 빈도로 실행된다.

  - milliseconds단위로 발생한다.

  - 매우 자주 실행되므로 빨라야 한다.

 ※ 대부분의 PC는 short-term scheduler만 존재한다.


* LT-scheduler

 - Long-term scheduler에서 어떤 타입의 process를 메모리에 올릴 것인가(실행할 것인가)?

  > 결론적으론 두개의 process타입을 모두 실행해주는 것이다. Why?

 ※ Process type 

  ⓐ I/O bound process : 대부분의 시간을 I/O event에서 실행한다.(ex) 채팅)

  ⓑ CPU bound process : 대부분의 시간을 계산하는 과정(CPU)에서 실행한다.(ex) 3D graphic)

 - 만약, I/O bound process를 우선적으로 실행시켜주면 I/O device queue는 꽉 차고,

    Ready Queue는 비어있고, CPU도 놀고 있는 상태가 된다.

    > 실행 효율이 50%가 된다.(각각의 queue(ready, I/O device)를 50% 효율로 잡는다면...)

 - 만약, CPU bound process를 우선적으로 실행시켜주면 Ready queue도 꽉 차고, CPU도 지속적으로 활동한다.

   CPU관점에서는 자신의 performance가 향상된다. 

   > But, 이 또한 반대편 queue(I/O device queue)가 비어있기 때문에 실행 효율이 50%라고 할 수 있다.

 - LT-scheduler : I/O bound process와 CPU bound process를 섞어서 실행시켜준다.

   > Ready Queue와 I/O device queue가 모두 충분히 사용되기 때문에 System performance가 좋다.


* Medium Scheduling : Swapping 

 - 위에서 대부분의 PC는 short-term scheduler만 사용한다고 보았다. 

   그렇다면 메모리가 한계에 다다랐을 때 process를 어떻게 실행 한 것인가?

   > Medium scheduling : swapping 기법을 사용한다.

 - 실행중인 프로세스를 잠시 디스크 단계로 내린다.(swap out)

   후에 요청한 프로세스를 실행한 후에 디스크 단계로 내려간 프로세스를 reload(재실행)해준다. (swap in)

 - 어떤 것을 swap할 것인지는 medium scheduling 기법에 모두 포함되 있다.


* Context Switch

 - PCB의 모든 정보를 Context라고하며, 이것이 CPU에 Load되고 Save되는 과정을 Context switch라고 한다.

 - Context Switch는 순수한 오버헤드이다.

  > 꼭 필요한 과정인데 시간 낭비인 것. 무언가를 하기 위해서 실행되는 낭비. 

     따라서, context switch는 빠르게 실행되야 한다.

 - Context Switch를 빠르게 하기 위한 방법

  > 메모리 속도를 높인다.

  > 레지스터 수를 줄인다

  > Context Switch의 특수한 명령어를 수행한다.

  ※ 위에서 register수를 줄인다고 해야 빨라진다고 했는데, 반대로 register를 늘리면서 register를 여러 집합으로

      나누면 performance가 증가하게 된다.