CPU 스케줄링 개요
1) 운영체제에서 일어나는 스케줄링
#1 자원에 대한 스케줄링
- 자원에 대한 경쟁이 있는 컴퓨터 시스템 여러 곳에서 발생
#2 다양한 스케줄링
- 작업 스케줄링 : 대기 중인 배치 작업 중 어떤 작업을 메모리에 적재할지
- CPU 스케줄링 : 프로세스/스레드 중에 하난를 선택하여 CPU를 할당하는 스케줄링
- 디스크 스케줄링 : 디스크 장치 내에서 디스크 입출력 요청 중 하나를 선택
- 프린터 스케줄링 : 프린팅 작업 중 하나를 선택하여 프린터 할당
2) 다중프로그래밍과 스케줄링
- CPU의 유휴시간을 줄이기 → CPU 활용률 향사어
- 작업 스케줄링과 CPU 스케줄링 도입
3) CPU burst I/O burst
- cpu burst : 프로그램 실행 중 cpu 연산이 연속적으로 실행하는 상황
- I/O burst : 프로그램 실행중 I/O 장치의 입출력이 이루어지는 상황
- 프로그램의 일반적인 실행 특징
4) CPU 스케줄링
- 실행 준비 상태의 스레드 중 하나를 선택하는 과정
- cpu 활용률 극대화를 통해 컴퓨터 시스템 처리율 향상
#1 CPU 스케줄링의 기준
- cpu 활용률 : 전체 시간 중 cpu 사용 시간 비율
- 처리율 : 단위시간당 처리하는 프로세스의 개수
- 공평성 : 무한정 대기하는 기아 스레드가 생기지 않도록 스케줄, cpu를 스레드들에게 공평하게 배분 ( 시분할 )
- 응답시간 : 대화식 사용자의 경우, 명령에 응답하는데 걸리는 시간
- 대기시간 : 스레드가 준비 큐에서 머무를는 시간
- 소요시간 : 프로세스가 컴퓨터 시스템에 도착한 후 완료될 때까지 걸린 시간
- 시스템 정책 우선 : 컴퓨터 시스템의 특별한 목적을 달성하기 위한 스케줄링
#2 타임 슬라이스
- 대부분 운영체제에서 하나의 스레드가 너무 오래 cpu를 사용하도록 허용 X
- 타임 슬라이스 : 스케줄된 스레드에게 한 번 할당하는 cpu 시간
CPU 스케줄링의 기본
1) CPU 스케줄링이 실행되는 4가지 상황
- 스레드가 시스템 호출 끝에 I/O를 요청하여 블록 ( CPU 활용률 향상 )
- 스레드가 자발적으로 CPU 반환 ( CPU의 자발적 양보 )
- 스레드의 타임 슬라이스가 소진되어 타이머 인터럽트 발생 ( 균등한 CPU 분배 )
- 더 높은 순위의 스레드가 요청한 입출력 작업 완료, 인터럽트 발생 ( 우선 순위를 지키기 위해 )
2) CPU 스케줄링과 디스패치
#1 스케줄링
- 스케줄링 담당하는 커널이나 프로세스가 존재하지 않음
- 스케줄링 코드는 커널 코드의 일부
- 시스템 호출이나 인터럽트 서비스 루틴이 끝나는 마지막 단계에서 실행
#2 디스패쳐
- 컨텍스트 스위칭을 실행하는 커널 코드
- 스케줄러에 의해 선택된 스레드를 cpu가 실행하도록 하는 작업
- 스케줄러와 디스패러 모두 실행 시간이 짧도록 작성
3) 선점 스케줄링과 비선점 스케줄링
#1 선점 스케줄링
- 현재 실행중인 스레드를 강제 중단시키고 다른 스레드 선택, cpu 할당
- 타임 슬라이스가 소진되어 인터럽트가 발생하거나 더 높은 순위의 스레드가 준비 상태일 경우 발생
#2 비선점 스케줄링
- 현재 실행중인 스레드를 강제로 중단시키지 않음
- cpu를 더 이상 사용하지 못하거나 자발적으로 양보할 경우 스케줄링 발생
→ 오늘날 범용 운영체제는 선점 스케줄링 타입 사용
4) 기아와 에이징
#1 기아
- 스레드가 스케줄링에서 선택되지 못한 오랫동안 준비 리스트에 있는 상황
- 우선 순위 기반 시 더 높은 순위의 스레드가 계속 시스템에 들어오는 경우
- 짧은 스레드를 우선 실행 시 자신보다 짧은 스레드가 계속 도착하는 경우
- 스케줄링 알고리즘 설계 시 기아 발생을 면밀히 확인 필요
#2 에이징
- 기아의 해결책으로 스레드가 준비 리스트에 머무를는 시간에 비례하여 스케줄링 순위를 높이는 방법
- 오래 기다릴 수는 있지만 최우선 순위에 도착을 보장함으로써 언젠가는 처리가 될 수 있음을 설계
CPU 스케줄링 알고리즘
1) 기본적인 CPU 스케줄링 알고리즘
- FCFS(First Come First Served) : 도착한 순서대로 스레드를 준비 큐에 넣고 도착한 순서대로 처리
- Shortest Job First : 가장 짧은 스레드 우선 처리
- Shortest Remaining Time First : 남은 시간이 짧은 스레드가 준비 큐에 들어오면 이를 우선 처리
- Round-robin : 스레드들을 돌아가면서 할당된 시간만큼 실행
- Priority Scheduling : 우선 순위를 기반으로 하는 스케줄링
- Multilevel queue scheduling : 스레드와 큐 모두 n개의 우선순위 레벨로 할당하여 큐의 우선순위 → 스레드 우선순위 대로 스케줄링
- Multilevel feedback queue scheduling ; 큐만 n개의 우선순위 레벨을 가지고 스레드 처음 진입시 제일 높은 순위 큐 대기 후 실행 타음 슬라이스가 다할 경우 아래 레벨로 이동
#1 First Come First Served (FCFS)
- 먼저 도착한 스레드 먼저 스케줄링
- 스레드 별 도착시간을 파라미터로 가짐
- 비선점 스케줄링
- 스레드 우선 순위는 없음
- 기아는 발생하지 않는다 (오류로 인한 무한 루프 제외)
- 처리율이 낮으며, 긴 스레드가 cpu를 오래 사용하면 늦게 도착한 짧은 스레드가 오래 대기하는 호위 효과 발생
#2 Shortest Job First (SJF)
- 예상 실행 시간이 가장 짧은 스레드 선택
- 스레드 별 예상 시간을 파라미터로 가짐 (예상 시간을 아는 것이 비현실적)
- 비선점 스케줄링
- 스레드 우선 순위는 없으며 기아는 발생 가능 (긴 스레드는 무한 대기 가능)
- 짧은 스레드가 먼저 실행되어 평균 대기 시간이 최소화
- 실행시간의 예측이 불가능하여 현실에서는 사용이 어려움
#3 Shortest Remaining Time First (SRTF)
- 남은 실행 시간이 가장 짧은 스레드 선택
- SJF 알고리즘의 선점 스케줄링 버전
- 스레드 별 예상 실행 시간과 남은 실행 시간 값
- 선점 스케줄링
- 스레드 우선 순위는 없으며 기아는 발생 가능 (긴 스레드는 무한 대기 가능)
- SJF와 마찬가지로 실행 시간의 예측이 불가능하여 현실에서는 사용이 어려움
#4 Round Robin (RR)
- 공평한 실행 기회를 위해 타임 슬라이스를 주기로 돌아가면서 선택
- 타임 슬라이스를 파라미터로 가짐
- 선점 스케줄링
- 스레드 우선 순위는 없으며, 기아도 없음
- 공평하고 기아가 없으며 구현이 쉽다
- 하지만 잦은 스케줄링으로 스케줄링 오버헤드가 큼
- → 타임 슬라이스가 크면 FCFS 작을 경우 SJF/SRTF와 비슷
#5 Priority 스케줄링
- 우선순위에 따라 준비 큐에 삽입하고 스레드 실행
- 스레드 별 고정 우선 순위
- 스케줄링 타입은 둘 다 가능
- 비선점 경우 : 현재 실행 중인 스레드가 종료될 때만 스케줄링
- 선점 경우 : 실행 중인 스레드보다 더 높은 우선 순위의 스레드 도착 시 현재 스레드를 중단 후 스케줄링
- 스레드 우선 순위가 있으며 기아 발생 가능 (낮은 우선 순위의 스레드가 무한 대기 가능)
- 스레드 별 고정 우선 순위를 가지는 실시간 시스템에서 사용
#6 Multi-level Queue 스케줄링
- 스레드들을 n개의 우선순위 레벨로 구분, 레벨이 높은 스레드들을 우선적으로 처리
- 알고리즘
- 고정된 n개의 큐 사용, 각 큐의 고정된 우선 순위 할당
- 스레드들의 우선 순위도 n개의 레벨로 분류
- 각 큐마다 스케줄링 기법 사용
- 스레드 도착 시 우선 순위로 해당 레벨 큐에 삽입되며 다른 큐로 이동 불가
- 가장 높은 순위의 큐가 빌 때, 다음 순위의 큐에서 스케줄링
- 스레드의 고정 우선 순위가 파라미터
- 비선점/선점 모두 가능 : 높은 레벨의 큐에 스레드가 도착 시 중단 여부로 달라짐
- 스레드 우선 순위는 있으며 기아는 발생 가능 (낮은 우선 순위의 스레드가 무한 대기 가능)
- 스레드의 고정 순위를 가진 시스템에서 활용
#7 Multi-level Feedback Queue (MLFQ) 스케줄링
- 기아를 없애기 위해 여러 레벨 큐 사이에 스레드 이동 가능하도록 설계
- 짧은 스레드, I/O가 많은 스레드, 대화식 스레드를 우선 처리하여 평균 대기 시간을 줄일 수 있음
- 알고리즘
- 스레드는 도착 시 최상위 레벨 큐로 삽입
- 가장 높은 레벨의 큐에서 스레드를 선택하며 비어있을 경우 그 아래 큐에서 선택
- 스레드의 CPU-burst가 큐 타임 슬라이스를 초과하면 아래 큐로 이동
- 자발적으로 중단 시 현재 큐 끝에 다시 삽입
- I/O로 실행 중단 시 현재 큐 끝에 다시 삽입
- 큐에 있는 시간이 오래되면 기아를 막기위해 하나 위의 레벨 큐로 이동
- 최하위 레벨 큐는 FCFS나 긴 타임 슬라이스의 RR 스케줄링 사용하며 최하위 큐에 존재하는 스레드들은 다른 큐로 이동 불가
- 각 큐의 큐 시간 할당량이 파라미터
- 선점 스케줄링
- 스레드의 우선 순위는 없으며 에이징 기법을 통해 기아 발생을 막음
멀티 코어 CPU에서의 스케줄링
1) 멀티 코어 시스템에서의 cpu 스케줄링
- 싱글 코어 cpu 스케줄링을 멀티 코어 시스템에서 사용할 경우
- → 컨텍스트 스위칭 오버헤드 증가 → CPU 친화성 적용
- → 코어 별 부하 불균형 문제 → 부하 균등화 기법 (푸시 / 풀 마이그레이션 )
#1 CPU 친화성
- 스레드를 동일한 코어에서만 실행하도록 스케줄링
- 코어 친화성, CPU pinning, 캐시 친화성으로도 부름
#2 푸시/풀 마이그레이션
- 코어 별 부하를 균등하게 나누는 기법
- 푸시 마이그레이션 : 감시 스레드가 짧거나 빈 큐를 가진 코어에 다른 큐의 스레드를 옮겨놓는 기법
- 풀 마이그레이션 : 코어가 처리할 스레드가 없게되면, 다른 코어의 스레드 큐에서 자신이 큐에 가져와 실행
'Computer Science > Operating System' 카테고리의 다른 글
[운영체제] 스레드 동기화 (0) | 2023.07.16 |
---|---|
First Come First Served (FCFS) 구현 (0) | 2023.07.11 |
[운영체제] 스레드와 멀티스레딩 (0) | 2023.07.10 |
[운영체제] 프로세스와 프로세스 관리 (1) | 2023.07.09 |
[운영체제] 컴퓨터 시스템과 운영체제 (0) | 2023.07.08 |