Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора димана.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
8 Мб
Скачать
☆

27. Оповещения и асинхронные вызовы процедур

В некоторых ситуациях полезно позволить одному потоку асинхронно уве­домлять другой поток о необходимости остановить выполнение. Эта операция называется в исполнительной системе NT оповещением (alert) и тесно связана с синхронизацией. Представьте себе приложение базы данных, обрабатываю­щее запрос. Приложению неизвестно, находятся ли необходимые данные на локальном или на удаленном компьютере. На всякий случай приложение запус­кает два потока; один ищет данные локально, второй — по сети. Как только один из потоков найдет данные, он посылает оповещение другому потоку. В ответ на это оповещенный поток прекращает выполнение текущей операции и возвращается к исходному состоянию, готовый к выполнению новой задачи.

Оповещения не слишком широко применяются в Windows NT, помимо тех случаев, когда они используются в комбинации с другим механизмом асинхронного уведомления — асинхронным вызовам процедур (asynchronous procedure call, APC). Время от времени ОС требуется уведомлять поток о том, что он должен выполнить некоторое действие. Иногда поток должен выпол­нить определенное действие после того, как произошло некоторое событие. Например, пользователь может захотеть, чтобы Windows послала ему сообще­ние с напоминанием о времени запланированной встречи. В Windows NT этот тип асинхронного уведомления реализуется с применением APC пользователь­ского режима. Это означает, что подсистема Win32 обращается к исполнитель­ной системе NT для установки таймера и передает указатель на процедуру (APC), которая будет посылать сообщение пользователю. Когда таймер сраба­тывает, исполнительная система NT напоминает потоку подсистемы Win32 о необходимости выполнения заданной процедуры APC. После ее выполнения поток Win32 продолжает выполнять то, чем был занят раньше.

Хотя некоторые асинхронные операции генерируются программами пользовательского режима, большинство из них генерируются ОС и особенно системой ввода-вывода NT. Последняя является асинхронной, т. е. вызывающий поток может запустить операцию ввода-вывода, а потом заниматься дру­гими делами, пока устройство ввода-вывода выполняет ее. Когда оно закончит передачу данных, система ввода—вывода должна приостановить вызывающий поток и скопировать результаты операции ввода-вывода в его адресное про­странство. Для этого система ввода-вывода использует АРС режима ядра.

АРС пользовательского режима и режима ядра имеют ряд различий, но одно из них особенно важно. АРС режима ядра может в любой момент пре­рвать исполнение потока пользовательского режима и заставить его выпол­нить заданную процедуру. Обычно это происходит без ведома приложения. Генерируется программное прерывание, и, как и в случае аппаратного преры­вания, система просто на короткое время "крадет" поток приложения и застав­ляет его выполнить процедуру АРС. В противоположность этому, АРС пользо­вательского режима может быть доставлен только в определенные точки, когда запросивший его поток готов к исполнению АРС.

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

Доступ к оповещениям и АРС в API Win32 (только для NT) осуществляется через расширенные функции ввода-вывода. Расширенные функции ReadFileEx() и WriteFileEx() позволяют потоку выполнять чтение и запись файла асин­хронно, предоставив процедуру АРС, которую поток будет выполнять после завершения операции ввода-вывода. Функции WaitForSingleObjectEx и WaitForMultipleObjectsEx позволяют потоку ожидать в оповещенном состоянии в неко­торой точке после выдачи запроса ввода-вывода. Подсистема POSIX не предо­ставляет возможностей АРС для приложений POSIX, но использует АРС режима ядра для эмуляции доставки сигналов POSIX. А