문제 상황
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 값에 대한 잘못된 이해를 해버림..
decay가 0 또는 1의 정수값만 나올 것이라고 생각을 해버림..
FTOI_N()으로 반올림해서 정수로 만들어주는 것이 좋겠다고 판단하는 멍청한 짓을 해버림..
하지만 실제로 decay는 0과 1 사이의 소수값이 되버림..
recent_cpu = 1.0 × recent_cpu + nice
recent_cpu = 0.667 × recent_cpu + nice
Decay가 1이 되면 recent_cpu가 감쇠되지 않아 thread 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)));