timer_sleep() 이라는 함수가 현재는 busy wait로 다른 작업을 기다리도록 만들어졌다고 나온다. 반복문을 통해 thread_yield() 함수를 호출한다고 되어있다. 해야하는것은 busy wait 이 아닌 방식으로 기다리도록 변경하는것이다.
CPU 소유권은 필요한 스레드에서 뺏으면 될텐데, 왜 굳이 yield라는걸 만들었을지 의문이였다. 아직은 필요성을 잘 못느끼겠다.
차이점을 본다면 preempt는 강제로 CPU 소유권을 뺏어가는것이다. yield는 현재 스레드가 CPU를 다른 스레드가 사용할 수 있게 만든다. 현 스레드가 ready qeueu에 들어가게 된다. 그런데, 본인이 다시 CPU를 가져올 수도 있다.
yield에서는 CPU를 양보한 스레드가 다시 CPU를 소유하는 비효율적인 일도 일어날 수 있는것이다.
busy wait은 조건이 만족되었는지 확인하면서 기다리는걸 의미한다. 더 정확히는 CPU를 사용하면서 기다리는걸 의미한다. 현재 코드는 다음과 같다.
/* Suspends execution for approximately TICKS timer ticks. */
void
timer_sleep (int64_t ticks) {
int64_t start = timer_ticks ();
ASSERT (intr_get_level () == INTR_ON);
while (timer_elapsed (start) < ticks)
thread_yield ();
}
현재가 지정된 시간이 될때까지 thread_yield()함수를 실행시키길 반복하고 있다. 지정된 시간동안 잠자코 기다리면 되는데 괜히 CPU를 사용하고 있다. 그래서 이번 과제가 기다리는동안 CPU를 사용하지 않도록 수정하라는 것이다.
제한 시간내 + 올바른 결과가 요구되는 환경을 실시간이라고 부른다.
예를 들면, 화상 회의가 실시간 환경에 따른다. 음성이 먼저 도착하고, 영상이 늦게 도착하면 이상하게 보인다. 다만, 이것은 일반적으로 말하는 실시간은 아닌것같다. 일상적으로 말하는 실시간은 자동차 에어백에처럼 특정 시간내로 작동해야하는것이 어울린다.
timer_sleep은 특정 간격마다 동작하고, 그 외에는 아무것도 하지 않는다. 이 동안은 잠들어있기 때문에 CPU를 사용하지 않는다. 이 함수를 언급한것은 위에서 busy wait을 수정해야하는 방향을 알려주기 때문이다.
운영체제에는 스케줄러라는 다음 작업을 선택하는 무언가가 있다. 스케줄러는 ready queue라는곳에서 다음으로 실행할(CPU를 할당할) 스레드를 선택한다.