time(7) обзор времени и таймеров

ОПИСАНИЕ

Реальное время и время процесса

Реальное время (real time) — время, измеряемое от некоторой постоянной точки, или от стандартной точки в прошлом (смотрите описание эпохи (Epoch) и календарного времени далее), или от некоторой точки (например, с момента запуска) в жизни процесса (прошедшее время (elapsed time)).

Время процесса (process time) — количество процессорного времени, использованного процессом. Иногда его делят на пользовательское (user) и системное (system). Пользовательское время ЦП — это время, потраченное на исполнение кода в режиме пользователя. Системное время ЦП — это время, потраченное ядром, выполняющемся в системном режиме, для процесса (например, на обработку системных вызовов). Команда time(1) позволяет определить количество процессорного времени, затраченного при выполнении программы. Программа может определить количество потраченного процессорного времени с помощью times(2), getrusage(2) или clock(3).

Аппаратные часы

В большинстве компьютеров (оснащённых батареей) имеются аппаратные часы, которые ядро читает при запуске для инициализации программных часов. Подробности смотрите в rtc(4) и hwclock(8).

Программные часы, HZ и миги (jiffies)

Точность различных системных вызовов, которые задают время ожидания (timeouts) (например, select(2), sigtimedwait(2)) и измеряют процессорное время (например, getrusage(2)), ограничена точностью программных часов (software clock) — часов, поддерживаемых ядром, у которых время измеряется в мигах (jiffies). Размер мига определяется значением константы ядра HZ.

Значение HZ различно в разных версиях ядра и аппаратных платформах. Для i386: в ядрах до версии 2.4.x включительно, HZ равно 100, то есть значение мига равно 0.01 секунды; начиная с версии 2.6.0 значение HZ увеличено до 1000 и миг равен 0.001 секунды. Начиная с ядра 2.6.13 значение HZ задаётся в параметре настройки ядра и может быть равно 100, 250 (по умолчанию) или 1000, что делает значение мига равным, соответственно, 0.01, 0.004 или 0.001 секунды. Начиная с ядра 2.6.20 добавлено ещё одна частота: 300, количество, которое делится нацело на распространённые частоты видеокадров (PAL — 25 HZ; NTSC — 30 HZ).

Системный вызов times(2) — это особый случай. Он выдаёт время с точностью, определяемой константой ядра USER_HZ. Приложения пользовательского пространства могут определить значение этой константы с помощью sysconf(_SC_CLK_TCK).

Таймеры высокой точности

До Linux 2.6.21 точность системных вызовов таймера и сна (смотрите далее) была ограничена размером мига.

Начиная с Linux 2.6.21, Linux поддерживает таймеры высокой точности (HRT), включаемые через CONFIG_HIGH_RES_TIMERS. В системе, которая поддерживает HRT, точность сна и таймеров в системных вызовах больше не ограничена мигом, а только точностью аппаратуры (в современной аппаратуре, обычно, микросекундная точность). Вы можете определить поддерживаются ли таймеры высокой точности, проверив результат вызова clock_getres(2) или поискав записи «resolution» в /proc/timer_list.

HRT поддерживаются не на всех аппаратных архитектурах (среди имеющих отметим x86, arm и powerpc).

Эпоха

В системах UNIX время считается в секундах и начинается с эпохи (Epoch), 1970-01-01 00:00:00 +0000 (UTC).

Программа может определить календарное время c помощью вызова gettimeofday(2), который возвращает время (в секундах и микросекундах), прошедшее с начала эпохи; вызов time(2) выдаёт подобную информацию, но с точностью только до ближайшей секунды. Системное время можно изменять с помощью settimeofday(2).

Календарное время, разделённое на компоненты

Некоторые библиотечные функции используют структуру с типом tm для представления календарного времени, разделённого на компоненты (broken-down time), в которой время хранится в виде отдельных составляющих (год, месяц, день, час, минута, секунда и т. д.). Эта структура описана в ctime(3), в которой также описаны функции, преобразующие календарное время в разделённое на компоненты и обратно. Функции представления календарного времени, разделённого на компоненты, в печатную строку описаны в ctime(3), strftime(3) и strptime(3).

Таймеры сна и их установка

Различные системные вызовы и функции позволяют программе спать (приостанавливать выполнение) заданный промежуток времени; смотрите nanosleep(2), clock_nanosleep(2) и sleep(3).

Различные системные вызовы позволяют процессу устанавливать таймеры, которые срабатывают в какой-то момент в будущем, и, возможно, через определённые интервалы; смотрите alarm(2), getitimer(2), timerfd_create(2) и timer_create(2).

Допуск таймера

Начиная с Linux 2.6.28, возможно контролировать значение «допуска таймера» (timer slack) нити. Допуск таймера — это промежуток времени, на который ядро может задержать пробуждение определённых системных вызовов, заблокированных на время. Эта задержка позволяет ядру объединять события пробуждения, таким образом сокращая количество системных пробуждений и экономя энергию. Подробней смотрите описание PR_SET_TIMERSLACK в prctl(2).