프로세스 우선순위와 스케줄링 큐
운영체제가 공정하고 합리적으로 자원을 배분하는 방법 == 스케줄링
정해진 시간 동안 돌아가면서 CPU를 사용하는 것이 가장 좋나? => NO!
프로세스마다 우선순위*가 다르다.
ps -el을 통해 우선순위를 볼 수 있음.
우선순위의 차이를 보이는 대표적인 프로세스 유형
* I/O bound process > CPU bound process

CPU burst, IO burst
IO bound process는 잠깐 실행하고 나면 볼 일이 없음. (거의 바로 대기상태) 그래서 우선순위가 높음.
프로세스 우선순위를 토대로 CPU 할당 받는 방법 == CPU 스케줄링 알고리즘
스케줄링 큐 = '줄'
- 자원은 한정되어 있고 실행 중인 프로세스는 여러 개
- 프로세스들의 요구사항을 일목요연하게 관리하는 방법
스케줄링 큐는 꼭 FIFO는 아님.
대표적인 스케줄링 큐
| 준비 큐 | CPU 이용을 기다리는 프로세스들의 큐 |
| 대기 큐 | 대기 상태 프로세스들의 큐 (입출력 끝 대기) |
한 프로세스 실행 도중 다른 급한 프로세스가 실행되어야 한다면?
*선점형 스케줄링
현재 실행 중인 프로세스의 자원을 빼앗아 해당 프로세스에 할당
[프로세스에 자원을 골고루 할당 가능]
[문맥 교환 과정도 소요가 발생하는데. 오버헤드가 생김.]
*비선점형 스케줄링
현재 실행 중인 프로세스의 실행이 끝날때까지 기다렸다가 프로세스에 할당
[고르지 않은 자원 분배]
[오버헤드가 적음]
CPU 스케줄링 알고리즘
운영체제마다 CPU 스케줄링 알고리즘이 다름.
| 선입 선처리 스케줄링 | (FIFO 스케줄링) CPU를 먼저 요청한 프로세스부터 CPU 할당. [비선점형] |
| 최단 작업 우선 스케줄링 | 준비 큐 프로세스 중 CPU 이용 시간이 짧은 프로세스부터 실행 |
| 라운드 로빈 스케줄링 | 돌아가면서 하겠다. 선입 선처리 + 타임 슬라이싱 준비 큐에 삽입된 순서로 실행하되, 타임 슬라이스만큼만 실행. |
| 최소 잔여 시간 우선 스케줄링 | 최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링 |
| 우선순위 스케줄링 | 프로세스마다 우선순위 부여하고 우선순위 높은 순서로 스케줄링 |
| 다단계 큐 스케줄링 | 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 |
| 다단계 피드백 큐 스케줄링 | 프로세스가 큐 간의 이동 가능 |
리눅스와 스케줄링
| 실시간 정책 스케줄링 (우선순위 높음) | SCHED_FIFO |
| SCHED_RR | |
| 일반 정책 스케줄링 (우선순위 낮음) | SCHED_OTHER/SCHED_NORMAL |
| SCHED_BATCH | |
| SCHED_IDLE |
보통 CFS를 활용함. (Completely Fair Scheduler)
비실시간 프로세스를 대상으로 하는 스케줄링 방식.
vruntime (virtual runtime)
- 프로세스가 그 동안 실행한 시간을 정규화한 정보.
- vruntime이 작은 프로세스를 다음 실행할 프로세스로 삼음.
- vruntime 별 테스크를 고르는 과정에서 RB tree 사용
타임 슬라이스
- nice 값에 비례해 가중치 할당, 가중치를 바탕으로 타임 슬라이스 할당.