CS/OS

[OS 공룡책] 5. CPU Scheduling

grammiboii 2026. 1. 9. 18:10

 

 

하나의 cpu를 왜 sharing 해야하는지는 처음에 알아봤다

복습해보면

전제는 cpu는 굉장히 빠르기 때문에 처리량에 비해 놀고 있는 상황이고,

cpu utilization 즉 사용량을 극대화 하기 위해 여러가지 프로세스를 번갈아 가며 처리하기 위함

 

이는 기본적으로 IO bound가 cpu bound보다 훨씬 길기 때문에 발생한다

 

이제 cpu를 어떤 프로세스에게 어떻게 분배할것인가? 가 스케줄링이다

좀더 구체적으로 ready queue에 들어가있는 프로세스들에게 어떻게 할당할것인가?

 

 

크게 두가지가 있는데

- FIFO Queue

- Priority Queue

 

그리고 구체적인 방법론을 이해하기 위해

- Preemptive 선점형

- Non-preemptive 비선점형

개념이 나온다

 

이게 말이 좀 헷갈리는데

주체는 cpu 스케줄러이다

 

cpu 스케줄러가 preemptive하면 즉 선점형이면

현재 돌아가고 있는 프로세스들을 쫓아낼 수 있는 것이고

 

non preemptive하면 한번 점유한 프로세스는 자발적으로 끝나거나 waiting 상태가 될때까지 돌아간다는 것

 

 

그리고 하나더 몰랐던건

context switching때 switch할 다음 작업을 선택하는 것이 스케줄러이고

선택된 작업을 프로세서에게 할당하는 것은 dispatcher라고 따로 있다고 한다

 

 

 

다시 본론으로 돌아와 스케줄링할때 가장 중요한 지표는

- waiting time

- turnaround time

 

 

 

 

들어가기 앞서

좀 당연해보이지만 헷갈리는 부분은

프로세스를 기준으로 스케줄링한다고 배우는데

실질적으로는 스레드 단위로 스케줄링 하는게 일반적이라고 한다

 

 

 

스케줄링 알고리즘

간단하게 목록부터 보면

- FCFS : first come first served (Non - preemptive)

- SJF / SRTF : Shortest Job First / Shortest Remaining Time First (Non - preemptive / preemptive)

time sharing

- RR : Round Robin

- Priority Based

- MLQ : Multi Level Queue

- MLFQ : Multi Level Feedback Queue

 

 

 

FCFS

가장 간단하다

fifo 큐에 넣어주면 된다

 

Non - preemptive

 

waiting time

P1 : 0

P2 : 24

P3 : 27

평균 17초를 기다린다

 

turn around time

P1 : 24

P2 : 27

P3 : 30

완료될때까지 평균 27초

waiting time
P1 : 6

P2 : 0

P3 : 3

평균 3초를 기다렸다

 

P1 : 30

P2 : 3

P3 : 6

완료될때까지 평균 13초

 

들어오는 순서만 바뀌었는데 엄청난 차이가 난다

 

 

근본적으로 실행시간이 짧은데도 오래 기다려야 하기 때문에 이런 일이 발생한다

 

 

 

SJF Shortest Job First & SRTF Shortest Remaining Time First

위 문제를 해결하기 위해 실행시간이 가장 짧은 프로세스를 실행하는 아이디어

 

Non - preemptive OR preemptive

도착 순서와 무관하게 하나의 간트차트가 나온다

 

 

waiting time

P1 : 3

P2 : 16

P3 : 9

P4 : 0

평균 7초

 

 

왜 preemptive일수도 있는가

P1이 5초 작업이 걸리고

P2가 1초 작업이 걸리는데 P1을 1초 실행중에 P2가 들어온다면

P1 -> P2 -> P1순으로 작업할 수도 있다

 

이게 SRTF이다

 

 

 

 

RR Round Robin

 

CS에서 되게 많이 나오는 말인데 빙글빙글 돈다

그냥 고루고루 돌아가면서 쓰는 방식

 

preemptive - time sharing

 

 

그냥 time quantum

단위시간동안 쓰고 돌아가는 방식이다

 

보통 10 ~ 100 ms사이를 사용한다고 한다

구현은 circular queue사용

 

 

 

 time quantum을 얼마로 두느냐가 굉장히 중요한 알고리즘

 

너무 적게 줘도 turn around time이 늘어나고

넘누 많이 줘도 문제다

 

 

Priority Based

 

프로세스에 우선순위를 부여해 실행하는 방식이고

 

모든 프로세스 우선순위가 같다면 FCFS 순으로 먼저 들어온 프로세스를 먼저 처리한다

SJF가 일종의 priorioty based라고 볼 수 있다

-> SJF에서 next cpu burst를 예상해 계산하기 때문 (수행 시간을 우선순위로 두는 것)

 

 

 

 

이 알고리즘에서는 starvation 문제가 발생할 수 있다

(우선순위가 높은것만 계속 실행하는 문제)

 

이를 해결하기 위해 aging을 사용할 수 있다

실행하지 못한 프로세스의 우선순위를 높여주는 방법

 

또한 여기서 preemptive하게 할것인가 non-preemptive하게 할것인가 선택이 존재한다

 

결론적으로 RR + Priority 섞어서 사용하게 되는데

같은 우선순위를 가지면 RR