[운영체제] 5장 CPU 스케줄링
CPU 스케줄링
1. CPU 스케줄링 개요
CPU 스케줄링은 준비 상태의 스레드 중 하나를 선택하는 스레드 스케줄링이다
- 자원에 대한 경쟁이 있는 곳에서 경쟁자 중 하나 선택
1.1 다중프로그래밍과 스케줄링
- 작업(JOB) 스케줄링
- 대기중인 job 중에 메모리에 적재할 작업 결정
- CPU 스케줄링
프로세스/스레드 중 에 하나를 선택하여 CPU 할당
※ 디스크 스케줄링 (12장에서 공부) - 디스크 입출력 요청 중 하나 선택
※ 다중 프로그래밍의 도입 목적 - CPU 유휴 시간 줄여 CPU 활용율 향상 목적
1.2 CPU burst와 I/O burst
- CPU가 코드를 집중적으로 실행하는 상황을 CPU burst라고 부르고 이 시간을 CPU burst 시간이라고 한다. 그리고 I/O 장치에 의해 입출력이 이루어지는 상황을 I/O burst
1.3 cpu 스케줄링의 기본 목표
- CPU 스케줄링 - Ready 상태 스레드 중 하나 선택하는 과정
- CPU 활용률 향상 -> 컴퓨터 시스템 처리율 향상
※ 컴퓨터 시스템 마다 목표가 다를 수 있다.
1.4 CPU 스케줄링의 기준(criteria)
- CPU 활용률 - 가동시간 중 CPU 사용시간의 비율
- 처리율 - 단위 시간 당 처리한 스레드 수
- 공평성 - CPU 시간 공평하게 배분하는 것
- 응답시간 - 대화식 사용자, 사용자에 대한 응답시간
- 대기 시간 - Reday 큐에서 대기하는 시간 (CPU 할당까지)
- 소요 시간 - 시스템에 진입하고 완료까지 걸린 시간
- 시스템 정책 우선 - 특별한 목적 달성을 위함
- 실시간 시스템 - 스레드가 완료 시한내에 이루어지도록
- 급여 시스템 - 안전을 관리하는 스레드 우선
- 자원 활용율 - 자원의 활용률 ↑
1 .5 CPU 스케줄링과 타임 슬라이스
- 하나의 스레드가 너무 오래 CPU를 사용하지 않도록
타임 슬라이스
- 스케줄된 스레드에게 한 번 할당하는 CPU 시간
- 커널이 스케줄을 단행하는 주기 시간
- 타임 퀀텀, 타임 슬롯이라고도 함
2. CPU 스케줄링 기본
2.1 CPU 스케줄링이 실행되는 4가지 상황
2.1.1 시스템 호출 끝에 I/O 요청하여 Blocked될 때 - 시스템 호출
- Blocked 상태로 만들고 스케줄링
- CPU 활용률 향상 목적
2.1.2 스레드가 자발적으로 CPU 반환할 때 - 시스템 호출
- yield() 시스템 호출 등을 통해 자발적으로 CPU 반환
- Running -> Ready 후 스케줄링
- CPU 자발적 양보
2.1.3 타임 슬라이스가 소진되어 타이머 인터럽트 발생
- 균등한 CPU 분배의 목적
2.1.4 더 높은 스레드가 요청한 입출력 작업 완료 - 인터럽트
- 현재 스레드 강제 중단시키고 준비 리스트
- 높은 순위의 스레드 깨워서 스케줄링
- 우선순위 지키기 위한 목적
2.2 CPU 스케줄링과 디스패치(dispatch)
※ 스케줄러 코드는 커널에 함수 형태로 존재로 시스템 호출/ISR 끝나는 마지막 단계에서 실행
- 디스패처 코드 - 컨텍스트 스위칭 실행
- 스케줄러 코드에 의해 선택된 스레드를 CPU가 실행하도록 하는 커널 코드의 한 부분이다.
디스패처 코드나 스케줄러 코드는 실행 시간이 가능한 짧도록 작성되어야 한다.
-> 스케줄러 오버헤드
2.3 스케줄링 타입 : 선점 스케줄링과 비선점 스케줄링
비선점 스케줄링 : 현재 실행중인 스레드 강제 중단 X
- CPU 더 이상 사용 불가 (I/O Block, or Sleep)
- 자발적으로 CPU 양보
- 종료할 때
선점 스케줄링 : 현재 실행중인 스레드 강제 중단 O
- 타임 슬라이스 소진으로 인한 인터럽트
- 인터럽트 OR 시스템 호출 시 더 높은 순위 스레드가 READY 상태일 때
※ 범용 운영체제에서 대부분 선점 스케줄링
2.4 기아와 에이징
기아 - Ready 상태에서 오랜 동안 선택되지 못한 스레드
- 우선순위 기반 시스템에서
- 짧은 스레드 우선 실행에서
기아 발생을 방지하는 것이 바람직함
에이징 - 기아의 해결책
- Ready 리스트에 머무는 시간에 비례하여 우선 순위 ↑(실행보장)
3. 다양한 CPU 스케줄링 알고리즘
3.1 FCFS 스케줄링
- 알고리즘 : 먼저 도착한 스레드 먼저 스케줄링
- 스케줄링 파라미터 : 스레드 도착 시간
- 스케줄링 타입 : 비선점 스케줄링
- 스레드 우선 순위 : 없음
- 기아 : 발생하지 않음
- 성능 - 처리율 낮음
- 호위 효과 - 늦게 도착한 스레드 오래 대기
※ 대기 시간이 짧다 -> 각 스레드의 응답시간이 짧다
3.2 SJF(Shortest Job First) 스케줄링
- 알고리즘 : 최단 작업 우선 스케줄링
- 실행 시간 가장 짧은 스레드
- 도착 시 짧은 순으로 큐에 삽입
- 스케줄링 파라미터 : 스레드 별 예상 실행 시간
- 실행 시간 추정 불가능
- 스케줄링 타입 : 비선점 스케줄링
- 스레드 우선 순위 : 없음
- 기아 : 발생 가능
- 짧은 스레드 계속 도착하면 실행 보장 X
성능 이슈 : 짧은 스레드 먼저 실행 -> 대기 시간 최소화
- 문제점 : 실행 시간 예측 불가 -> 사용 안함
3.3 SRTF(Shortest Remaining Time First) 스케줄링
- 알고리즘 : 최소 잔여 시간 우선 스케줄링
- 남은 시간이 짧은 스레드 우선 실행 (SJF의 선점 스케줄링 버전)
- 스케줄링 파라미터 : 스레드 별 예상 실행 시간 (알 수 없음)
- 스케줄링 타입 : 선점 스케줄링 (강제 중단 O)
- 스케줄링 우선순위 : 없음
- 기아 : 발생 가능 - (SJF의 문제와 일맥상통)
- 성능 이슈 : 실행 시간 기준으로 하여 평균 대기 시간 최소화
3.4 RR(Round-Robin) 스케줄링
- 알고리즘 : 공평한 실행 기회를 주기 위해
- 큐에 대기중인 스레드들을 타임 슬라이스 주기로
- 타임 슬라이스 소진 시 큐 마지막으로
- 스케줄링 파라미터 : 타임 슬라이스
- 스케줄링 타입 : 선점 스케줄링
- 스케줄링 우선순위 : 없음
- 기아 : 없음 (슬라이스 정해져 있어 실행 보장)
- 성능 이슈 : 공평, 기아 x, 구현 쉬움
- 스케줄링이 잦음 - 스케줄링 오버헤드 (스케줄링, 디스패치) -> 타임 슬라이스 작으면 극대화
- 균형된 처리율 : 타임 슬라이스 크면 - FCFS / 작으면 - SJF, SRTF
※ 늦게 도착한 짧은 스레드 FCFS보다 빨리 완료 / 긴 스레드는 SJF보다 빨리 완료
• 평균 대기 시간: (3 + 4 + 2 + 3)/4 = 3ms • 스케줄링 횟수: 6번 • 컨텍스트 스위칭 횟수: 5번 | • 평균 대기 시간: (5 + 4 + 1 + 3)/4 = 13/4 = 3.25ms • 스케줄링 횟수: 10번 • 컨텍스트 스위칭 횟수: 9번 |
※ 대기 시간 + (스케줄링 + 컨텍스트 스위칭 시간)
3.5 Priority 스케줄링
- 알고리즘 : 우선 순위에 따라 스레드 실행
- 모든 스레드에 고정 우선순위 할당
- 스케줄링 파라미터 : 스레드 별 고정 우선 순위
- 스케줄링 타입 : 선점/비선점 스케줄링
- 선점 스케줄링 : 더 높은 순위의 스레드 도착 시 현재 스레드 강제 종료
- 비선점 선점 스케줄링 : 현재 실행 중인 스레드 종료 시 스케줄링
- 스케줄링 우선순위 : 있음
- 기아 : 발생 가능
- 높은 우선 순위 계속 도착 시
- 에이징 기법으로 해결 가능
- 성능 이슈 - 우선 순위 ↑ 대기, 응답 시간 ↓
- 특징 - 스레드 별 고정 우선 순위 가지는 실시간 운영체제에서 사용
3.6 MLQ (Multi-level Queue) 스케줄링
- 알고리즘 :
- 고정된 n 개의 큐에 우선 순위 별로 분류하고 스케줄링
- 다른 큐로 옮길 수 없으며, 높은 우선 순위 큐가 비면 다음 우선 순위 큐에서 스케줄링
- 스케줄링 파라미터 : 스레드의 고정 우선 순위
- 스케줄링 타입 : 선점/비선점 스케줄링
- 스케줄링 우선순위 : 있음
- 기아 : 발생 가능
- 높은 우선 순위 큐가 먼저 스케줄링 되기 때문에
- 성능 이슈 : 스레드의 고정 순위를 가진 시스템에서 활용
- 전체 스레드를 백그라운드, 포그라운드 스레드의 2개의 그룹으로 구성
- 시스템 스레드, 대화식 스레드, 배치 스레드 등 3개의 레벨로 나누고 …
3.7 MLFQ(Multi-level Feedback Queue) 스케줄링
- 설계 의도 : MLQ의 기아 없애기 위해 레벨 큐 스레드 이동 가능하도록
- 짧은 스레드, I/O 많은 스레드, 대화식 스레드 우선 처리 -> 평균 대기 시간 줄임
- 알고리즘 : (I/O Burst(대화식) 높은 우선 순위 가지게 됨)
- 도착하면 가장 높은 레벨 큐에 삽입
- 가장 높은 큐에서부터 실행 -> 타임 슬라이스 넘으면 Low Level Queue로
- yeild or interrupt -> 동일 큐로 다시 삽입
- Low level Queue에서 대기 ↑ -> Higher Level Queue로 이동
- 최하위는 FCFS or Long Time Slice Round Robin
- 스케줄링 파라미터 : 각 큐의 큐 타임 슬라이스
- 스케줄링 타입 : 선점 스케줄링
- 스케줄링 우선순위 : 없음
- 기아 : 발생하지 않음 (에이징)
- 성능 이슈 : 짧거나 I/O Burst 빨리 실행 -> CPU 활용률 높음
T1의 대기 시간=3 + 2 = 5ms T2의 대기 시간=1 + 6 + 6 = 13ms T3의 대기 시간=3 + 4 + 6 = 13ms 평균 대기 시간=(5ms + 13ms + 13ms)/3 = 31ms/3 = 10.3ms |
4. 멀티 코어 CPU에서의 스케줄링
4.1 멀티코어 CPU와 병렬처리
| |
| | :———————————————————-: | :———————————————————-: |
4.2 멀티 코어 시스템에서 CPU 스케줄링과 작업 분배
실글 코어 CPU 스케줄링 기법을 멀티 코어 CPU에 사용하면
- 컨텍스트 스위칭 후 오버헤드 증가
- 코어별 부하 불균형
컨텍스트 스위칭 후 오버헤드 - CPU(코어) 친화성으로 해결
- 스레드를 동일한 코어에서 실행하도록 스케줄링
- 코어 친화성, CPU 피닝, 캐시 친화성
코어별 부하 불균형 - 부하 균등화 기법으로 해결
- 푸시 마이그레이션 기법
- 감시 스레드가 짧거나 빈 큐를 가진 코어에 다른 큐의 스레드 옮김
- 풀 마이그레이션
- 처리할 스레드가 없으면 다른 코어의 큐에서 스레드 가져옴
This post is licensed under CC BY 4.0 by the author.