지수 평균법 (Exponential Averaging)

핵심 인사이트 (3줄 요약)

  1. 본질: 지수 평균법 (Exponential Averaging)은 운영체제가 미래의 "다음 CPU 버스트 길이"를 예측하기 위해, 프로세스의 최근 실제 실행 시간과 과거의 예측치를 가중합(Weighted Sum)하여 계산하는 수학적 추정 기법이다.
  2. 가치: 짧은 작업을 우선 처리하여 대기 시간을 최소화하려는 SJF (Shortest Job First) 스케줄링을 실제 시스템에 적용하기 위해 반드시 풀어야 하는 '미래 예측'이라는 불가능한 난제를 확률적/통계적으로 돌파하게 해 준 핵심 도구다.
  3. 융합: 시계열 데이터 분석(이동평균)에서 널리 쓰이는 알고리즘으로, 현대 OS의 MLFQ(다단계 피드백 큐)가 I/O 바운드인지 CPU 바운드인지 성향을 판단하는 데 있어 암묵적인 토대(Heuristics)로 작용하고 있다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: 과거의 모든 CPU 버스트(실행 시간) 데이터를 이용해 다음번 버스트 길이를 추측하되, 아주 오래전 과거보다 '가장 최근의 정보'에 더 큰 가중치를 주어 예측값을 부드럽게 갱신해 나가는 통계적 알고리즘이다.
  • 필요성: SJF나 SRTF 스케줄러가 완벽하게 동작하려면 각 프로세스가 "나는 이번에 CPU를 딱 10ms만 쓰고 나갈게"라고 미리 자진 신고를 해야 한다. 하지만 코드는 조건문과 루프에 의해 실행 시간이 매번 변하므로 사전 계산이 불가능하다. 결국 과거의 행동 패턴을 바탕으로 다음 행동을 예측할 수밖에 없는데, 이때 모든 과거 기록을 똑같이 취급하면 최근의 변화(예: 게임 메뉴에서 로딩 화면으로 넘어감)를 따라잡지 못해 스케줄링이 엉망이 된다.
  • 💡 비유: 내일 우산을 챙길지 결정할 때, "작년 이맘때 비가 왔는가(과거 예측치)"보다 **"오늘 저녁에 비가 왔는가(가장 최근 데이터)"**를 훨씬 더 중요하게 반영하여 날씨를 예측하는 **'기상청의 예보 공식'**과 같다.
  • 등장 배경: SJF 알고리즘이 이론상 최적임이 증명되었지만 "구현 불가"라는 딱지가 붙자, 이를 어떻게든 근사치(Approximation)로라도 시스템에 올리기 위해 통계학의 시계열 예측 모델(Exponential Smoothing)을 OS 커널 로직으로 수입하면서 탄생했다.
  [프로세스의 CPU 버스트 길이 변화와 스케줄러의 예측 딜레마]

  (실제 프로세스가 소비한 CPU 시간)
  1회차: 10ms (짧음)
  2회차: 12ms (짧음)
  3회차: 11ms (짧음)
  ... (스케줄러: "아, 이놈은 대충 11ms짜리 짧은 I/O 바운드구나!") ...
  
  4회차: 100ms (갑자기 무거운 영상 렌더링 시작!)
  5회차: 110ms (계속 무거움)
  
  >> 이때 스케줄러가 과거의 10ms 시절만 기억하고 "짧은 놈"이라고 
     계속 우대해 주면 전체 시스템이 망가진다. "최근"의 100ms라는 
     새로운 트렌드를 재빨리 예측치에 반영해야만 한다!

[다이어그램 해설] 프로세스는 살아있는 생물과 같아서 페이즈(Phase)가 변한다. 처음엔 I/O 대기만 하다가 갑자기 무거운 연산을 시작하기도 한다. 지수 평균법은 이 갑작스러운 '페이즈 전환'을 빠르게 눈치채어(추적하여) 스케줄러의 판단(SJF 우선순위)을 교정해 주기 위해 고안된 안전장치다.

  • 📢 섹션 요약 비유: 주식 투자를 할 때 10년 전 삼성전자 주가보다 어제 장 마감 주가가 내일 주가를 맞추는 데 훨씬 중요한 것처럼, 과거 데이터는 낡을수록 그 영향력을 지수 함수적으로 팍팍 깎아내야(Exponential Decay) 정확한 예측이 가능합니다.

Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

지수 평균법의 수학적 모델 (점화식)

다음 CPU 버스트 시간을 예측하는 공식은 하나의 점화식으로 표현된다.

$\tau_{n+1} = \alpha \cdot t_n + (1 - \alpha) \cdot \tau_n$

  • $\tau_{n+1}$ (Tau n+1): 우리가 계산해 내야 하는 다음 번 (n+1 번째) CPU 버스트의 예측값.
  • $t_n$ (t n): 바로 직전에 실제로 소비했던 CPU 버스트 길이 (최신 현실 데이터).
  • $\tau_n$ (Tau n): 직전을 예측했던 과거의 예측값 (이 안에는 과거 모든 기록이 압축되어 있음).
  • $\alpha$ (Alpha): 최근 데이터($t_n$)와 과거의 역사($\tau_n$) 중 어디에 비중을 둘 것인지 결정하는 가중치 (0 ≤ $\alpha$ ≤ 1).

Alpha ($\alpha$) 값에 따른 스케줄러의 성향 변화

가중치 $\alpha$는 OS 커널 설계자가 튜닝하는 하이퍼파라미터다. 일반적으로 0.5 (반반 무 많이)를 사용한다.

$\alpha$ 값 설정수식 결과스케줄러의 성향 (의미)
$\alpha = 1$$\tau_{n+1} = t_n$과거는 싹 무시하고, 오직 직전에 했던 행동이 내일도 일어날 것이라 맹신함. (최신 트렌드 절대 추종)
$\alpha = 0$$\tau_{n+1} = \tau_n$직전에 뭔 짓을 했든 무시하고, 맨 처음에 정해진 초기 예측값만 영원히 믿음. (고집불통, 갱신 불가)
$\alpha = 0.5$$\tau_{n+1} = 0.5 t_n + 0.5 \tau_n$최근 현실(50%)과 과거의 관성(50%)을 적절히 버무려 안정적으로 트렌드를 따라감.
  ┌──────────────────────────────────────────────────────────────────────┐
  │         알파(α=0.5)일 때 지수 평균법의 예측값 수렴 시뮬레이션        │
  ├──────────────────────────────────────────────────────────────────────┤
  │                                                                      │
  │  가정: 초기 예측치(τ0) = 10,  실제값(t)이 갑자기 계속 100으로 고정됨 │
  │                                                                      │
  │  [n=0] τ0 = 10                                                       │
  │  [n=1] 실제 t0=100 등장!                                             │
  │        예측 τ1 = (0.5 * 100) + (0.5 * 10) = 55                       │
  │  [n=2] 실제 t1=100 등장!                                             │
  │        예측 τ2 = (0.5 * 100) + (0.5 * 55) = 77.5                     │
  │  [n=3] 실제 t2=100 등장!                                             │
  │        예측 τ3 = (0.5 * 100) + (0.5 * 77.5) = 88.75                  │
  │                                                                      │
  │  >> 분석: 프로세스가 100ms짜리 무거운 작업으로 돌변했을 때,          │
  │     스케줄러는 55 → 77.5 → 88.75로 단 3번 만에 재빨리 눈치를 채고    │
  │     "아 이놈 긴 놈(CPU 바운드)이구나!" 하고 판단을 수정한다.         │
  └──────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 이 수식이 "지수적(Exponential)"이라고 불리는 이유는 공식을 풀어보면 과거의 데이터($t_{n-1}, t_{n-2}, ...$)에 곱해지는 가중치가 $(1-\alpha)^1, (1-\alpha)^2, (1-\alpha)^3$ 형태로 지수적으로 급격히 작아지기 때문이다. 즉 10회 전의 과거 데이터는 현재 예측에 0.0009%밖에 영향을 주지 못한다. 따라서 커널은 과거의 모든 기록을 메모리(배열)에 들고 있을 필요 없이, 오직 직전의 예측값($\tau_n$) 하나만 변수에 딸랑 저장해 두면 되므로 메모리 오버헤드가 극단적으로 적다는 엄청난 장점을 갖는다.

  • 📢 섹션 요약 비유: 친구의 성격을 평가할 때, 10년 전 초등학생 때 한 실수(오래된 과거)는 거의 0%로 무시하고, 어제 밥값을 냈는지(최신 과거)를 50% 비중으로 쳐서 내일의 행동을 가장 현실적이고 값싸게(메모리 절약) 맞추는 심리학 공식입니다.

Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)

단순 평균 vs 지수 평균 (이동 평균)

왜 스케줄러는 그냥 무식하게 여태까지 실행한 시간을 싹 다 더해서 N으로 나누는 '단순 평균'을 쓰지 않았을까?

비교단순 평균 (Simple Average)지수 평균 (Exponential Average)
기억 장치(메모리) 요구량과거 100번의 기록을 다 저장할 배열(Array) 필요직전 예측값 변수 딱 1개만 있으면 됨 (O(1) 공간)
연산 오버헤드매번 N개의 데이터를 다 더하고 나눠야 함덧셈 1번, 곱셈 2번으로 끝 (O(1) 시간)
과거 트렌드 전환 대응과거 100번이 10ms였다면, 갑자기 100ms로 바뀌어도 평균이 11ms로 거의 안 움직임 (둔감함)지수적으로 과거가 잊혀지므로 단 2~3회 만에 새로운 100ms 트렌드로 휙 꺾임 (민감함)

운영체제 단기 스케줄러는 초당 수백 번 호출되는 극한의 마이크로초 튜닝 모듈이다. 여기서 배열을 선언하고 루프를 돌며 평균을 낸다는 것은 시스템 전체에 엄청난 디스패치 지연(Dispatch Latency)을 초래한다. 따라서 $O(1)$의 공간과 $O(1)$의 시간복잡도로 과거를 모두 담아내는 지수 평균법은 구조적으로 완벽한 커널 친화적 알고리즘이었다.

  • 📢 섹션 요약 비유: 단순 평균이 학생의 초1부터 고3까지의 모든 성적표를 보관할 무거운 캐비닛이 필요하다면, 지수 평균법은 오직 "작년 최종 평균 점수" 딱 한 장만 들고서 올해 성적을 예측하는 극강의 미니멀리즘(최소주의)입니다.

Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)

실무 시나리오

  1. 리눅스 MLFQ의 Heuristic 구현: 현대 리눅스의 O(1) 스케줄러 시절이나 Windows 스케줄러에서는 대놓고 부동소수점 곱셈을 쓰는 지수 평균 공식 자체를 그대로 커널에 넣지는 않는다. (부동소수점 연산은 FPU 레지스터 문맥교환 부하를 유발하므로 커널 금기 사항이다.) 대신 정수형 비트 시프트 연산(>>) 과 프로세스가 **타임 퀀텀을 꽉 채웠는가(CPU 바운드), 자발적으로 포기했는가(I/O 바운드)**를 기반으로 우선순위(Priority)를 +5 하거나 -5 하는 식의 암묵적인 Heuristic(경험적) 가중치 로직으로 철학을 계승하고 있다.
  2. Auto-scaling 부하 예측 (클라우드 인프라): OS 밖의 세상, 즉 AWS EC2 Auto-scaling 그룹이나 K8s의 HPA(Horizontal Pod Autoscaler)가 미래의 트래픽을 예측할 때 이 지수 평활법(Exponential Smoothing) 알고리즘이 그대로 쓰인다. 과거 1시간 전 CPU 부하보다 최근 1분 전의 CPU 스파이크(Spike)에 압도적인 가중치를 주어 즉각적으로 서버 대수를 늘리도록 튜닝할 때 $\alpha$ 값을 0.8 정도로 높게 설정한다.
  ┌──────────────────────────────────────────────────────────────────┐
  │       시스템 페이즈(Phase) 전환 시 스케줄러의 타겟팅 실패 방어   │
  ├──────────────────────────────────────────────────────────────────┤
  │                                                                  │
  │   [워드 프로세서 프로그램 구동 중]                               │
  │    사용자가 타이핑만 함 (1ms 사용 후 I/O 대기 반복)              │
  │        ▼ (스케줄러: "아, 완벽한 I/O 바운드! 최우선순위 부여!")   │
  │                                                                  │
  │   사용자가 갑자기 "1,000페이지 PDF로 내보내기" 버튼 클릭!        │
  │        ▼ (프로세스가 갑자기 CPU 100%를 쓰며 100ms씩 점유)        │
  │                                                                  │
  │   [스케줄러의 Heuristic (지수 평균 철학) 발동]                   │
  │    1차 방어: "어? 타임 퀀텀을 다 썼네? 예측 빗나감."             │
  │    2차 조치: 과거의 '타이핑' 이력에 대한 가중치 즉각 삭감        │
  │    3차 조치: "너는 이제 CPU 바운드다." 하위 큐로 즉각 강등       │
  │                                                                  │
  │   🚨 결과: 갑작스런 무거운 연산이 다른 프로세스(마우스)를        │
  │          멈추게 하는 호위 효과(Convoy Effect)를 2~3 틱 내에 차단.│
  └──────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 하나의 프로그램이 평생 한 가지 성격만 유지하지 않는다는 것을 보여준다. I/O 작업과 CPU 작업은 수시로 엎치락뒤치락 교차(Phase Shift)하는데, 스케줄러가 과거 이력에만 얽매여 있으면 이 변화를 포착하지 못해 시스템 렉을 유발한다. 지수 평균법은 이 변화의 '기울기'를 가장 빠르고 값싸게 알아차리는 센서 역할을 수행했다.

  • 📢 섹션 요약 비유: 순한 양이던 친구(I/O 바운드)가 갑자기 늑대(CPU 독점)로 돌변했을 때, 예전 착했던 기억(과거) 때문에 계속 잘해주면 내가 잡아먹힙니다. 돌변한 즉시 가차 없이 늑대 대우(하위 큐 강등)를 해버리는 빠르고 냉혹한 판단법이 시스템을 지킵니다.

Ⅴ. 기대효과 및 결론 (Future & Standard)

기대효과

지수 평균법을 도입한 예측형 스케줄러는 SJF가 약속한 "대기 시간 최소화"라는 환상의 목표치에 가장 근접한 근사값(Approximation)을 획득하게 해 주며, 무거운 프로세스와 가벼운 프로세스를 자동으로 동적으로 분류(Dynamic Classification)해 내는 자동화된 인프라를 제공한다.

결론 및 미래 전망

수학적 공식으로서의 지수 평균법은 CPU 스케줄러를 넘어 TCP 혼잡 제어(RTT 왕복 시간 예측), 디스크 I/O 스케줄링, 심지어 주식 시장의 이동평균선(MACD) 계산에까지 IT 및 금융 전반에 걸쳐 사용되는 표준 기술이다. 미래의 스케줄러는 이 단순한 1차 함수적 예측을 넘어서, 신경망(Neural Network)이나 강화학습(RL)을 커널 오프로딩 하드웨어(DPU)에 탑재하여 "이 프로그램은 매일 오후 3시만 되면 100ms를 쓴다"는 시계열적 패턴까지 미리 학습해 버리는 'AI 기반 초정밀 예측 스케줄러'로 고도화되고 있다.

  • 📢 섹션 요약 비유: 과거에는 방금 전 한 발자국의 발자국만 보고 다음 발자국(지수 평균법)을 예측했다면, 미래의 컴퓨터는 이 사람이 언제 어디로 산책하러 가는지 전체 일과표(AI 머신러닝)를 아예 통째로 외워서 동선을 미리 비워두는 수준으로 똑똑해질 것입니다.

📌 관련 개념 맵 (Knowledge Graph)

개념 명칭관계 및 시너지 설명
SJF (Shortest Job First)지수 평균법이 태어나게 된 근본적인 원인이다. 미래의 실행 길이를 알아야만 SJF를 쓸 수 있기 때문이다.
다단계 피드백 큐 (MLFQ)공식을 직접 쓰진 않더라도 "최근 행동을 바탕으로 다음 우선순위를 동적으로 결정한다"는 지수 평균법의 영혼을 그대로 이식받은 현대 스케줄러다.
CPU 버스트 (CPU Burst)지수 평균법 공식에서 예측해야 하는 정답(목표값)이자, 최신 데이터($t_n$)로 입력되는 원시 데이터다.
부동소수점 오버헤드 (FPU Context Switch)커널 스케줄러가 알파($\alpha=0.5$) 같은 소수점 곱셈을 실제로 하기 꺼려하는 물리적 이유로, 이 때문에 비트 시프트(>>) 연산으로 근사해 사용한다.
TCP 혼잡 제어 (Congestion Control)OS 스케줄러 외에 지수 평균법이 가장 적극적으로 쓰이는 곳으로, 네트워크 패킷의 다음 왕복 시간(RTT)을 예측하여 전송 윈도우를 조절한다.

👶 어린이를 위한 3줄 비유 설명

  1. 뷔페에 온 손님이 밥을 "빨리 먹고 나갈지, 10접시를 먹을지" 식당 주인(OS)은 알 방법이 없어요.
  2. 그래서 지수 평균법이라는 눈치 게임을 써요! "이 손님이 방금 전 접시를 얼마나 빨리 비웠지?"를 보고 다음 접시 먹는 속도를 찍어 맞추는 거예요.
  3. 아주 옛날에 밥 먹던 속도는 까먹어버리고, 오직 방금 먹은 속도(최근 데이터)에만 딱 집중해서 예측하니까 아주 빠르고 정확하게 다음 순서를 정해줄 수 있답니다!