Skip to content
Go back

[OSTEP]Virtualization-CPU 스케줄링

Edit page

CPU 스케줄링

CPU는 각 프로세스를 어떻게 효율적이게 선택해서 실행하게 할 것인가. OS는 스케줄링 알고리즘을 통해 효율적이게 프로세스를 실행시킨다.

효율적인 스케줄링

그렇다면 효율적인 스케줄링임을 정의하는 메트릭스는 무엇인가. 크게 2가지를 나타내고 있다.

프로세스가 빨리 끝나는 것(반환 시간), 프로세스가 얼마나 빨리 사용자에게 피드백을 주는지(응답 시간) 이렇게 2가지가 주 된 평가 메트릭이 된다.

그럼 각 메트릭을 고려한 스케줄링 알고리즘과 그 외에 대해서 설명하겠다.

FIFO

선입선출 방식으로 자료구조의 Queue와 비슷하게 동작한다.

예시

프로세스 A(100ms), B(10ms), C(10ms)가 순서대로 도착했다고 가정:

시간: 0    10   20   30   40   50   60   70   80   90   100  110  120
     |----A(100ms)------------------------------------|B(10)|C(10)|

장점

단점

SJF(Shortest Job First)

가장 짧은 작업시간을 가진 프로세스를 실행 시킨다.

예시

프로세스 A(100ms), B(10ms), C(10ms)가 동시에 도착했다고 가정:

시간: 0    10   20   30   40   50   60   70   80   90   100  110  120
     |B(10)|C(10)|----A(100ms)------------------------------------|

장점

단점

STCF(Shortest Time-To-Completion First)

선점형(preemptive) 방식으로, 남은 작업 시간이 짧은 프로세스를 우선 실행한다.

예시

프로세스 A(100ms)가 t=0에, B(10ms)가 t=10에, C(10ms)가 t=10에 도착:

시간: 0    10   20   30   40   50   60   70   80   90   100  110  120
     |A(10)|B(10)|C(10)|----A(나머지 90ms)--------------------------|

결과:

장점

단점

RR(Round Robin)

각 프로세스에 **타임 슬라이스(time slice)**만큼 시간을 순환적으로 제공

예시

프로세스 A(50ms), B(50ms), C(50ms)가 동시 도착, 타임 슬라이스 10ms:

시간: 0    10     20    30    40    50    60    70    80    90   100   110   120   130   140   150
     |A(10)|B(10)|C(10)|A(10)|B(10)|C(10)|A(10)|B(10)|C(10)|A(10)|B(10)|C(10)|A(10)|B(10)|C(10)|

반환 시간:

장점

단점

타임 슬라이스의 딜레마

Round-Robin 스케줄러에서 타임 슬라이스 크기는 중요한 설계 결정이다.

타임 슬라이스 크기장점단점
Short (예: 1ms)응답 시간 개선컨텍스트 스위칭 오버헤드 증가
Long (예: 100ms)컨텍스트 스위칭 감소응답 시간 저하, FIFO처럼 동작

작업 전환(컨텍스트 스위칭, Context Switching)은 레지스터 저장 외에 많은 시간이 필요하기에 타임 슬라이스를 작업 전환에 걸리는 시간을 고려하면서 설정해야한다.

입출력 연산의 고려

지금까지는 모든 프로그램이 입출력 없이 CPU만 사용한다고 가정했습니다. 하지만 현실의 프로그램은 완전히 다릅니다.

입출력이 있는 환경의 특징

실제 작업은 다음과 같이 동작합니다:

  1. 잠깐 CPU를 사용하여 계산 수행
  2. 입출력 요청을 발생시켜 디스크나 네트워크를 기다림
  3. 입출력이 완료될 때까지 CPU를 사용하지 않음 (블로킹)
  4. 완료되면 다시 CPU 사용

입출력을 고려한 스케줄링 전략

핵심 아이디어: 한 프로세스가 입출력을 기다리는 동안, 다른 프로세스에게 CPU를 할당하여 시스템 자원을 효과적으로 활용합니다.

예시 시나리오

STCF 방식 (I/O를 고려하지 않는 경우)

작업 A와 B가 동시에 도착했을 때, 둘 다 50ms가 필요하므로 먼저 온 순서대로 실행:

시간: 0     10   20   30   40   50   60   70   80   90    100
A:    |CPU |idle|CPU |idle|CPU |idle|CPU |idle|CPU |      |
B:    |              wait..                        |CPU---| ...
I/O를 고려한 스케줄링

A가 I/O를 시작하면 즉시 B에게 CPU를 할당:

시간: 0    10    20   30   40   50   60   70   80   90   100
A:    |CPU |idle|CPU |idle|CPU |idle|CPU |idle|CPU |     |
B:    |    |CPU-|    |CPU-|    |CPU-|    |CPU-|    |CPU- |

범례: CPU = CPU 사용, idle = I/O 대기

더 자세한 타임라인:

0-10ms:   A CPU 사용
10-20ms:  A I/O 대기 → B CPU 사용
20-30ms:  A CPU 사용, B 대기
30-40ms:  A I/O 대기 → B CPU 사용
40-50ms:  A CPU 사용, B 대기
50-60ms:  A I/O 대기 → B CPU 사용
60-70ms:  A CPU 사용, B 대기
70-80ms:  A I/O 대기 → B CPU 사용
80-90ms:  A CPU 사용, B 대기

결과:

위 스케줄링에서 생각하지 못한 것들

SJF/STCF 는 작업시간을 알고 있다는 전제하에 반환 시간이 좋은 알고리즘 임을 나타내고 있다. 하지만 과연 프로세스가 얼마나 시간이 필요한 지 알 수 있을 까? 아마 이전 작업들을 어디 캐시에 저장해서 예측하고 하는 것이 아닐까.

미래를 알고 있는 게 아닌 이상 최고의 스케줄링은 없다는 생각이 든다. 그리고 이것이 만약 병렬적으로 동작했을 때는 과연 어떻게 될까. 비동기 큐처럼 저장했다가 남아 있는 CPU에 부여해서 병렬을 유지하는 걸지도..


Edit page
Share this post on:

Previous Post
[Effective Java] Item 22 인터페이스는 타입을 정의하는 용도로만 사용하라
Next Post
[System Design Interview] CH3. 시스템 설계 면접 공략법