CPU Scheduling

citron03·2021년 11월 24일
0

운영체제

목록 보기
9/11

CPU scheduling은 멀티프로그래밍으로 CPU 활용을 극대화 하기 위해서 필요하다.
CPU burst와 I/O burst로 이루어진 cycle을 scheduling한다.

🍸 MS-DOS같은 단일 프로세스 OS에서는 CPU scheduling이 필요없다.

  • CPU burst가 있고 그 뒤에 I/O burst가 발생한다.
  • 이때, CUP는 해당 데이터가 메모리에 들어올 때까지 I/O를 기다린다.
    🍫 프로세스가 I/O를 발생시킨다.
  • 이 기다리는 시간동안, 데이터나 다른 routine을 실행시켜 CPU가 최대한 시간당 많은 작업을 할 수 있게끔 한다.
  • 대부분의 프로세스는 CPU를 짧은 시간안에 사용한다.

CPU Scheduler (Short Term Scheduler)

  • 메모리안의 프로세스 중 하나를 선택해 CPU를 사용하게 한다.
    • 각 프로세스는 CPU를 non-preemptive(비선점)하거나 preemptive(선점)한다.
      • non-preemptive 하면 작업을 모두 수행하고 자발적으로 CPU를 내준다.
        🍕 I/O, 공유자원을 요청할때 running state에서 waiting state가 되는 경우와 프로세스가 종료될 때 이렇다.
      • preemtive 하면 작업을 수행하는 도중이라도, 강제로 CPU를 내주게 된다. (비자발적)
        🍲 quantum이 끝나고 running state에서 ready state가 되는 경우나 I/O작업 후 데이터를 받고 waiting에서 ready가 되는 경우가 그렇다.
    🌻 non-preemptive한 경우는 문제가 되지 않으나, preemtive한 경우에 문제가 발생할 수 있다. 🌼
    • CPU를 사용하던 프로세스가 미처 다 데이터를 수정하기 전에 프로세스가 강제로 CPU를 내주게 되고 다른 프로세스가 이 데이터를 read하면, 데이터에 일관성을 해칠 수 있다.
    • 만약 kernel mode에서 중요한 data structure를 수정할때 위와 같은 상황이 발생하면 일관성이 깨지기 때문에 대부분의 kernel은 non-preemptive하다.
    • 실시간으로 큰 overhead가 발생하고(deadline) 성능이 저하된다면, preemtive가 유리하다. 사용자의 프로세스가 그렇다.
    • 중요한 OS 작업을 하는 도중에 interrupts가 발생하면 중간 결과 유실 가능성이 있는 등의 문제가 생길 수 있다.
      따라서, interrupt가 들어오기 전에 다른 interrupt를 못받도록 disable하고 모두 처리가 끝난 후에 빠져나와 다시 받을 수 있게 inable한다.

Dispatcher

CPU scheduler의 한 부분으로 module이다.
context를(PCB에 저장된 내용)을 바꾸고 user mode로 바꾼다.
사용자 프로그램을 재시작할 때 return address로 이동시킨다.

  • dispatcher가 작업을 하는데 걸리는 시간은 짧을수록 좋다.
    왜나하면, dispatcher는 사용자의 일을 하는 것이 아니기 때문이다.
  • 좋은 시스템은 사용자의 프로그램을 빠르게 실행한다. (kernel overhead가 적게 일어난다.)
  • 내줘야하는 프로세스의 PCB를 메모리에 저장하고선택된 프로세스의 PCB를 CPU register에서 불러온다.

좋은 CPU Scheduling

  • CPU 이용률과 throughput(단위 시간당 처리하는 프로세스 갯수)가 많을 수록 좋다.
  • 첫 번째 response, output이 나타날 때 까지 걸리는 시간을 짧아야 좋다.
  • turnaround time(프로세스가 시작해서 끝날 때 까지의 시간)과 waiting time(프로세스가 ready queue에서 기다리는 시간)은 짧으면 좋다.
profile
🙌🙌🙌🙌

0개의 댓글