[TIL/크래프톤 정글9기] 67일차 (Pintos MLFQS)

blueprint·2025년 7월 16일

크래프톤정글9기

목록 보기
55/55

Decay는 소수다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Pintos BSD 4.4 Scheduler 구현 시 Decay 계산 오류 트러블슈팅

문제 상황
Pintos의 BSD 스케줄러를 구현하던 중, mlfqs-nice-2 테스트 실패가 발생!!!!

thread   actual <-> expected explanation
------ -------- --- -------- ----------------------------------------
     0     2172 >>> 1904     Too big, by 218.
     1      829 <<< 1096     Too small, by 217.
// 잘못된 구현
fixed_t decay = FTOI_N(DIVFF_F(MUXFI_F(load_avg, 2),
                               ADDFF_F(MUXFI_F(load_avg, 2), CITOF(1))));

잘못된 가정

문제의 핵심: decay 값에 대한 잘못된 이해를 해버림..

decay0 또는 1의 정수값만 나올 것이라고 생각을 해버림..

FTOI_N()으로 반올림해서 정수로 만들어주는 것이 좋겠다고 판단하는 멍청한 짓을 해버림..

하지만 실제로 decay는 0과 1 사이의 소수값이 되버림..

Decay 값에 따른 Recent_CPU 업데이트 차이

image.png

잘못된 경우: Decay가 1로 반올림

Decay = 1일 때:

recent_cpu = 1.0 × recent_cpu + nice
  • 문제: recent_cpu가 계속 누적만 됨 (감쇠 없음)
  • 결과: recent_cpu 값이 계속 커짐
  • 영향: Thread priority가 계속 낮아져서 스케줄링 불균형

올바른 경우: Decay가 소수값 (예: 0.667)

Decay = 0.667일 때:

recent_cpu = 0.667 × recent_cpu + nice
  • 효과: 기존 recent_cpu가 감쇠됨 (67% 정도만 유지)
  • 결과: recent_cpu가 적절히 줄어들면서 nice 값 반영
  • 스케줄링: CPU 사용량이 시간에 따라 자연스럽게 감소

핵심 포인트

Decay가 1이 되면 recent_cpu가 감쇠되지 않아 thread priority 계산이 틀어짐

  • Decay = 1 → recent_cpu 계속 증가 → priority 계속 감소
  • Decay = 0.667 → recent_cpu 적절히 감쇠 → priority 균형 유지

트러블슈팅

잘못된 코드:

// ❌ FTOI_N으로 반올림 → decay가 1또는 0이 됨
fixed_t decay = FTOI_N(DIVFF_F(MUXFI_F(load_avg, 2),
                               ADDFF_F(MUXFI_F(load_avg, 2), CITOF(1))));

올바른 코드:

// ✅ 고정소수점 값 그대로 유지 → decay가 0.667 같은 소수값
fixed_t decay = DIVFF_F(MUXFI_F(load_avg, 2),
                       ADDFF_F(MUXFI_F(load_avg, 2), CITOF(1)));

0개의 댓글