- •26. Синхронизация
- •27. Оповещения и асинхронные вызовы процедур
- •28. Структура процессов
- •Требования подсистем среды
- •29. Базовая структура процессов
- •Управление клиентскими процессами
- •Как предотвратить неправильное использование
- •52. База данных страничных фреймов
- •53. Дескрипторы виртуальных адресов
- •Соображения мультипроцессорной обработки
- •Соображения переносимости
- •Общие сведения
- •Планирование потоков
- •55. Объекты процесс ядра и поток ядра
- •56. Приоритеты планирования
- •Переключение контекста
- •57. Обработка прерываний и исключений
- •Обработчик ловушки
- •Распределение прерываний
- •58. Таблица распределения прерываний. Программные прерывания. Прерывания асинхронного вызова процедур (apc).
- •Прерывания асинхронного вызова процедуры (арс)
- •59. Распределение исключений
- •60. Многопроцессорная синхронизация
- •Синхронизация на уровне ядра
- •61. Синхронизация на уровне исполнительной системы
- •Восстановление после сбоя питания
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. А
