[KOCW 운영체제] 5강 CPU 스케줄링(CPU Scheduling)
KOCW 이화여대 반효경 교수님의 운영체제(2014-1) 강의 정리입니다.
CPU and I/O Bursts in Program Execution
- 프로그램은 CPU Burst와 I/O Burst를 반복하며 실행되며, 프로그램의 종류의 따라 빈도나 길이가 다르다.
-
CPU만 연속적으로 쓰면서 명령어를 실행하는 단계를 CPU Burst라고 하고, I/O를 실행하는 단계를 I/O Burst라고 한다.
-
CPU-Burst Time의 분포
- CPU-Burst Time이 짧을수록 중간에 I/O가 끼어드는 빈도가 많았고(I/O Bound Job), CPU-Burst Time이 길수록 I/O가 끼어드는 빈도가 낮았다(CPU Bound Job).
- 여러 종류의 Job(Process)이 섞여 있기 때문에 CPU 스케줄링이 필요하다.
- I/O Bound Job은 사람과 계속 Interation하는 Job이기 때문에 적절한 Response 제공이 필요하다.
- CPU와 I/O 장치 등 시스템 자원을 골고루 효율적으로 사용(공평성보다는 사람이 너무 오래 기다리지 않도록 하는 것이 필요하다).
프로세스의 특성 분류
- 프로세스는 그 특성에 따라 다음 두 가지로 나뉜다.
- I/O-Bound Process
- CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 Job.
- Many Short CPU Bursts.
- CPU Burst가 빈번하고 짧다.
- CPU-Bound Process
- 계산 위주의 Job.
- Few Very Long CPU Bursts.
- CPU Burst가 길고, 빈번하지 않다.
- I/O-Bound Process
CPU Scheduler & Dispatcher
- CPU Scheduler
- Ready 상태의 프로세스 중에서 이번에 CPU를 줄 프로세스를 고른다.
- Dispatcher
- CPU의 제어권을 CPU Scheduler에 의해 선택된 프로세스에게 넘긴다.
-
이 과정을 Context Switch(문맥 교환)라고 한다.
CPU Scheduler, Dispatcher는 운영체제 안에서 특정 기능을 하는 코드이다.
-
CPU 스케줄링이 필요한 경우는 프로세스에게 다음과 같은 상태 변화가 있는 경우이다.
1. Running ➡ Blocked (ex. I/O 요청하는 시스템 콜)
2. Running ➡ Ready (ex. 할당시간만료로 Timer Interrupt)
3. Blocked ➡ Ready (ex. I/O 완료 후 인터럽트)
- I/O가 끝난 후 바로 CPU를 주지 않지만, 해당 프로세스의 우선순위가 높을 경우 CPU를 바로 넘겨줘야 하는 경우도 있다.
4. Terminate
-
프로세스가 종료된 경우.
- 1, 4에서의 스케줄링은 nonpreemptive(=비선점형, 강제로 빼앗지 않고 자진 반납)
- All Other Schedulling Is Preemptive(=선점형, 강제로 빼앗음)
Scheduling Criteria(Performance Index = Performance Measure = 성능 척도)
-
어떤 스케줄링 알고리즘이 좋은지 평가하기 위한 방법.
- 시스템 입장에서의 성능 척도
-
CPU 하나 가지고 일을 최대한 많이 시키면 좋다.
- CPU Utilization(이용률)
- 전체 시간에서 CPU가 일한 시간의 비율.
- Keep The CPU As Busy As Possible.
- Throughput(처리량)
- 주어진 시간동안 처리한 작업의 양.
- The Number Of Processes That Complete Their Execution Per Time Unit.
-
- 프로세스 입장에서의 성능 척도
-
CPU를 빨리 얻고 빨리 처리되면 좋다.
- Turnaround Time(소요시간, 반환시간)
- CPU를 쓰러 와서 I/O를 하러 나가기까지 걸린 시간.
- Amount Of Time To Execute A Particular Process.
- Waiting Time(대기시간)
- CPU 사용을 위해 기다린 모든 시간.
- Amount Of Time A Process Has Been Waiting In The Ready Queue.
- Response Time(응답시간)
- Ready Queue에서 최초로 CPU를 얻기까지 걸린 시간.
- Amount Of Time It Takes From When A Request Was Submitted Until The First Response Is Produced, Not Output.
- (For Time-Sharing Environment)
-
Scheduling Algorithms
- FCFS(First-Come First-Served)
- 먼저 온 순서대로 처리.
- 비선점형.
-
비효율적. 👉 먼저 온 프로세스의 작업 시간이 오래걸리면, 뒤의 프로세스는 그 시간만큼 기다려야 한다.
- Example 1
-
프로세스의 도착 순서 P1, P2, P3 (모두 0초에 도착)
Process Burst Time P1 24 P2 3 P3 3 -
스케줄 순서를 간트 차트로 나타내면 다음과 같다.
- Waiting Time For P1 = 0; P2 = 24; P3 = 27
- Average Waiting Time: (0 + 24 + 27)/3 = 17
-
- Example 2
-
프로세스의 도착 순서 P2, P3, P1
- Waiting Time For P1 = 6; P2 = 0; P3 = 3
- Average Waiting Time: (6 + 0 + 3)/3 = 3
- Example 1보다 낫다.
- Convoy Effect: Short Process Behind Long Process
-
- SJF(Shortest-Job-First)
- 각 프로세스의 다음번 CPU Burst Time을 가지고 스케줄링에 활용.
-
CPU Burst Time이 가장 짧은 프로세스를 제일 먼저 스케줄.
- Two Schemes
- Nonpreemptive
- 일단 CPU를 잡으면, 이번 CPU Burst가 완료될 때까지 CPU를 선점(preemption) 당하지 않는다.
- Preemptive
- 현재 수행 중인 프로세스의 남은 Burst Time보다 더 짧은 CPU Burst Time을 가지는 새로운 프로세스가 도착하면 CPU를 빼앗긴다.
- 이 방법을 Shortest-Remaining-Time-First(SRTF)라고도 부른다.
- Nonpreemptive
- SJF Is Optimal (Preemptive)
- 주어진 프로세스들에 대해 Minimum Average Waiting Time을 보장.
-
Example of Non-Preemptive SJF
Process Arrival Time Burst Time P1 0.0 7 P2 2.0 4 P3 4.0 1 P4 5.0 4 - 0초에 P1 만 도착했으므로 P1 이 CPU를 얻게 되고, 7초에 반납을 한다.
- 7초 시점에서 큐를 살펴보면 P2 ~ P4 까지 모두 도착해 있다.
-
이중에서 CPU를 짧게 쓰는 순서대로 CPU를 얻게 된다.
- Average Waiting Time = (0 + 6 + 3 + 7)/4 = 4
-
Example of Preemptive SJF
- Average Waiting Time = (9 + 1 + 0 + 2)/4 = 3
- SJF의 문제점
- Starvation(기아 현상): Low Priority Processes May Never Execute.
- CPU Burst Time을 미리 알 수 없다.
- 프로그램은 Input을 받아서 실행되기도 하고, 분기가 일어나기도 하는 등의 상황 때문에 CPU Burst Time을 미리 알 수 없다.
- 과거의 CPU Burst Time을 이용해서 추정만 가능하다. 👉 Exponential Averaging
- tn = n번째 CPU Burst의 실제 CPU 사용 시간
- 𝜏n+1 = 다음 CPU Burst의 예측 시간
- 𝛼, 0 <= 𝛼 <= 1
- Define: 𝜏n+1 = 𝛼tn + (1 - 𝛼)𝜏n
- n번째 실제 CPU 사용 시간과 n번째 예측했던 시간을 일정 비율씩 곱해서 더해준다.
- 식을 풀면 다음과 같다.
- 𝜏n+1 = 𝛼tn + (1 - 𝛼)tn-1 + … + (1 - 𝛼)j𝛼tn-j + … + (1 - 𝛼)n+1𝜏0
- 𝛼와 (1 - 𝛼)가 둘 다 1 이하이므로, 후속 term은 선행 term보다 적은 가중치 값을 가진다.
- 뒤로 갈수록 (1 - 𝛼) 점점 더 곱해지게 되고, 1보다 작은 값을 더 곱하면 값이 더 작아지므로.
- 가장 최근의 과거는 가중치를 높게 반영하고, 오래 전의 것은 가중치를 낮게 반영한 결과가 얻어진다.
- Priority Scheduling(우선순위 스케줄링)
- 각 프로세스마다 우선순위를 나타내는 숫자(정수)가 주어지게 된다.
- 높은 우선순위(Highest Priority)를 가진 프로세스에게 CPU 할당.
- Smallest Integer = Highest Priority
- Two Schemes
- Nonpreemptive
- Preemptive
- SJF는 일종의 Priority Scheduling이다.
- SJF에서의 우선순위(Priority)는 Predicted Next CPU Burst Time이다.
- 문제점
- Starvation(기아 현상): 우선순위가 낮은 프로세스는 영원히 CPU를 얻지 못할 수 있다.
- 해결책
- Aging(노화): 시간이 지남에 따라 프로세스의 우선순위를 증가시킨다.
- RR(Round Robin)
- 각 프로세스는 동일한 크기의 할당 시간(Time Quantum)을 가진다.
- 일반적으로 10-100 Milliseconds.
- 할당 시간이 지나면 프로세스는 선점(Preempted)당하고, Ready Queue의 제일 뒤에 가서 줄을 선다.
- n개의 프로세스가 Ready Queue에 있고 각 할당 시간이 Q Time Unit인 경우, 각 프로세스는 최대 Q Time Unit 단위로 CPU의 시간을 1/n을 얻는다.
- 어떤 프로세스도 (n-1)Q Time Unit 이상 기다리지 않는다.
- n-1개의 프로세스가 q만큼의 시간을 쓰고 나면, 적어도 자기 차례가 1번은 돌아온다.
- CPU를 짧게 쓰는 프로세스는 1번의 Q Time Unit 만에 CPU를 쓰고 나가고, CPU를 오래 쓰는 프로세스는 Q Time Unit만큼 CPU를 사용하고 뺏기고, 다시 할당 받는 과정을 반복하므로 응답 시간이 빨라진다.
- 대기 시간이 CPU의 사용 시간에 비례하므로, 공정한 스케줄링이라 볼 수 있다.
- 어떤 프로세스도 (n-1)Q Time Unit 이상 기다리지 않는다.
- Performance
- Q Large(할당시간이 큰 경우) 👉 FCFS
-
Q Small(할당 시간이 작은 경우) 👉 Context Switch 오버헤드가 커진다.
- 따라서, 적당한 Time Quantum(10-100 Milliseconds)을 주는 것이 바람직하다.
-
Example 1
Process Burst Time P1 24 P2 3 P3 3 -
스케줄 순서를 간트 차트로 나타내면 다음과 같다.
-
CPU Burst Time이 Quantum Time보다 짧은 프로세스는 한 번에 CPU를 사용하고 빠져나가고, 나머지 프로세스는 자신 CPU Burst Time만큼 반복적으로 CPU를 사용한다.
-
일반적으로 SJF보다 Average Turnaround Time이 길지만, Response Time은 더 짧다.
- 프로세스들의 CPU Burst Time이 동일할 경우 CPU를 조금씩 서비스 받으면서 모든 프로세스가 마지막에 동시에 빠져나가게 되고, 이는 대기 시간을 길어지게 할 수 있다.
- 하지만, 일반적으로는 짧은 프로세스와 긴 프로세스가 섞여 있기 때문에 RR이 더 효과를 발휘한다.
-
-
- 각 프로세스는 동일한 크기의 할당 시간(Time Quantum)을 가진다.
-
Multilevel Queue
- 프로세스의 종류에 따라 우선순위가 정해지며(어느 큐에 속할지 정해진다), 이는 바꿀 수 없다.
-
우선순위가 높은 프로세스가 빨리 CPU를 얻어야 할 때 사용한다.
- Ready Queue를 여러 개로 분할.
- Foreground(Interactive)
- Background(Batch - No Human Interaction)
- 각 큐는 독립적인 스케줄링 알고리즘을 가진다.
- Foreground 👉 RR
-
Background 👉 FCFS
- 각 큐의 특성에 맞는 스케줄링 방법을 채택해야 한다.
- 큐에 대한 스케줄링이 필요하다.
-
어떤 큐에 스케줄링을 줄 것인지 결정.
- Fixed Priority Scheduling
- Serve All From Foreground Then From Background. 👉 우선 순위가 높은 큐가 비어 있을 때만, 낮은 순위의 큐에 CPU 할당.
- Possibility of Starvation.
- Time Slice
- 각 큐에 CPU Time을 적절한 비율로 할당.
- ex) 80% to Foreground in RR, 20% to Background in FCFS.
-
-
Multilevel Feedback Queue
- 프로세스가 다른 큐로 이동 가능.
-
에이징(Aging)을 이와 같은 방식으로 구현할 수 있다.
- Multilevel-Feedback-Queue Scheduler를 정의하는 파라미터들.
- Queue의 수
- 각 큐의 Scheduling Algorithm
- Process를 상위 큐로 보내는 기준
- Process를 하위 큐로 내쫓는 기준
- 프로세스가 CPU 서비스를 받으려 할 때 들어갈 큐를 결정하는 기준
- 일반적으로
- 처음 들어오는 프로세스를 우선순위가 가장 높은 큐에 넣고, 우선순위가 높은 큐는 RR에서 Time Quantum을 짧게 준다.
- 아래의 큐로 내려갈 수록 RR의 Time Quantum을 점점 길게 준다.
- 가장 아래의 큐는 FCFS의 방식을 사용한다.
- CPU 사용 시간이 긴 프로세스는 아래의 큐로 점점 이동을 하면서 Time Quantum은 더 받게 되지만, 우선순위는 낮아진다.
- CPU 사용 시간이 짧은 프로세스에게 우선순위를 많이 주는 방식.
- Example 1
- Three Queues
- Q0: Time Quantum 8 milliseconds
- Q1: Time Quantum 16 milliseconds
- Q2: FCFS
- Scheduling
- New Job이 Queue Q0로 들어간다.
- CPU를 잡아서 할당 시간 8 milliseconds 동안 수행된다.
- 8 milliseconds 동안 다 끝내지 못했으면, Queue Q1으로 내려간다.
- Q1에 줄서서 기다렸다가 CPU를 잡아서 16 milliseconds 동안 수행된다.
- 16 milliseconds에 끝내지 못한 경우 Queue Q2로 쫓겨난다.
- Three Queues
- Multiple-Processor Scheduling
-
CPU가 여러 개인 경우 스케줄링은 더욱 복잡해진다.
- Homogeneous Process인 경우
- Queue에 한 줄로 세워서 각 프로세서가 알아서 꺼내가게 할 수 있다.
- 반드시 특정 프로세서에서 수행되어야 하는 프로세스가 있는 경우에는 문제가 더 복잡해진다.
- Load Sharing 필요
- 일부 프로세서에 Job이 몰리지 않도록 부하를 적절히 공유하는 메커니즘이 필요하다.
- 별개의 큐를 두는 방법 vs. 공동 큐를 사용하는 방법.
- Symmetric Multiprocessing(SMP)
- 각 프로세서가 각자 알아서 스케줄링 결정.
- Asymmetric Multiprocessing
- 하나의 프로세서가 시스템 데이터의 접근과 공유를 책임지고 나머지 프로세서는 거기에 따른다.
-
- Real-Time Scheduling
- Hard Real-Time Systems
- Hard Real-Time Task는 정해진 시간 안에 반드시 끝내도록 스케줄링해야 한다.
- 일반적으로 Real-Time Task를 미리 스케줄링해서 데드라인이 보장되도록 한다.
- Soft Real-Time Computing
- Soft Real-Time Task는 일반 프로세스에 비해 높은 Priority를 갖도록 해야 한다.
- 데드라인을 반드시 보장하지는 않음.
- Hard Real-Time Systems
- Thread Scheduling
- Local Scheduling
- User Level Thread의 경우 사용자 수준의 Thread Library에 의해 어떤 Thread를 스케줄할지 결정.
- 운영체제는 쓰레드의 존재를 모르므로 운영체제가 하는 것이 아닌, 사용자 프로세스가 직접 스케줄링을 한다.
- Global Scheduling
- Kernel Level Thread의 경우 일반 프로세스와 마찬가지로 커널의 단기 스케줄러가 어떤 Thread를 스케줄할지 결정.
- Local Scheduling
Algorithm Evaluation
- Queueing Models
- 확률 분포로 주어지는 Arrival Rate(도착률)와 Service Rate(처리율) 등을 통해 각종 Performance Index 값을 계산.
- 이론적인 방법.
- Implementation(구현) & Measurement(성능 측정)
- 실제 시스템에 알고리즘을 구현하여 실제 작업(Workload)에 대해서 성능을 측정 비교.
- Simulation(모의 실험)
- 알고리즘을 모의 프로그램으로 작성 후, Trace(시뮬레이션 프로그램에 Input으로 들어갈 Data)를 입력으로 하여 결과 비교.