2013-02-13 7 views
0

아래 코드를 사용하여 연속적인 각 함수 호출에 대해 밀리 초 단위로 경과 시간을 계산합니다. 내가 usleep (1000), 즉 1ms를 사용할 때, 각각의 호출 사이의 시간차는 10ms이고, iwleep (1000000) 즉 1 초를 사용할 때 놀랍게도 각 호출 사이의 시간 간격은 1ms 미만으로 떨어진다. 코드 조각은 다음과 같은 :경과 시간을 계산하는 usleep()은 이상한 동작을 보입니다.

#include<stdio.h> 
    #include<stdlib.h> 
    #include<sys/time.h> 
    #include<unistd.h> 

    struct timeval start_time; 
    void handler(int); 

    int main() 
    { 
      struct timeval current_time; 
      int i=0; 
      gettimeofday(&start_time,0); 
      gettimeofday(&current_time,0); 
      printf("%012.3fms: emulationbegins\n",((current_time.tv_usec-start_time.tv_usec)/1000.0)); 

      while(i++<5) 
      { 
        usleep(1000); // compare with usleep(1000000) 
        handler(i); 
      } 

      return 0; 
    } 

    void handler(int i) 
    { 
      printf("In Handler %d\n",i); 
      struct timeval current_time; 
      gettimeofday(&current_time,0); 
      printf("%012.3fms: Handler Called\n",((current_time.tv_usec-start_time.tv_usec)/1000.0)); 
      return; 
    } 

답변

2

timeval 구조의 tv_usec 필드가 결코 (또는 이상) 백만 대신 초 수가 증가 간다 것을 기억하십시오.

계산시 tv_sec 필드도 사용해야합니다.

+0

나는 그것을 놓쳤다. .. 고맙다!! –

+0

관련 질문이 있습니다. 실수를 정정 한 후 usleep (1000)과 usleep (1000000)은 상당한 차이가 있지만 usleep (1000)과 usleep (5000)은 거의 같습니다. 왜 ?? –

+0

@ vikas_2kx'usleep' 함수는 주어진 양보다 적 으면 타이머의 해상도가 충분히 높지 않으면 실제로자는 시간이 길어질 수 있습니다. –

0

usleep은 최소한 당신이주는 양만큼 잠자기하도록 지정되어 있지만, 훨씬 오래자는 수 있습니다. 실행하는 데 더 중요한 프로세스가 있으면 운영 체제가 프로세스를 실행하지 않아도되기 때문에 잠자기 시간은 거의 상한이 아닙니다.

실제로는 usleep의 절전 시간은 운영 체제가 사용하는 시간에 따라 결정됩니다. 몇 년 전까지 만해도 대부분의 유닉스 계열 시스템은 이와 같이 타이머를 구동하기 위해 정적 100Hz 타이머 (또는 좀 더 드문 경우에는 1024Hz)를 사용했기 때문에 소음은 항상 가장 가까운 10ms로 반올림됩니다.

일부 시스템에서는 정적 시계를 제거하기 위해 최근에 일부 작업이 수행되었지만 고해상도를위한 필요성 때문에 그다지 많은 노력을 기울이지는 않았지만 지속적으로 CPU를 깨우는 것이 정적 클록 틱은 전력 소비에 좋지 않습니다. 타이머 해상도를 향상시키는 부수적 인 효과가있을 수 있지만 잠깐 동안 잠들었을 때 제대로 작동하는 것으로 보이는 응용 프로그램의 버그가 노출됩니다. 갑자기 시간 초과가 더 높은 해상도로 나타난다. usleep/nanosleep/poll/select 짧은 잠은 잠들기 때문에 CPU에서 회전하는 응용 프로그램이 항상 잠자기 상태가됩니다.

오늘은 어떤 상태인지 모르겠지만 10ms에서 시스템이 내부 타이머로 100Hz 클럭을 사용하고 있거나 의도적으로 10ms 해상도로 시간 초과가 느려져 응용 프로그램이 파괴.

+0

아, 그 정보에 감사드립니다. 그것은 많은 것을 설명합니다. –