[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: