Уведомления ввода/вывода
Функция ionotify() — средство, с помощью которого клиентский поток может запрашивать асинхронную передачу события. На основе этой функции реализуются многие асинхронные службы POSIX (например, mq_notify() и клиентская часть функции select()). При выполнении операции ввода/вывода на файловый дескриптор (fd) поток может ожидать завершения события ввода/вывода (для функции write()) или приема данных (для функции read()). Вместо блокировки потока на процессе администратора ресурсов, обслуживающем запрос чтения/записи, функция ionotify() позволяет клиентскому потоку сообщить администратору ресурсов о том, какого именно события он ожидает при возникновении заданных условий ввода/вывода. Такое ожидание позволяет потоку реагировать на другие источники событий, кроме заданного запроса ввода/вывода, при этом продолжая свое выполнение.
Вызов select() реализуется с помощью уведомления ввода/вывода и позволяет потоку блокироваться в ожидании группы событий ввода/вывода на множестве файловых дескрипторов, сохраняя возможность реагировать на другие формы межзадачного взаимодействия.
Список условий, при которых запрошенное событие может быть доставлено:
· _NOTIFY_COND_OUTPUT — в буфере вывода имеется свободное пространство;
· _NOTIFY_COND_INPUT — объем данных, указанный администратором ресурсов, доступен для чтения;
· _NOTIFY_OUT_OF_BAND — имеются данные "вне полосы пропускания". Объем данных задан администратором ресурсов.
Сигналы
ОС QNX Neutrino поддерживает как 32 стандартных сигнала стандарта POSIX (аналогичные UNIX-сигналам), так и сигналы реального времени стандарта POSIX. Нумерация обоих наборов сигналов организована на основе набора из 64 однотипных сигналов, реализованных в ядре. Хотя сигналы реального времени в стандарте POSIX отличаются от UNIX-сигналов (во-первых, тем, что они могут содержать 4 байта данных и 1 байт кода, и, во-вторых, тем, что их можно ставить в очередь на передачу), каждый из них можно использовать по отдельности, а комбинированный набор сигналов всегда будет соответствовать стандарту POSIX.
Кроме того, ОС QNX Neutrino расширяет механизмы передачи сигналов стандарта POSIX благодаря тому, что позволяет направлять сигналы отдельным потокам, а не всему процессу, содержащему их. Поскольку сигналы — это асинхронные события, они также реализуются посредством механизмов передачи событий.
Таблица 2.13. Вызовы микроядра и соответствующие POSIX-вызовы
Вызов микроядра | POSIX-вызов | Описание |
SignalKill() | kill(), pthread_kill(), raise(), sigqueue() | Установить сигнал на группе процессов, процессе или потоке |
SignalAction() | sigaction() | Определить действие, выполняемое при получении сигнала |
SignalProcmask() | sigprocmask(), pthread_sigmask() | Изменить маску сигналов потока |
SignalSuspend() | sigsuspend(), pause() | Блокироваться до тех пор, пока сигнал не вызовет обработчик сигнала |
SignalWartinfo() | sigwaitinfoQ | Ожидать сигнала. После получения сигнала вернуть информацию о нем |
Изначальная спецификация стандарта POSIX предусматривала применение сигналов только для процессов. Для многопоточных процессов устанавливаются определенные правила.
· Операции с сигналами выполняются на уровне процессов. Если поток игнорирует или перехватывает сигнал, то он применяется ко всем потокам внутри процесса.
· Маска сигналов применяется на уровне потоков. Если поток маскирует сигнал, то это маскирование относится только к этому потоку.
· Непроигнорированный (un-ignored) сигнал, направленный некоторому потоку, передается только этому потоку.
· Непроигнорированный сигнал, направленный некоторому процессу, передается первому потоку, в котором этот сигнал немаскирован. Если все потоки маскировали этот сигнал, он будет поставлен в очередь на этот процесс до тех пор, пока какой-либо поток не игнорирует или демаскирует его. Если сигнал проигнорирован, он снимается с процесса. Если сигнал демаскирован, он перемещается с процесса на поток, который демаскировал его.
В стандарте POSIX существует принцип очередности сигналов реального времени. В ОС QNX Neutrino любые сигналы, не только сигналы реального времени, могут ставиться в очередь. Внутри процесса постановка в очередь может выполняться по отдельным сигналам. С каждым сигналом может быть связано 8 битов кода и 32-битовое значение,
В этом отношении сигналы очень похожи на импульсы, описанные ранее. В ядре это сходство используется оптимальным образом посредством применения общего кода для управления как сигналами, так и импульсами. Номер сигнала преобразуется в приоритет импульса с помощью _SIGMAX - signo. В результате сигналы передаются в порядке своих приоритетов — чем меньше номер сигнала, тем выше приоритет. Такой метод соответствует стандарту POSIX, который утверждает, что существующие сигналы имеют более высокий приоритет, чем новые сигналы реального времени.
Дата добавления: 2017-01-29; просмотров: 591;