Подтвердить что ты не робот

Как остановить время от работы в Linux?

Вот небольшой тест, который я написал для проверки того, что время действительно работает только в Linux.

#include <time.h>
#include <sys/time.h>  

bool timeGoesForwardTest2()
{
   timeval tv1, tv2;   
   double startTime = getTimeSeconds();  // my function

   while ( getTimeSeconds() - startTime < 5 )
   {
      gettimeofday( &tv1, NULL );  
      gettimeofday( &tv2, NULL );  

      if ( tv2.tv_usec == tv1.tv_usec &&
           tv2.tv_sec == tv1.tv_sec )
      {
         continue;  // Equal times are allowed.
      }

      // tv2 should be greater than tv1
      if ( !( tv2.tv_usec>tv1.tv_usec ||
              tv2.tv_sec-1 == tv1.tv_sec ) )
      {
         printf( "tv1: %d %d\n", int( tv1.tv_sec ), int( tv1.tv_usec ) );
         printf( "tv2: %d %d\n", int( tv2.tv_sec ), int( tv2.tv_usec ) );
         return false;
      }         
   }
   return true;
}

Тест завершился неудачей с результатом.

 tv1: 1296011067 632550
 tv2: 1296011067 632549

мммм....

Почему это происходит?

Здесь моя настройка:

Linux version 2.6.35-22-generic ([email protected]) (gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu4) ) #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 (Ubuntu 2.6.35-22.33-generic 2.6.35.4)
... running inside VirtualBox 3.2.12, in Windows 7.
4b9b3361

Ответ 1

Существует открытая проблема в VirtualBox Bug Tracker. Они ссылаются на сообщение в блоге, в котором говорится, почему вы не должны использовать gettimeofday() для измерения времени прохождения:

Самый портативный способ измерения времени правильно выглядит clock_gettime (CLOCK_MONOTONIC,...)

Ответ 2

gettimeofday() не гарантируется монотонность. Используйте clock_gettime(CLOCK_MONOTONIC), если вам нужна эта гарантия.

Ответ 3

Таймеры машин на большинстве машин имеют только точность в 15 usec (даже для собственного кода). Время, идущее "назад", странно, но вы действительно не можете полагаться на этот уровень (1 usec) в любом случае. (Также обратите внимание: существует разница между точностью и точностью, точность большинства таймеров хуже его точности). Использование виртуальной машины также может усугубить это.

Обновление: Typo

Ответ 4

Это не то, что он бежит назад. Лучше сказать, что он не сообщает о правильном времени. Это связано с тем, что компьютеры без помощи выделенной временной подсистемы просто не способны точно сообщать время за один миллисекундный интервал.

Точность будет зависеть от аппаратного обеспечения, ОС и даже от источника питания. Вот статья для начинающих. Немного устарело, но прекрасно передает идею.

Ответ 5

Время не должно бежать назад на реальном оборудовании; на VM ваш пробег может измениться.

В любом случае ваше приложение, вероятно, не должно предполагать, что время не работает в обратном направлении в очень маленькой сумме (подумайте, может быть, за 1 секунду).

Да, clock_gettime хорош, но даже может работать в обратном направлении в случае неисправного оборудования (или виртуальной машины, как в вашем примере).

Я видел, как аппаратная ошибка заставляла время бежать назад (хотя и очень редко), это было причиной некоторых очень странных проблем.

В частности, все, что связано с сравнением временных меток файла, будет ошибочным, когда время идет назад.