Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер для медленного устройства или устройства, которое редко используется (например, диск CD/DVD), может решить множество проблем ожидания, создав выделенный для устройства поток системы. Кроме того, большинство драйверов файловой системы используют системные рабочие потоки и предоставляют подпрограммы обратного вызова рабочих потоков.
Если драйвер устройства имеет собственный контекст потока или выполняется в контексте системного потока, он может использовать объекты синхронизации для координации. Подпрограмма обратного вызова рабочего потока, предназначенного для устройства, или потока драйвера самого высокого уровня может синхронизировать операции над объектом диспетчера, например, объектом события или объектом семафора, в области совместного использования данных расширения устройства драйвера. Например, поток, выделенный устройству, может ожидать общего объекта диспетчера, пока устройство потока не используется, вызвав KeWaitForSingleObject для семафора. Пока драйвер устройства не вызывается для выполнения операции ввода-вывода, его поток ожидания не использует время ЦП. При вызове драйвера он устанавливает семафор в состояние "Сигнальный".
Драйвер может вызвать PsCreateSystemThread для создания потока, выделенного для драйвера или устройства, а затем вызвать KeSetBasePriorityThread, чтобы задать базовый приоритет потока. Драйвер должен указать значение приоритета, которое позволяет избежать инверсии приоритета во время выполнения на компьютерах SMP. То есть установка слишком высокого базового приоритета потока, создаваемого драйвером, может создавать задержки в выполнении потоков с низким приоритетом, отправка запросов ввода-вывода которых идет через этот драйвер.
Так как объекты потоков сами по себе являются типом объекта диспетчера, поток может ожидать завершения другого потока. Чтобы получить указатель объекта потока, связанный с потоком, драйвер может вызвать ObReferenceObjectByHandle, передавая дескриптор потока, полученный от PsCreateSystemThread.
Поток может вызвать KeDelayExecutionThread , чтобы ждать интервала, который может быть срезом полного времени или более длинным. Степень детализации интервала KeDelayExecutionThread составляет около 10 миллисекунд. Так как KeDelayExecutionThread является подпрограммой, управляемой таймером, степень детализации интервала немного быстрее или медленнее 10 миллисекунд в зависимости от платформы.