프로세스의 실행은 CPU 실행과 I/O 대기 과정이 반복되는 사이클로 구성됩니다.
➡ 버스트 지속 시간이 짧고 반복이 많다면 빈번한 작업, 지속 시간이 길다면 드문 작업이 됨.
프로세스가 I/O 요청 등의 대기 시간이 생길 때, CPU가 놀게 되는 문제 발생
➡ 이를 해결하기 위해 CPU 이용률을 높여 대기 시간을 최소화하는 스케줄링이 필요함.
➡ 이를 "스케줄링(Scheduling)"이라고 함.
⚠ CPU-I/O 버스트 분포를 잘 분석하여 최적의 스케줄링을 수행해야 함.
운영체제의 핵심 기능 중 하나로, 모든 컴퓨터 자원은 사용되기 전에 스케줄링됨.
운영체제가 준비 큐(Ready Queue) 에 있는 프로세스 중 어떤 프로세스를 실행할지 선택하는 기능을 수행하는 곳
실행 상태 → 대기 상태 (비선점 스케줄링)
실행 상태 → 준비 완료 상태 (선점 스케줄링 가능)
대기 상태 → 준비 완료 상태
프로세스 종료 (비선점 스케줄링)
✔ 프로세스가 종료하거나 대기 상태가 될 때까지 CPU를 점유
✔ Context Switching(문맥 교환)이 적어 오버헤드가 낮음
✔ 하지만, 긴급한 프로세스가 대기해야 하는 단점 발생
✔ 운영체제가 CPU를 강제로 빼앗고 다른 프로세스에 할당 가능
✔ 우선순위가 높은 프로세스를 즉시 실행 가능
✔ 하지만, 빈번한 Context Switching으로 인해 오버헤드 증가
✔ 데이터 일관성이 깨질 수 있는 경쟁 상태(Race Condition) 발생 가능
➡ 현대 운영체제는 대부분 선점 스케줄링을 사용!
CPU 코어의 제어를 CPU 스케줄러가 선택한 프로세스에 제공하는 역할
Context Switching(문맥 교환) 수행
사용자 모드 전환 수행
프로세스 재시작 위치 결정
✔ 하나의 프로세스를 중지하고 다른 프로세스를 실행하는데 걸리는 시간
✔ 최대한 짧아야 함!
✔ CPU 이용률 → CPU를 최대한 바쁘게 유지
✔ 처리량(Throughput) → 단위 시간당 완료된 프로세스 개수
✔ 총 처리 시간 → 프로세스 시작부터 완료까지 걸리는 시간
✔ 대기 시간 → 준비 큐에서 기다린 총 시간
✔ 응답 시간 → 처음 응답이 시작되는 데 걸리는 시간
➡ 이러한 기준을 만족하는 스케줄링 알고리즘이 바람직함.
✔ 준비 큐에서 어떤 프로세스를 CPU에 할당할지 결정하는 알고리즘
✔ 단일 CPU 코어 환경을 가정하여 설명
✔ 프로세스가 CPU를 점유하면 놓아줄 때까지 스케줄링 변경 없음
✔ Context Switching이 적어 오버헤드 최소화 가능
✔ 하지만, 긴급한 프로세스 처리가 어려운 단점 존재
✔ 도착 순서대로 CPU 할당
✔ 단순하고 구현이 쉬움
✔ 하지만, 중요한 작업이 오래 대기하는 문제 발생 (Convoy Effect)
✔ 실행 시간이 가장 짧은 프로세스를 먼저 실행
✔ 평균 대기 시간을 최소화할 수 있는 알고리즘
✔ 하지만 실행 시간을 정확하게 예측하기 어려움
✔ 긴 실행 시간을 가진 프로세스가 계속 대기하는 기아 현상(Starvation) 발생 가능
✔ SJF의 기아 현상을 해결하기 위한 방식
✔ 응답 비율(대기 시간 + 실행 시간 / 실행 시간)이 높은 순서로 실행
✔ 기다린 시간이 길수록 우선순위 상승 (Aging 기법 적용)
✔ 하지만, 계산량이 많아 스케줄링 비용 증가 가능
✔ 프로세스마다 우선순위를 부여하여 실행 순서 결정
✔ 높은 우선순위 프로세스를 먼저 실행 가능
✔ 하지만 기아 현상 발생 가능 (낮은 우선순위 프로세스가 계속 대기)
✔ 해결책 → Aging 기법을 사용하여 대기 시간이 길어지면 우선순위 증가
✔ 운영체제가 CPU를 강제로 할당 변경 가능
✔ 긴급한 프로세스를 빠르게 실행 가능
✔ 하지만, 빈번한 Context Switching으로 인한 오버헤드 증가
✔ SJF를 선점형으로 변경한 방식
✔ 현재 실행 중인 프로세스보다 더 짧은 실행 시간을 가진 프로세스가 도착하면 CPU 양보
✔ 더 높은 우선순위의 프로세스가 도착하면 실행 중인 프로세스를 중단하고 CPU를 할당
✔ 긴급한 작업을 즉시 처리할 수 있음
✔ 하지만, 낮은 우선순위 프로세스가 무한정 대기하는 기아 현상(Starvation) 발생 가능
✔ Aging 기법을 적용하여 해결 가능
✔ 일정 시간(Time Quantum) 동안만 실행 후 다음 프로세스로 교체
✔ 모든 프로세스가 공평하게 CPU를 사용할 수 있도록 보장
✔ Time Quantum이 너무 짧으면 Context Switching이 빈번해져 오버헤드 증가
✔ 너무 길면 FCFS와 다를 바 없음
✔ 여러 개의 대기 큐를 사용하여 프로세스를 그룹으로 나누어 처리
✔ 각 큐는 서로 다른 스케줄링 알고리즘을 적용 가능
✔ 하지만, 한 번 배정된 큐에서 이동 불가 → 기아 현상 발생 가능
✔ CPU 사용 시간에 따라 자동으로 우선순위 조정 가능
✔ 오래 대기한 프로세스를 높은 우선순위 큐로 이동 가능 (Aging 기법 활용)
✔ 우선순위가 낮을수록 Time Quantum 증가
✔ 긴 프로세스는 낮은 우선순위로 이동, 짧은 프로세스는 높은 우선순위 유지
✔ 기아 현상 방지 가능
➡ 현대 운영체제에서는 대부분 MLFQ를 사용! 🚀