Re: убегает время
On Thu, Aug 09, 2007 at 06:53:10PM +0400, Max Dmitrichenko wrote:
> В сообщении от 9 Август 2007 13:55 Stanislav Maslovski написал(a):
> > On Thu, Aug 09, 2007 at 12:00:09PM +0400, Max Dmitrichenko wrote:
> > > В сообщении от 8 Август 2007 17:17 Stanislav Maslovski написал(a):
> > > > > Чипсет 865. Проц - P4 2.6 с включенным HT. /dev/rtc есть. udev стоит.
> > > > > Что это может быть?
> > > >
> > > > Другая причина - нестабильный/плохо откалиброванный time source.
> > > > На PC выбирать имеет смысл из HPET (если есть) или ACPI PM-Timer.
> > > > dmesg скажет, какой time source используется.
> > >
> > > $ dmesg
> > > ...
> > > Time: tsc clock source installed
> > > ...
> > >
> > > С какого дуба он упал, если выбрал в качестве источника времени такты процессора?!
> >
> > TSC выбирается по-умолчанию, так как это дешевый clock source с разрешением порядка наносекунд.
>
> Хрен знает что у них там такое в timekeeping, но clocksource=acpi_pm помог.
>
> Интересно, а зачем для gettimeofday источник точнее чем микросекунды?
Теоретически, в POSIX есть nanosleep(). Теоретически =)
> Ещё, что любопытно,
> разрешение у POSIX Realtime Timers вообще совпадает с jiffies, хотя не понятно, почему
> бы clock_gettime не использовать более точные источники, чем jiffies.
clock_gettime(), вообще-то, задумывался с наносекундным разрешением.
Посмотрите, что у Вас выдаст этот пример для разных clock source в ядре:
===========================================================
#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
struct timespec res;
int main()
{
syscall(__NR_clock_getres, CLOCK_REALTIME, &res);
printf("CLOCK_REALTIME res:\t\t%ld.%09ld sec.\n", (long)res.tv_sec, (long)res.tv_nsec);
syscall(__NR_clock_getres, CLOCK_MONOTONIC, &res);
printf("CLOCK_MONOTONIC res:\t\t%ld.%09ld sec.\n", (long)res.tv_sec, (long)res.tv_nsec);
syscall(__NR_clock_getres, CLOCK_PROCESS_CPUTIME_ID, &res);
printf("CLOCK_PROCESS_CPUTIME_ID res:\t%ld.%09ld sec.\n", (long)res.tv_sec, (long)res.tv_nsec);
syscall(__NR_clock_getres, CLOCK_THREAD_CPUTIME_ID, &res);
printf("CLOCK_THREAD_CPUTIME_ID res:\t%ld.%09ld sec.\n", (long)res.tv_sec, (long)res.tv_nsec);
return 0;
}
===========================================================
У меня:
CLOCK_REALTIME res: 0.000000001 sec.
CLOCK_MONOTONIC res: 0.000000001 sec.
CLOCK_PROCESS_CPUTIME_ID res: 0.000000001 sec.
CLOCK_THREAD_CPUTIME_ID res: 0.000000001 sec.
Понятно, что наносекндная точность лишь постулируется, но тем не менее.
--
Stanislav
Reply to: