티스토리 뷰

 

3️⃣ CPU 스케줄링 (CPU Scheduling)

✅ 왜 스케줄링이 필요한가?

컴퓨터 시스템은 멀티태스킹 환경에서 여러 프로세스가 동시에 실행되는 것처럼 보이지만, 실제로는 한정된 CPU가 프로세스를 순차적으로 실행합니다. 따라서 운영체제는 어떤 프로세스가 언제 CPU를 차지할지 결정해야 합니다. 이게 바로 스케줄링이에요.


✅ 스케줄링 시점

  • Non-preemptive (비선점):
    • 현재 실행 중인 프로세스가 CPU를 자발적으로 내놓을 때만 스위칭.
  • Preemptive (선점형):
    • OS가 강제로 CPU를 회수하여 다른 프로세스에 할당 가능.

대부분의 현대 OS는 선점형 스케줄링을 사용합니다.


✅ 주요 스케줄링 알고리즘

알고리즘 설명 특징

FCFS (First-Come First-Served) 먼저 도착한 프로세스부터 순차 실행 구현 간단 / 긴 대기시간 발생 가능
SJF (Shortest Job First) 실행 시간이 가장 짧은 프로세스를 우선 실행 평균 대기시간 최소 / 실행 시간 예측 필요
Priority Scheduling 우선순위 높은 프로세스부터 실행 기아(Starvation) 문제 발생 가능
Round Robin (RR) 고정된 시간 할당(Quantum) 후 선점하여 순환 응답 시간 개선 / Context Switch 오버헤드 발생
Multilevel Queue 여러 큐로 분류(예: 상호작용/배치) 후 각 큐 별 알고리즘 적용 복잡한 환경 최적화 가능
Multilevel Feedback Queue 우선순위 큐 + 동적 이동 (실행 패턴에 따라 큐 위치가 바뀜) 매우 유연 / 구현 복잡

✅ 평가 지표

  • CPU Utilization (CPU 이용률): 얼마나 CPU가 바쁘게 일하는지.
  • Throughput (처리량): 단위 시간당 완료된 프로세스 수.
  • Turnaround Time (반환 시간): 프로세스 제출 → 완료까지 걸린 시간.
  • Waiting Time (대기 시간): 프로세스가 Ready 상태로 기다린 총 시간.
  • Response Time (응답 시간): 프로세스 제출 → 첫 응답까지의 시간.

👉 이 지표들은 서로 Trade-off 관계가 있으므로 OS의 목적에 따라 우선순위가 달라집니다.

🔎 스케줄링 평가 지표 간의 연관 공식

다음 3가지가 서로 밀접하게 연결되어 있습니다:

1️⃣ Turnaround Time (반환 시간)
2️⃣ Waiting Time (대기 시간)
3️⃣ Burst Time (실행 시간)


✅ 공식 ①

Turnaround Time (TAT)

Turnaround Time=Completion Time−Arrival Time\text{Turnaround Time} = \text{Completion Time} - \text{Arrival Time}

즉, 프로세스가 들어온 시점부터 끝나는 시점까지 전체 소요 시간입니다.


✅ 공식 ②

Waiting Time (WT)

Waiting Time=Turnaround Time−Burst Time\text{Waiting Time} = \text{Turnaround Time} - \text{Burst Time}

  • Burst Time (BT): CPU에서 실제로 실행된 시간.

따라서:

WT=(CT−AT)−BTWT = (CT - AT) - BT

👉 이 공식은 대기 시간 = 전체 걸린 시간 - 실제 실행 시간이라는 의미예요.


✅ 공식 ③

Response Time (RT)

Response Time=First CPU Start Time−Arrival Time\text{Response Time} = \text{First CPU Start Time} - \text{Arrival Time}

Round Robin 등에서는 Response Time이 중요하며, 첫 응답 시점을 측정합니다.


✅ 정리된 공식 관계

지표 공식

Turnaround Time (TAT) Completion Time (CT) - Arrival Time (AT)
Waiting Time (WT) Turnaround Time (TAT) - Burst Time (BT)
Response Time (RT) First Execution Start Time - Arrival Time (AT)

예제 👀

프로세스: P1 (AT=0, BT=5)

  • CT = 10
  • AT = 0
  • BT = 5
  • TAT = 10 - 0 = 10
  • WT = 10 - 5 = 5
  • (만약 첫 실행이 3초에 시작했다면) RT = 3 - 0 = 3

✅ 결론

평가지표들은 서로 긴밀하게 연결되어 있어, 한 지표만 알면 나머지를 유추할 수 있습니다. 다만, 스케줄링 정책이나 프로세스 간 선점 여부에 따라 값이 달라질 뿐, 기본 공식은 일정합니다.


✅ 심화: 다중 프로세서 스케줄링

멀티코어 환경에서는 스케줄링이 더 복잡해집니다.

  • 대칭형 (SMP): 모든 CPU가 OS의 스케줄링 알고리즘을 공유.
  • 비대칭형 (AMP): 한 CPU가 스케줄링만 담당.

Load Balancing: 각 CPU에 작업을 고르게 분배해야 병목을 방지할 수 있음.

 

🔥 다중 프로세서 스케줄링의 Load Balancing

목표:
CPU가 여러 개 있을 때 특정 프로세서만 과부하 걸리는 걸 방지하고, 작업을 고르게 분산하여 전체 시스템 효율을 높이는 것.


✅ Load Balancing 방식

1️⃣ Central Queue 방식

  • 설명: 모든 CPU가 하나의 공통 큐에서 작업을 가져감.
  • 장점: 자연스럽게 부하가 균형을 이룸.
  • 단점: 큐 자체가 병목이 될 수 있음 (Lock 경쟁).

예: 단순한 멀티코어 OS, 예제 수준의 스케줄러.


2️⃣ Local Queue + Work Stealing 방식

  • 설명: 각 CPU는 자신만의 로컬 큐를 가지고 작업을 관리.
    부하가 한쪽에 몰리면 작업이 없는 CPU가 다른 CPU에서 작업을 "훔쳐옴".
  • 장점: 병렬성이 뛰어나고 큐 병목이 줄어듦.
  • 단점: Stealing 시 약간의 오버헤드 발생.

예:

  • Linux CFS (Completely Fair Scheduler)에서 NUMA-aware 로드 밸런싱 시.
  • 멀티스레딩 라이브러리(TBB, Go 런타임 등).

3️⃣ Periodic Balancing (주기적 균형 재조정)

  • 설명: 스케줄러가 일정 시간마다 CPU별 로드 상태를 점검하고 불균형 시 프로세스를 재배치.
  • 장점: 단순하지만 안정적.
  • 단점: 너무 잦으면 오버헤드 발생.

4️⃣ Push vs Pull 전략

  • Push:
    • 과부하가 걸린 CPU가 스스로 일부 작업을 다른 CPU로 밀어냄.
  • Pull:
    • 빈 CPU가 적극적으로 다른 CPU에서 작업을 가져옴.

현대 OS들은 보통 Push + Pull 혼합 전략을 씁니다.


✅ 심화 예시: Linux CFS

  • 다중 러너블 큐 (Per-CPU Runqueue)
  • Idle CPU는 Steal 우선 / 부하 심하면 Push도 수행
  • NUMA 환경에선 메모리 locality도 고려

✅ 간단 비교표

방식 특징

Central Queue 단순 / 병목 발생 가능
Local Queue + Stealing 고성능 / 구현 복잡
Periodic Balancing 간단 / 자주 하면 오버헤드
Push / Pull 균형 감시 / 유연한 분산

👉 정리: 현대의 다중 프로세서 스케줄러는 Local Queue + Work Stealing + Periodic Rebalance 같은 복합적인 방식을 채택해 높은 병렬성과 효율을 추구합니다.


✅ 심화: 실시간 스케줄링

실시간 시스템은 데드라인이 핵심입니다.

  • Hard Real-Time: 데드라인 미스 절대 금지 (항공, 의료).
  • Soft Real-Time: 데드라인 미스 가능하지만 성능 저하 (멀티미디어).

알고리즘:

  • Rate Monotonic (RM)
  • Earliest Deadline First (EDF)

🛠 간단한 Round Robin 예시 (C++)

#include <iostream>
#include <queue>

struct Process {
    int id;
    int burst;
};

int main() {
    std::queue<Process> q;
    q.push({1, 5});
    q.push({2, 10});
    q.push({3, 7});

    int quantum = 3;

    while (!q.empty()) {
        Process p = q.front(); q.pop();
        if (p.burst > quantum) {
            std::cout << "Process " << p.id << " runs for " << quantum << "\n";
            p.burst -= quantum;
            q.push(p);
        } else {
            std::cout << "Process " << p.id << " finishes\n";
        }
    }
}

✅ 스케줄링의 핵심 요약

  • 선점형 스케줄링은 컨텍스트 스위치를 동반하며 응답성이 좋음.
  • 알고리즘 선택은 시스템의 특성(대화형? 배치형? 실시간?)에 따라 달라짐.
  • 현대 OS들은 대개 Multilevel Feedback Queue 같은 복합 스케줄러를 사용.

 

'다시 정리하는 CS 이론 > OS' 카테고리의 다른 글

[OS] 프로세스 관리  (0) 2025.05.03
[OS] 운영체제 개요  (0) 2025.05.03
[OS] 운영체제 커리큘럼  (1) 2025.05.03
Comments
최근에 올라온 글