Device-Dedicated 스레드
느린 디바이스의 드라이버 또는 거의 사용되지 않는 디바이스(플로피 컨트롤러 등)는 디바이스 전용 시스템 스레드를 만들어 많은 "대기 중" 문제를 해결할 수 있습니다. 또한 대부분의 파일 시스템 드라이버는 시스템 작업자 스레드를 사용하고 작업자-스레드 콜백 루틴을 제공합니다.
디바이스 드라이버에 자체 스레드 컨텍스트가 있거나 시스템 스레드 컨텍스트에서 실행 중인 경우 디바이스 전용 스레드 또는 최상위 드라이버의 작업자-스레드 콜백 루틴은 드라이버 디바이스 확장의 공유 통신 영역에서 이벤트 개체 또는 세마포 개체와 같은 디스패처 개체에 대한 작업을 동기화할 수 있습니다. 예를 들어 디바이스 전용 스레드는 공유 디스패처 개체를 대기할 수 있지만 스레드의 디바이스가 사용되지 않는 동안 세마포에 대해 KeWaitForSingleObject 를 호출합니다. I/O 작업을 수행하기 위해 디바이스 드라이버가 호출될 때까지(이 시점에서 세마포를 신호됨 상태로 설정) 대기 스레드는 CPU 시간을 사용하지 않습니다.
드라이버는 PsCreateSystemThread 를 호출하여 드라이버 또는 디바이스 전용 스레드를 만든 다음 , KeSetBasePriorityThread 를 호출하여 스레드의 기본 우선 순위를 설정할 수 있습니다. 드라이버는 SMP 컴퓨터 에서 런타임 우선 순위 반전을 방지하는 우선 순위 값을 지정해야 합니다. 즉, 드라이버에서 만든 스레드의 기본 우선 순위를 너무 높게 설정하면 해당 드라이버에 대한 I/O 요청을 제출하는 우선 순위가 낮은 스레드의 실행에 지연이 발생할 수 있습니다.
스레드 개체 자체는 디스패처 개체의 형식이므로 스레드는 다른 스레드가 완료될 때까지 기다릴 수 있습니다. 스레드와 연결된 스레드 개체 포인터를 가져오기 위해 드라이버는 ObReferenceObjectByHandle을 호출하여 PsCreateSystemThread에서 받은 스레드 핸들을 전달할 수 있습니다.
스레드는 KeDelayExecutionThread 를 호출하여 전체 시간 조각 이상이 될 수 있는 간격을 기다릴 수 있습니다. KeDelayExecutionThread 간격의 세분성은 약 10밀리초입니다. KeDelayExecutionThread는 타이머 기반 루틴이므로 플랫폼에 따라 간격의 세분성이 10밀리초보다 약간 빠르거나 느립니다.