Поделиться через


Потоки Device-Dedicated

Драйвер медленного устройства или устройства, которое редко используется (например, контроллер гибких дисков), может решить многие проблемы ожидания путем создания выделенного устройства системного потока. Кроме того, большинство драйверов файловой системы используют системные рабочие потоки и предоставляют процедуры обратного вызова рабочего потока.

Если драйвер устройства имеет собственный контекст потока или работает в контексте системного потока, выделенный для устройства поток или подпрограмма обратного вызова рабочего потока драйвера самого высокого уровня может синхронизировать операции с объектом диспетчера, таким как объект события или объект семафора, в общей области связи расширения устройства драйвера. Например, выделенный для устройства поток может ждать объекта общего диспетчера, пока устройство потока не используется, вызывая KeWaitForSingleObject для семафора. Пока драйвер устройства не вызывается для выполнения операции ввода-вывода (в этот момент семафор задается в состояние Signaled), его поток ожидания не использует время ЦП.

Драйвер может вызвать PsCreateSystemThread , чтобы создать выделенный драйвером или устройством поток, а затем вызвать KeSetBasePriorityThread , чтобы задать базовый приоритет потока. Драйвер должен указать значение приоритета, которое позволяет избежать инверсий приоритета во время выполнения на компьютерах SMP. То есть установка слишком высокого базового приоритета потока, созданного драйвером, может создать задержки при выполнении потоков с более низким приоритетом, которые передают запросы ввода-вывода для этого драйвера.

Поскольку объекты потока сами по себе являются типом объекта диспетчера, поток может ждать завершения другого потока. Чтобы получить указатель объекта потока, связанный с потоком, драйвер может вызвать ObReferenceObjectByHandle, передав дескриптор потока, полученный из PsCreateSystemThread.

Поток может вызвать KeDelayExecutionThread для ожидания интервала, который может быть срезом полного времени или более длинным. Степень детализации интервала KeDelayExecutionThread составляет около 10 миллисекунд. Так как KeDelayExecutionThread является подпрограммой на основе таймера, степень детализации интервала немного быстрее или медленнее, чем 10 миллисекунд в зависимости от платформы.