IT 공부/운영체제
6-2. CPU 스케줄링 기본
unnimm
2023. 4. 13. 12:46
CPU 스케줄링이 실행되는 4가지 상황
1. 스레드가 시스템 호출 끝에 I/O를 요청하여 블록될 때
- 스레드를 블록 상태로 만들고 스케줄링
- CPU 활용률 향상 목적
2. 스레드가 자발적으로 CPU를 반환할 때
- yield() 시스템 호출 등을 통해 스레드가 자발적으로 CPU 반환
- 커널은 현재 스레드를 준비 리스트에 넣고, 새로운 스레드 선택
- CPU의 자발적 양보
3. 스레드의 타임 슬라이스가 소진되어 타이머 인터럽트 발생
- 균등한 CPU 분배 목적
4. 더 높은 순위의 스레드가 요청한 입출력 작업 완료, 인터럽트 발생
- 인터럽트 서비스 루틴에서 현재 스레드를 강제 중단시켜 준비 리스트에 넣고
- 높은 순위의 스레드를 깨워 스케줄링
- 우선순위를 지키기 위한 목적
CPU 스케줄링 코드의 위치와 실행 시점
- 스케줄링 담당하는 커널 스레드나 프로세스가 있는가? 없다.
- 스케줄링 코드는 어디에 위치하는가? 커널 내 함수로
- 스케줄링 코드는 커널 코드의 일부
- 별도로 실행되는 프로세스나 스레드의 형태가 아니다.
- 커널은 마치 응용프로그램을 컴파일(빌드)하여 완성한 바이너리 모듈 같다. 메모리에 그대로 적재되는 한 덩어리의 바이너리
- 스케줄링 코드가 실행되는 시점
- 시스템 호출이나 인터럽트 서비스 루틴이 끝나는 마지막 단계에서 실행
- 디스패쳐(dispatcher) 코드 실행
- 디스패쳐 코드란 컨텍스트 스위칭을 실행하는 커널 코드
- 스케줄러에 의해 선택된 스레드를 CPU가 실행하도록 하는 작업
- 커널 모드에서 사용자 모드로 전환
- 새로 선택된 스레드가 이전에 중단된 곳에서 실행하도록 점프
- 스케줄러와 디스패쳐 모두 실행 시간이 짧도록 작성
- 디스패쳐 코드란 컨텍스트 스위칭을 실행하는 커널 코드
CPU 스케줄링과 디스패치(dispatch)

선점 스케줄링과 비선점 스케줄링
실행중인 스레드의 강제 중단 여부에 따른 CPU 스케줄링 타입
- 비선점 스케줄링(non-preemptive scheduling)
- 현재 실행중인 스레드를 강제로 중단시키지 않는 타입
- 일단 스레드가 CPU를 할당 받아 실행을 시작하면, 완료되거나 CPU를 더 이상 사용할 수 없는 상황이 될 때까지 스레드 강제 중단시키지 않고 스케줄링도 하지 않는 방식
- 스케줄링 시점
- CPU를 더 이상 사용할 수 없게 된 경우 : I/O로 인한 블록 상태, sleep
- 자발적으로 CPU 양보할 때
- 실행 중 종료될 때
- 현재 실행중인 스레드를 강제로 중단시키지 않는 타입
- 선점 스케줄링(preemptive sheduling)
- 현재 실행중인 스레드를 강제 중단시키고 다른 스레드 선택, CPU 할당
- 스케줄링 시점
- 타임슬라이스가 소진되어 타이머 인터럽트가 발생될 때
- 인터럽트나 시스템 호출 종료 시점에서, 더 높은 순위의 스레드가 준비 상태일 때
오늘날 범용 운영체제
- 선점 스케줄링 타입 사용

기아와 에이징
기아
- 스레드가 스케줄링에서 선택되지 못한 채 오랫 동안 준비 리스트에 있는 상황
- 사례
- 우선순위를 기반으로 하는 시스템에서, 더 높은 순위의 스레드가 계속 시스템에 들어오는 경우
- 짧은 스레드를 우선 실행시키는 시스템에서, 자신보다 짧은 스레드가 계속 도착하는 경우
- 스케줄링 알고리즘 설계 시 기아 발생을 면밀히 평가
- 기아가 발생하지 않도록 설계하는 것이 바람직함.
에이징(aging)
- 기아의 해결책
- 스레드가 준비 리스트에 머무르는 시간에 비례하여 스케줄링 순위를 높이는 기법
- 오래 기다릴 수는 있지만 언젠가는 가장 높은 순위에 도달하는 것을 보장