Программирование в стандарте POSIX

       

Время


Согласно стандарту POSIX, за начало отсчета времени принимается ноль часов, ноль минут, ноль секунд первого января 1970-го года всемирного времени.

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

За стандартную единицу измерения астрономического времени в POSIX-2001 принята секунда.

Часами называется программный или аппаратный объект, который может быть использован для измерения видимого или истинного хода времени.

Показания часов можно опросить и, возможно, установить (в допустимых для часов пределах).

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

Тактом часов называются зависящие от реализации промежутки времени, на которые дробится каждая секунда.

Реальным (или астрономическим) называется время, измеренное по системным часам безотносительно к тому, какой процесс (поток управления) выполняется.

Под временем выполнения (процессорным временем) понимается время, затрачиваемое на выполнение процесса (потока управления), включая работающие от его имени системные сервисы.

Часами процессорного времени называются часы, измеряющие время выполнения конкретного процесса или потока управления.

Под виртуальным временем процесса понимается время, измеряемое системными часами, пока процесс выполняется.

таймер - это механизм, способный известить процесс (поток управления) об истечении заданного промежутка времени (интервальный таймер) или о достижении (превышении) часами заданных показаний (абсолютный таймер). Соответствующее событие называется срабатыванием таймера .

Таймером процессорного времени называется таймер, ассоциированный с часами процессорного времени.

Взвести (зарядить) - значит запустить таймер, измеряющий ход времени и позволяющий уведомить процесс о наступлении заданного момента.

Таймер снимается со взвода (разряжается), когда он перестает измерять ход времени.

Простейшим средством опроса и/или изменения текущих даты и времени является служебная программа date.


На уровне языка C опрос текущего времени ( в секундах от начала отсчета) выполняет функция time().

Если тип time_t реализован как 32-разрядное целое со знаком, то в 2038-м году наступит переполнение (так называемая проблема 2038-го года).

С функцией time() ассоциирована функция difftime(), вычисляющая (в виде значения типа double) разность в секундах между двумя моментами времени.

Узнать текущее время с большей точностью позволяет функция gettimeofday().

В необязательную часть стандарта POSIX-2001, регламентирующую работу с таймерами, входят функции, позволяющие опросить и установить показания заданных часов, а также узнать их разрешающую способность: clock_gettime(), clock_settime(), clock_getres().

Часы могут быть общесистемными, т. е. видимыми для всех процессов, или принадлежащими процессу. Все реализации должны поддерживать общесистемные часы реального времени, измеряющие время от начала отсчета и имеющие идентификатор clock_realtime.

Стандартом POSIX-2001 предусмотрено несколько способов представления данных о времени. Для выполнения преобразований между разными представлениями данных о времени служат функции gmtime(), localtime(), mktime(), strftime(), strptime(), getdate().

Для учета данных о часовом поясе и сезонных поправках используются внешние переменные tzname, timezone, daylight, значения которых устанавливает по переменной окружения tz функция tzset().

Базовым средством для работы с часами процессорного времени является функция clock(). Она возвращает в качестве результата процессорное время, затраченное процессом с некоего момента, зависящего от реализации и связанного только с его (процесса) запуском.

Чтобы перевести время, возвращаемое функцией clock(), в секунды, его следует поделить на константу CLOCKS_PER_SEC, которая определена в заголовочном файле <time.h> равной одному миллиону.

Для измерения времени выполнения простой команды можно воспользоваться служебной программой time.

Более развитыми возможностями обладает специальная встроенная в shell команда times, она выдает на стандартный вывод процессорные времена, затраченные командным интерпретатором и порожденными им процессами.



Реализация утилит time и times опирается на функцию times(), опрашивающую данные о времени выполнения вызывающего процесса и порожденных процессов. Функция times() измеряет все времена в тактах часов. Соответственно, для перевода результатов работы times() в секунды их нужно делить на sysconf (_SC_CLK_TCK) , а не на CLOCKS_PER_SEC.

Прямое манипулирование часами процессорного времени возможно после обращения к функции clock_getcpuclockid(), позволяющей выяснить их идентификатор.

Для изменения ассоциированных с файлами данных о времени служит функция utime(), оперирующая в терминах секунд от начала отсчета.

Функция sleep() позволяет приостановить выполнение процесса (потока управления) на заданное число секунд.

Более современный аналог этой функции, nanosleep(), позволяет избавиться от ограничения на максимальную длительность приостановки выполнения и получить возможность задавать эту длительность с существенно более высокой точностью.

Описываемые далее средства для работы с интервальными таймерами входят в необязательную часть стандарта POSIX-2001, именуемую "X/Open-расширение системного интерфейса"(XSI).

Реализация должна предоставлять каждому процессу по крайней мере три интервальных таймера, обозначаемых следующими идентификаторами: ITIMER_REAL (таймер реального времени, генерирует сигнал SIGALRM), ITIMER_VIRTUAL (таймер виртуального времени процесса, сигнал SIGVTALRM), ITIMER_PROF (таймер профилирования, сигнал SIGPROF).

Согласно стандарту POSIX-2001, интервальные таймеры обслуживаются функциями getitimer() и setitimer(). Функция getitimer() запоминает текущие характеристики таймера, а setitimer() взводит или снимает таймер со взвода, устанавливая новые характеристики и запоминая старые.

К теме интервальных таймеров логически примыкает функция alarm(), позволяющая вызывающему процессу заказать доставку сигнала sigalrm через заданное число секунд реального времени.


Содержание раздела