Уведомления ввода/вывода

Функция 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; просмотров: 539;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.