<<
>>

Асинхронные вызовы процедур

Другой специальный управляющий объект ядра — APC (asynchronous procedure call — асинхронный вызов процедуры). APC похожи на DPC в том плане, что они откладывают обработку системной процедуры, но в отличие от DPC, которые работают в контексте конкретного процессора, АРС выполняются в контексте конкретного потока.
При обработке нажатия клавиши не важно, в каком контексте работает DPC, поскольку DPC — это просто другая часть обработки прерывания, а прерываниям нужно только управлять физическим устройством и выполнять не зависимые от потоков операции (такие как запись данных в буфер в пространстве ядра).

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

В ближайший же удобный момент времени уровень ядра доставляет АРС потоку и планирует его выполнение. АРС разработан так, что он выглядит как неожиданный вызов процедуры, немного похожий на обработчик сигнала в UNIX. АРС режима ядра для завершения ввода-вывода выполняется в контексте того потока, который инициировал ввод-вывод (но в режиме ядра). Это дает АРС доступ как к буферу режима ядра, так и ко всему адресному пространству пользовательского режима, принадлежащему тому процессу, который содержит данный поток. Время доставки АРС зависит от того, что делает поток в данный момент (и даже от типа системы). В многопроцессорной системе получающий АРС поток может начать выполняться даже до завершения выполнения DPC.

АРС пользовательского режима можно также использовать для доставки уведомлений о завершении ввода-вывода в пользовательском режиме тому потоку, который инициировал ввод-вывод.

АРС пользовательского режима вызывает назначенную приложением процедуру пользовательского режима, но только тогда, когда целевой поток заблокирован в ядре и помечен как готовый принимать АРС. Ядро прерывает ожидание потока и делает возврат в пользовательский режим, но уже со стеком пользовательского режима и регистрами, модифицированными для выполнения процедуры диспетчеризации АРС из системной библиотеки ntdll.dll. Процедура диспетчеризации АРС вызывает процедуру пользовательского режима, которую приложение связало с операцией ввода-вывода. Помимо указания АРС пользовательского режима как средства выполнения кода по завершении ввода-вывода функция QueueUserAPC в Win32 API позволяет также использовать АРС для произвольных целей.

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

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Асинхронные вызовы процедур:

  1. АСИНХРОННОСТЬ
  2. ВЫЗОВ ВРАЧА
  3. СПТ откликается на вызов обстоятельств
  4. Быстрый вызов желаемого
  5. Бросьте себе вызов
  6. Самоубийство как вызов обществу
  7. § 14 Условное соглашение. – Предложение и вызов. – Договор посредством публичного торга или состязания. – Одностороннее обещание.
  8. Схема «Процедуры комфортизации».
  9. Схема «Процедуры комфортизации».
  10. 3. Процедуры банкротства гражданина
  11. ИТАК, ПРОЦЕДУРА КОМФОРТИЗАЦИИ.
  12. ИТАК, ПРОЦЕДУРА КОМФОРТИЗАЦИИ.
  13. 28. Процедура наблюдения