CPU 스케줄링은 준비 상태(Ready)에 있는 스레드들 중 하나를 선택하여 CPU를 할당하는 과정이다.
오늘날 CPU 스케줄링은 준비 상태의 스레드 중 하나를 선택하는 스레드 스케줄링이다.
스케줄링은 왜 필요한가?
자원에 대한 경쟁
자원: CPU, 디스크, 프린트, 파일, 데이터베이스 등
컴퓨터 시스템 내 다양한 스케줄링
작업(job) 스케줄링
CPU 스케줄링
디스크 스케줄링
프린터 스케줄링
다중 프로그래밍의 목적:
다중 프로그래밍은 여러 프로그램(프로세스)을 메모리에 동시에 올려놓고 실행하는 방식이다.
이를 통해 CPU의 유휴 시간을 줄이고, CPU 활용률을 높이는 것이 주요 목적이다.
두 가지 스케줄링 기법:
작업 스케줄링 (Job Scheduling): 작업들을 메모리에 올리고 CPU에서 실행할 준비가 된 프로그램을 선정하는 과정이다. 작업 스케줄링은 CPU가 실행할 작업을 선택한다.
CPU 스케줄링 (CPU Scheduling): 이미 메모리에 올라와 있는 프로세스들 중에서 어떤 프로세스가 CPU를 사용할지 결정하는 과정이다.
다중 프로그래밍 운영 체제의 구조:
다중 프로그래밍에서는 여러 프로세스가 메모리에 상주하고 있으며, CPU는 이 프로세스들 사이에서 스케줄링을 통해 교대로 처리하게 된다.
작업들은 입출력 대기 중이나 다른 자원에 의해 대기하는 동안 다른 작업들이 CPU를 사용할 수 있도록 스케줄링된다.

프로그램의 실행 특성:
CPU burst(연산 작업): 프로세스가 CPU에서 집중적으로 계산을 수행하는 구간을 의미한다.
I/O burst(입출력 작업): 프로세스가 I/O 작업을 기다리거나 수행하는 구간을 의미한다.
CPU burst와 I/O burst가 교대로 나타나며, 이를 반복하면서 프로세스는 실행된다.
두 가지 프로세스의 실행 패턴:
(a) CPU 집중 프로세스: CPU를 많이 사용하는 작업으로, CPU burst가 길게 지속되고 I/O 작업은 적은 시간이 소요된다.
(b) I/O 집중 프로세스: I/O 작업이 많아 CPU burst는 짧고, I/O burst가 상대적으로 긴 시간이 소요된다.

기본 목표:
CPU 활용률(CPU utilization):
처리율(throughput):
공평성(fairness):
응답 시간(response time):
대기 시간(waiting time):
소요 시간(turnaround time):
시스템 정책(policy enforcement):
자원 활용률(resource efficiency):
타임 슬라이스 개념:
타임 슬라이스와 스케줄링:
타임 슬라이스란 스케줄된 스레드에게 한 번 할당되는 CPU 사용 시간이다.
커널은 이 타임 슬라이스를 기반으로 스케줄링을 단행하며, 일정한 주기로 CPU에서 스레드를 교체한다.
타임 슬라이스는 흔히 타임 퀀텀(time quantum)이나 타임 슬롯(time slot)이라고도 불린다.
타임 슬라이스 목적:
시스템 호출 끝에 I/O를 요청하여 블록될 때
스레드가 자발적으로 CPU를 반납할 때
yield()와 같은 시스템 호출을 통해 스레드가 자발적으로 CPU를 양보할 때 스케줄링이 발생한다.타임 슬라이스가 소진되어 타이머 인터럽트가 발생할 때
더 높은 우선순위 스레드가 요청한 작업 완료 후, 인터럽트 발생할 때
CPU 스케줄링 코드의 위치와 실행 시점
디스패처(dispatcher) 코드 실행
스케줄러와 디스패처의 실행 시간

CPU 스케줄링과 디스패치(dispatch) 과정에서 스레드 A에서 스레드 B로 스위칭이 발생하는 과정
인터럽트 발생
스레드 A가 양보
yield() 호출), I/O 작업이 완료되면 스케줄러가 새로운 스레드를 선택하는 과정을 시작한다.스케줄러 코드 실행
디스패처 코드 실행
스레드 B 실행
비선점 스케줄링(non-preemptive scheduling):
스레드가 자발적으로 CPU를 반환할 때까지 실행이 강제 종료되지 않는다. 즉, 스레드는 자신이 CPU에서 작업을 마칠 때까지 실행된다.
선점 스케줄링(preemptive scheduling):
실행 중인 스레드가 시스템에 의해 강제로 중단되고 다른 스레드가 CPU를 사용할 수 있도록 스케줄링된다. 타이머 인터럽트나 I/O 인터럽트 등의 이벤트가 발생하면 스레드가 중지되고 다른 스레드가 실행될 수 있다.
오늘날의 운영체제:

T1 스레드가 CPU를 점유한 상태에서 I/O 작업이 발생하면, T1은 I/O blocked 상태가 되어 CPU에서 물러난다.
그 후, T1이 I/O 완료 시점에 다시 ready 상태가 되면 CPU를 점유해 작업을 마친다.
T2 스레드는 T1이 CPU에서 물러난 뒤 비로소 실행된다.
스레드 간의 자발적 양보가 없으며, 스레드가 자발적으로 CPU를 반납하지 않으면 다른 스레드는 실행되지 않는다.
각 스레드는 타임슬라이스에 따라 주기적으로 CPU를 할당받고, 할당 시간이 끝나면 다른 스레드가 CPU를 점유한다.
T1 스레드가 I/O 작업으로 blocked 상태가 되면 다른 스레드가 CPU를 사용한다.
yield() 호출과 같은 시스템 호출을 통해 자발적으로 CPU를 반환할 수 있다.
타임슬라이스 덕분에 T1, T2, T3 스레드 모두 번갈아 가며 CPU를 사용하게 되어 처리 속도와 자원 분배가 더 효율적이다.
정의: 스레드가 스케줄링에서 선택되지 못하고 오래 준비 큐에 머무르는 상태를 말한다.
사례:
정의: 기아 문제를 해결하기 위한 기법이다. 스레드가 준비 큐에 오래 머물수록 스케줄링 순위를 점차 높이는 방법을 말한다.
목적: 기아 문제를 방지하여 모든 스레드가 일정 시간이 지나면 CPU를 사용할 수 있도록 보장한다.
FCFS (First Come First Served)
SJF (Shortest Job First)
SRTF (Shortest Remaining Time First)
Round-Robin
Priority Scheduling
Multilevel Queue Scheduling
Multilevel Feedback Queue Scheduling
알고리즘: 큐에 먼저 도착한 스레드를 먼저 스케줄링한다.
스케줄링 파라미터: 스레드 별 큐 도착 시간이 기준이 된다.
스케줄링 타입: 비선점 스케줄링 방식으로, 한 번 CPU를 차지한 스레드는 작업이 완료될 때까지 계속 CPU를 사용한다.
스레드 우선순위: ❌
기아(starvation): 발생 ❌

알고리즘: 가장 짧은 실행 시간을 가진 스레드를 먼저 스케줄링한다.
스케줄링 파라미터: 스레드 별 예상 실행 시간
스케줄링 타입: 비선점 스케줄링 방식
스레드 우선순위: ❌
기아(starvation): 발생 가능
성능 이슈: 평균 대기 시간을 최소화하는 장점이 있다.
문제점: 실행 시간 예측이 불가능하므로 현실적으로 거의 사용되지 않는다.

알고리즘: SJF의 선점 스케줄링 버전으로, 실행 시간이 더 짧은 스레드가 도착하면 현재 실행 중인 스레드를 중단하고 짧은 스레드를 실행한다.
스케줄링 파라미터: 스레드 별 예상 실행 시간과 남은 실행 시간
스케줄링 타입: 선점 스케줄링 방식으로, 더 짧은 실행 시간이 남은 스레드가 도착하면 현재 스레드를 중단시킨다.
스레드 우선순위: ❌
기아(starvation): 발생 가능
성능 이슈: 평균 대기 시간을 최소화하는 장점이 있다.
문제점: 실행 시간 예측이 불가능하므로 현실에서는 거의 사용되지 않는다.

알고리즘: 모든 스레드에 동일한 시간 할당량(time slice)을 부여하여 순차적으로 CPU를 할당하는 방식이다.
스케줄링 파라미터: 타임 슬라이스
스케줄링 타입: 선점 스케줄링 방식으로, 각 스레드가 지정된 시간 동안만 CPU를 사용하고 그 이후에는 다른 스레드로 교체된다.
스레드 우선순위: ❌
기아(starvation): ❌
성능 이슈:


| 비교 항목 | 타임 슬라이스 = 1ms | 타임 슬라이스 = 2ms |
|---|---|---|
| 평균 대기 시간 | 3.25ms | 3ms |
| 스케줄링 횟수 | 10번 | 6번 |
| 컨텍스트 스위칭 횟수 | 9번 | 5번 |
| 오버헤드 | 큼 (컨텍스트 스위칭 많음) | 적음 (컨텍스트 스위칭 적음) |
| 짧은 작업 처리 속도 | 빠름 | 다소 느림 |
| 긴 작업 처리 속도 | 보통 | 상대적으로 빠름 |
| CPU 효율성 | 낮음 (컨텍스트 스위칭 과다) | 높음 (스위칭 적음) |
알고리즘: 모든 스레드에 고정 우선순위가 할당되며, 작업이 종료될 때까지 우선순위가 변경되지 않는다. 우선순위 순서로 큐에 삽입된다.
스케줄링 파라미터: 스레드별 고정 우선순위
스케줄링 타입: 선점 스케줄링/비선점 스케줄링 모두 가능
스레드 우선순위: ⭕
기아(starvation): 발생 가능. 에이징(aging) 기법으로 해결할 수 있다.
성능 이슈: 높은 우선순위의 스레드일수록 대기 시간이나 응답 시간이 짧아진다.
특징: 스레드별로 고정된 우선순위를 가지는 시스템에서 사용된다.
알고리즘: 각 큐는 나름대로의 기준을 바탕으로 스케줄링한다. 여러 개의 큐가 서로 다른 우선순위를 가지며, 각 큐는 독립적으로 스케줄링된다.
스케줄링 파라미터: 스레드별 고정 우선순위
스케줄링 타입: 비선점/선점 스케줄링 모두 가능
스레드 우선순위: ⭕
기아(starvation): ⭕
성능 이슈 및 활용 사례:

설계 의도: 기아 문제를 없애기 위해 여러 레벨의 큐 사이에서 스레드가 이동할 수 있도록 설계되었다. 짧은 스레드와 I/O 작업이 많은 스레드, 대화식 스레드의 우선 처리로 스레드 평균 대기시간을 줄인다.
n개의 레벨 큐: 큐마다 서로 다른 스케줄링 알고리즘을 적용하며, 낮은 레벨의 큐일수록 긴 타임 슬라이스를 사용한다.
알고리즘:
스케줄링 파라미터: 각 큐의 타임 슬라이스
스케줄링 타입: 선점 스케줄링
스레드 우선순위: ❌
기아(starvation): 발생하지 않음. 에이징(aging) 기법으로 해결.
성능 이슈: 짧거나 I/O 작업이 많은 스레드는 높은 레벨의 큐에서 우선 실행된다. CPU 활용률이 높음.

(a) 스레드 도착: 스레드가 시스템에 도착하면 가장 높은 우선순위를 가진 레벨 4 큐에 삽입된다. 타임 슬라이스는 4ms로 설정된다.
(b) 레벨 4 큐에 삽입: 스레드는 레벨 4 큐에 배치되어 CPU 할당을 대기한다.
(c) 스레드 실행: 스레드는 CPU를 차지하고 레벨 4 큐에서 4ms 동안 실행된다. 이 때, 스레드가 계속 실행될 필요가 있다면 타임 슬라이스가 종료되면서 레벨이 변경된다.
(d) 레벨 3 큐로 이동: 4ms의 타임 슬라이스가 끝난 후 스레드는 레벨 3 큐로 이동된다. 레벨 3의 타임 슬라이스는 6ms로 설정된다.
(e) 스레드 실행: 스레드는 레벨 3 큐에서 다시 CPU를 할당받고 6ms 동안 실행된다.
(f) I/O 완료 후 큐에 다시 삽입: 스레드가 I/O 작업을 완료한 후 다시 레벨 3 큐에 삽입된다. 이 때 CPU 버스트가 다시 발생하면 우선 레벨 3 큐의 끝에 삽입된다.
(g) 스레드 실행 (레벨 3): 스레드는 레벨 3에서 6ms 동안 실행된다.
(h) 레벨 2 큐로 이동: 6ms의 타임 슬라이스가 끝나면 스레드는 레벨 2 큐로 이동된다. 레벨 2의 타임 슬라이스는 8ms이다.
(i) 스레드 실행: 스레드는 레벨 2 큐에서 다시 실행된다.



멀티 코어 구성:
멀티스레딩 처리:
프로세스와 코어의 매핑:
컨텍스트 스위칭 후 오버헤드 문제:
컨텍스트 스위칭 후 오버헤드 문제 해결 :
CPU 친화성(CPU affinity)을 적용하여, 스레드를 동일한 코어에서만 실행하도록 한다. 이는 캐시 친화성(cache affinity)과 코어 친화성(core affinity)을 고려한 방식으로, 스레드가 자주 실행되는 코어에서 반복 실행됨으로써 캐시 미스가 줄어든다.코어별 부하 불균형 문제:
코어별 부하 불균형 문제 해결:
