sleep 중인 thread를 awake 시간에 다시 ready 상태로 만들어 주는 것이 목표.
sleep 중인 thread list를 만들고 sleep 싱태가 될 때 마다 sleep_list에 추가.
sleep_list를 check하여 awake 시간이 되면 ready_list에 다시 넣어 준다.
우선 순위 순으로 thread를 running thread로 바꿔주는 것이 목표.
각 thread의 priority를 check하여 우선 순위가 제일 높은 thread를 running thread로 바꿔 준다.
기존에 running인 thread보다 우선 순위가 높은 thread가 생기면 기존 thread는 ready로 바꾸고 우선 순위가 높은 thread는 running으로 바꿈.
우선 순위가 높은 thread는 mutex나 semaphore의 lock을 얻고 싶어하고, 기존에 lock을 얻은 thread는 작업을 하고 lock을 반납하는 작업을 하고 싶어하나 우선 순위에 밀려 작업을 하지 못하는 deadlock 상태를 막기 위해 donation(priority 기부)을 하는 상황도 발생 할 수 있다.
mlfqs = Multi-Level Feedback Queue Scheduler 의 약자.
priority 인자 외에 niceness, recent_cpu, load_avg 인자를 추가하여 우선 순위를 더욱 효율적으로 계산. (starvation 방지)
priority
PRI_MIN : 0, PRI_MAX : +63
PRI_DEFAULT : 31
priority = PRI_MAX - (recent_cpu / 4) - (nice * 2)
매 4 tick 마다 모든 스레드의 priority 를 재계산한다.
niceness
niceness가 클수록 다른 thread에게 점유를 양보하는 정도가 큼 = priority가 낮아짐.
위 인자들과 계산식을 이용하여 priority를 계산 한 뒤, 우선 순위가 높아진 thread를 running한다.
make check 결과 mlfqs-nice-10 부분만 통과됐다 안됐다를 반복.
원인 불명 (코드를 비효율적으로 짜서겠지 뭐..)