Системные вызовы для таймеров POSIX
Стандарт POSIX 1003.lb вводит новый тип программных таймеров для программ, работающих в режиме пользователя, в частности, для многопоточных приложений и приложений реального времени. Эти таймеры нередко называются таймерами POSIX.
Любая реализация таймеров POSIX должна предлагать программам пользовательского режима часы POSIX, т. е. виртуальные источники отсчета времени, имеющие заранее определенную точность и другие свойства. Всякий раз, когда приложению нужно воспользоваться таймером POSIX, оно создает новый таймерный ресурс, выбирая из существующих часов POSIX в качестве базы для хронометрирования. Системные вызовы, позволяющие пользователям работать с часами и таймерами POSIX
Ядро Linux предлагает два вида часов POSIX:
- clock realtime— эти виртуальные часы представляют системные часы реального времени, фактически, переменную xtime. Точность показаний, возвращаемая системным вызовом ciock getresо, равна 999 848нс, что соответствует приблизительно 1 ООО обновлений переменной xtime в секунду;
- clock monotonic— эти виртуальные часы представляют системные часы реального времени, свободные от каких-либо искажений, связанных с синхронизацией с внешним источником времени. Фактически, эти виртуальные часы представлены суммой двух переменных: xtime и waii_ to monotonic. Точность этих часов POSIX, возвращаемая системным вызовом ciock getres , равна 999 848 наносекундам.
Ядро Linux реализует таймеры POSIX с помощью динамических таймеров. Таким образом, они аналогичны традиционным таймерам интервалов типа itimer real, описанным в предыдущем разделе. Вместе с тем, таймеры POSIX намного надежнее традиционных таймеров интервалов.
Приведем два существенных различия между ними:
- когда истекает время традиционного таймера интервалов, ядро в любом случае посылает процессу, активизировавшему таймер, сигнал sigalrm. Когда же истекает время таймера POSIX, ядро может послать сигнал лю
бого типа либо всему многопоточному приложению, либо одному заданному потоку. Ядро также может форсировать выполнение уведомляющей функции в потоке приложения, а может и ничего не предпринимать (здесь все зависит от библиотеки режима пользователя, обрабатывающей это событие);
- если время традиционного таймера интервалов истекало неоднократно, а процесс режима пользователя не мог принять сигнал (например, потому что сигнал был блокирован, или процесс не выполнялся), только первый сигнал доходит до процесса, а остальные сигналы sigalrm теряются. То же самое справедливо и в отношении таймеров POSIX, но процесс может сделать системный вызов, чтобы узнать, сколько раз истекало время таймера с момента генерирования первого сигнала.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница