Рефераты | Рефераты по информатике, программированию | Эффективная многопоточность
Эффективная многопоточность
Категория реферата: Рефераты по информатике, программированию
Теги реферата: аристотель реферат, реферати українською
Добавил(а) на сайт: Bonch-Bruevich.
А почему функции DPC не могут
генерировать страничные ошибки? Дело в том, что DPC и APC ставятся в очередь
системой с помощью программного прерывания и обрабатываются на определенном
уровне прерываний IRQL – interrupt request level. IRQL DPC совпадает с IRQL
dispatch, на котором обрабатываются страничные ошибки (он даже называется
DPC/dispatch, чтобы отразить это). Как только система поднимает текущий
уровень до DPC/dispatch, все прерывания с меньшим или равным уровнем
маскируются (блокируются). После обработки DPC система понижает уровень и, если в очереди находиться еще один DPC-запрос, вновь генерируется программное
прерывание. Если при обработке DPC-запроса случится обращение к странице
памяти, не находящейся в физической памяти, система не сможет «подкачать» эту
страницу с диска. Уровень прерывания IRQL APC ниже DPC/dispatch, так что APC
могут свободно наслаждаться всеми прелестями виртуального адресного
пространства процесса.
APC бывают двух видов: режима ядра и пользовательского
режима. APC режима ядра отличается от APC пользовательского режима тем, что
система может прервать работу потока для вызова процедуры без его ведома, тогда
как для исполнения APC пользовательского режима поток должен находится в
специальном «тревожном» (alertable) ожидании, как бы давая согласие на
исполнение процедуры. Объект "очередь" и его производный объект
"порт завершения ввода/вывода" специально предназначены для
организации пула и, кроме очереди запросов, могут управлять ассоциированными с
ними потоками. Давайте рассмотрим APC пользовательского режима и порт
завершения ввода/вывода более подробно.
APC пользовательского режима
Этот механизм можно использовать, если нужно выполнить
какую-либо операцию (функцию) в контексте определенного потока. Для выполнения
функции поток должен «дать согласие», перейдя в состояние тревожного ожидания
(alertable wait state). Если поток находится в таком состоянии, то, как только
мы поставим в очередь APC-запрос с указанием адреса функции и произвольного
параметра для нее, поток перейдет к выполнению данной функции, после чего
выйдет из состояния ожидания. APC пользовательского режима могут использовать
функции ReadFileEx, WriteFileEx, а также SetWaitableTimer, о которой мы
поговорим отдельно. Функции ReadFileEx и WriteFileEx предназначены специально
для асинхронных операций – для них вы обязаны открывать файл (файл в самом
общем смысле) в асинхронном режиме, указывая флаг FILE_FLAG_OVERLAPPED, а также
для каждой операции создавать структуру OVERLAPPED. В качестве последнего
параметра обе функции принимают адрес специальной функции завершения –
FileIOCompletionRoutine. После завершения асинхронной операции, если поток
находится в тревожном ожидании, эта функция будет вызвана с помощью механизма
APC. В тревожное ожидание поток может перейти с помощью «расширенных» функций
ожидания, которые оканчиваются на Ex. Это SleepEx, WaitForSingleObjectEx, WaitForMultipleObjectsEx и другие. Для того чтобы вручную поместить APC-запрос
в очередь потока, нужно воспользоваться функцией QueueUserAPC. Вот ее прототип:
DWORD QueueUserAPC(
PAPCFUNC pfnAPC, // APC функция
HANDLE hThread, // хендл потока
ULONG_PTR dwData // параметр APC функции
);
Рассмотрим небольшой пример ее использования (проверка
ошибок устранена для повышения наглядности).