CPU를 짧게 쓰고 I/O bound가 끼어드는 작업을 I/O bound job
CPU를 오랫동안 쓰는 프로그램을 CPU bound job이라고 함
여러 종류의 job(=process)이 섞여 있기 때문에 CPU 스케줄링이 필요하다.
프로세스는 특성에 따라 다음 두 가지로 나눈다.
CPU Scheduler
Dispatcher
CPU 스케줄링이 필요한 경우는 프로세스에게 다음과 같은 상태 변화가 있는 경우이다
1. Running -> Blocked(I/O 요청하는 시스템 콜)
2. Running -> Ready(할당 시간 만료 후 timer interrupt)
3. Blocked -> Ready(I/O 완료후 인터럽트)
4. Terminate
1번과 4번의 스케줄링은 비선점형(nonpreemptive) = 강제로 빼앗지 않고 자진 반납
2번 3번은 선점형(preemptive) = 강제로 빼앗음
현대의 스케줄러는 대부분 선점형을 사용하고 있음
성능 척도의 요소
CPU utilization (이용률)
CPU가 놀지 않고, 일을 한 시간
Throughput (처리량)
주어진 시간동안 몇개의 작업을 완료했는지
Turnaround time (소요시간, 반환 시간)
CPU burst가 끝나고 나갈때까지의 시간을 말함
Waiting time (대기 시간)
CPU를 사용하기 위해 ready queue에서 기다린 시간
Response time (응답 시간)
처음으로 CPU를 얻은 시간
먼저 온 프로세스를 먼저 처리
➡️ 그렇게 효율적이지는 않다.
비선점형이다.
Convoy effect
란? ➡️ 앞의 긴 작업 때문에 큐에서 짧은 작업들이 기다리는 현상
각 프로세스의 다음번 CPU burst Time을 가지고 스케줄링에 활용하여 이 시간이 가장 짧은 프로세스를 제일 먼저 스케줄한다.
Two schemes:
이 SJF는 주어진 프로세스들에 대해 minimum average waiting time을 보장! --> SJF의 preemptive 버전
SJF의 문제점
starvation
➡️ CPU burst가 긴 작업들은 영원히 작업을 수행할 수 없음
CPU 사용시간을 미리 알 수 없음
➡️ 과거에 얼마나 쓴지 확인해서 추측은 가능
각 프로세스와 연관된 우선 번호를 이용하여 높은 우선순위를 가진 프로세스에게 CPU 할당(작은 숫자가 우선순위가 높음)
SJF는 일종의 priority scheduling 이다(CPU burst time이 우선순위)
➡️ priority = predicted next CPU burst time
문제
해결
현대적인 CPU 스케줄링은 RR에 기반함.
장점은 응답시간이 빠르다는 것!
특징:
time quantum
을 몇으로 설정하느냐에 따라 average turnaround time
이 달라진다.Ready queue를 여러 개로 분할
각 큐는 독립적인 스케줄링 알고리즘을 가짐
큐에 대한 스케줄링이 필요
CPU가 여러 개인 경우 스케줄링은 더욱 복잡해짐
Homogeneous processor인 경우
Load sharing
Symmetric Multiprocessing (SMP)
Symmetric: 대칭이라는 의미
Asymmetric multiprocessing
Hard real-time systems
Soft real-time computing
Local Scheduling
Global Scheduling
알고리즘 성능 측정 방법
Queuing models
확률 분포로 주어지는
arrival rate
와service rate
등을 통해 각종performance index
값을 계산
Implementation & Measurement
실제 시스템에 알고리즘을 구현하여 실제 작업(workload)에 대해서 성능을 측정 비교(리눅스 커널에 소스코드를 바꿔서 직접 실험)
Simulation
알고리즘을 모의 프로그램으로 작성후 trace를 입력으로 하여 결과 비교
2번째와 같이 실제 실험을 하는 것은 아님(리눅스 소스 코드 커널을 직접 수정하거나 그러지는 않음)