과제를 진행하다보면, 의도했던 상황보다 시간이 밀려서 찍히는 걸 볼 수 있다.

 

 

man 페이지를 보면 시스템 호출 처리에 소모된 시간이나 시스템 타이머 정밀도에 따라 잠드는 시간이 살짝 길어질 수 있다고 나와있는데, 그 과정에 대해 알아보겠당 🤨 다음은 sleep() 함수 실행 시 일어나는 일이다.

  1. 시스템 호출이 일어나 시스템 호출 핸들러가 실행되어 sleep()을 호출한 프로세스(스레드)를 타이머 대기 큐에 넣는다.
  2. CPU 스케쥴링에 의해 다른 프로세스(스레드)가 실행된다.
  3. 한편 시스템에서는 주기적으로 타이머 인터럽트가 발생하고 운영체제의 인터럽트 핸들러를 실행한다. 인터럽트 핸들러가 하는 일 중의 하나가 타이머 대기 큐를 확인하는 것인데, 이 때 큐의 맨 앞에 있는 프로세스(스레드)를 깨워야 할 시점이 됐다면 그 프로세스(스레드)를 깨운다. 즉, 대기 큐에서 준비 큐로 옮긴다
  4. 다시 CPU 스케쥴링에 의해 (우선 순위가 높은 다른 프로세스가 없다면) 방금 준비 큐에 넣은 프로세스(스레드)를 실행한다.

 

즉, (1)문맥 교환(2)스케쥴링의 순서가 보장되지 않음(3)다른 프로세스(스레드)의 CPU 자원 사용의 이유로 지연이 발생하게 된다.


      
void msleep(long long target_time)
{
long long start_time;
start_time = get_millisecond(0);
while (target_time > get_millisecond(0) - start_time)
usleep(1000);
}

 

쉽게 말해, 정확하게 지정한 시간만큼만 재우고 바로 실행하겠다는 의미가 아니라 지정한 시간이 지나면 우선 깨우는데 바로 실행될지 말지는 알 수 없다는 의미이다. 그래서 target_time만큼 sleep 하는 게 아니라 반복문을 통해 최대한 target_time에 가깝게 sleep하도록 했다.

 

noeyiz