CPU Scheduling이란?
Memory위에 여러 Process들이 올라가 있는 Multiprogramming 환경에서 CPU Utilization(CPU 이용률)을 최대화 하는 것!
CPU-Burst와 I/O-Burst가 순환하는 구조를 가진다.
CPU Scheduler
: 메모리 위의 여러 ready상태의 프로세스 중 하나를 선택하여 CPU에게 넘겨주는 것.
CPU Scheduling을 다음과 같은 상황에서 실행된다.
- Process가 Running → Waiting 일 때 ( I/O 작업이 시작되었을 때)
- Process가 Terminated 상태일 때
- Process가 Running → Ready 일 때 ( Interrupt가 발생했을 때 → Ready Queue안에 변경사항이 생겼을 때)
- Process가 Waiting → Ready 일 때 ( I/O 작업이 끝났을 때 → Ready Queue안에 변경사항이 생겼을 때)
- , 2) → non-Preemptive ( non-Interruptable ) : CPU 안에 프로세스가 끝날때 까지 건드리지 않는다!
3), 4) → Preemptive( Interruptable ) : CPU 안에서 작업중인 Process도 Scheduling에서 고려한다.
Dispatcher
CPU의 Control을 Short-term Scheduler가 선택한 Process로 옮기는 작업을 한다.
이 작업을 Dispatch 혹은 Context Switching이라고 한다. ( Kernel Mode 💻 ) 에서 실행된다.
Dispatch 하는 과정
- Switching Context
- Switching Usermode
- Program restart
Dispatch latency : Control을 넘기는데 걸리는 시간. 한 Process를 정지, 다른 한 Process를 다시 시작시키는 데 걸리는 시간.
Scheduling Criteria
scheduling 기준
1. CPU Utilization : CPU 이용률. 가능한 한 CPU를 혹사시키려고 한다. 클수록 좋다.
2. Throughput : 처리량. 단위시간 당 실행되는 Execution(명령어)의 양. 클수록 좋다.
3. Turnaround : 처리시간. 작업이 끝날 때 까지 걸리는 시간. 작을수록 좋다.
4. Waiting Time : 프로세스들이 Ready Queue에서 기다리는 시간. 작을수록 좋다.
5. Response Time : 반응시간 : 첫번째 Response가 나타나는 시간. 작을수록 좋다.
response time은 특히 시분할 시스템에서 중요하다고 한다.
여러가지 Scheduling 방식
First-Come, First-Served ( FCFS ) Scheduling
Ready Queue에 들어온 순서대로 CPU를 할당받는다.
⇒ Process들이 들어온 순서에 따라서 Waiting Time이 달라진다.
처리시간이 짧은 Process들이 먼저 들어올 수록 Waiting Time이 짧아진다.
Convoy Effect : CPU Burst가 작은 Process들이 CPU Burst가 큰 Process뒤에서 기다리는 현상.
Shortest-Job-First ( SJF ) Scheduling
CPU Burst Time이 작은 Process부터 처리하는 방식.
두가지 방식이 있다.
- Non-Preemptive : CPU를 차지한 Process는 중지하지 않고 Scheduling을 진행한다. ( Shortest Job Next)
- Preemptive : CPU에 있는 Process의 Next CPU Burst Time까지 고려하여 Scheduling을 진행한다. 이 방식을 Shortest-Remaining-Time-First( SRTF ) 라고 한다.
SRTF는 Context Switching( Process의 Control을 바꾸는 과정 ) 이 많이 일어난다. Dispatch Latency가 증가하고 성능이 나빠진다. ( Context Switching 은 Overhead이기 때문이다 )
BUT. 평균 Waiting Time 측면에서는 성능이 가장 좋다.
SJF는 Next CPU Burst를 필요로 한다 ⇒ Next CPU Burst를 계산하는 방법.
- 𝑇n = n번째 CPU Burst 측정값.
- 𝙩n+1 = n+1번째 CPU Burst 예측값.
- ả = 예측값과 측정값의 비율 / ả = 0 일때. 측정값 사용 X / ả = 1 일때. 예측값 사용 X
- 𝙩n+1 = ả * 𝑇n + (1 - ả) * 𝙩n
Priority Scheduling
우선순위를 설정하여 우선순위가 높은 프로세스를 먼저 처리한다.
우선순위를 결정하는 정수가 있다. → 이 정수가 작을수록 우선순위가 높다.
Preemptive : CPU에 있는 프로세스까지 고려하여 Scheduling
Non-Preemptive : CPU에 들어간 프로세스는 건들지 않는다.
SJF는 Priority가 Next CPU Burst Time인 Priority Scheduling 기반 알고리즘이다.
문제점 : Starvation : 우선순위가 높은 프로세스들이 계속 들어오면 처리되지 않는 프로세스가 생긴다.
해결방법 : Ageing : 시간이 지날수록 우선순위가 높아지도록 한다.
Round Robin ( RR )
프로세스들이 CPU를 이용할 수 있는 시간에 제한이 생긴다. 이 시간 제한을 Time Quantum이라고 한다.
N개의 프로세스들이 있고, Time Quantum이 Q일 때. 프로세스가 최대로 기다리는 시간은 ( N - 1) * Q.
Time Quantum이 크다 ⇒ FIFO
Time Quantum이 작다 ⇒ Context Switching이 자주 일어나 Overhead가 증가하고 성능이 떨어진다.
SJF 보다 Turnaround ( 처리시간 ) 이 높지만, Response가 좋다.
Time Quantum 설정방법
Time Quantum이 높다고 무조건 좋아지는 것은 아니다.
Rule of Thumb : 엄지손가락의 법칙👍 90%의 프로세스가 한번에 끝나는 Time Quantum이 좋다.
'Computer Science > OS' 카테고리의 다른 글
5강. 연습문제 (1) | 2023.11.28 |
---|---|
CPU Scheduling (2) (1) | 2023.11.28 |
4강. 연습문제 (1) | 2023.11.27 |
Threads (1) | 2023.11.25 |
3강 연습문제 (2) | 2023.11.25 |