Device-Dedicated 스레드

느린 디바이스의 드라이버 또는 거의 사용되지 않는 디바이스(예: 플로피 컨트롤러)는 디바이스 전용 시스템 스레드를 만들어 많은 "대기 중" 문제를 해결할 수 있습니다. 또한 대부분의 파일 시스템 드라이버는 시스템 작업자 스레드를 사용하고 작업자 스레드 콜백 루틴을 제공합니다.

디바이스 드라이버에 자체 스레드 컨텍스트가 있거나 시스템 스레드 컨텍스트에서 실행 중인 경우 디바이스 전용 스레드 또는 최상위 드라이버의 작업자-스레드 콜백 루틴은 드라이버 디바이스 확장의 공유 통신 영역에서 이벤트 개체 또는 세마포 개체와 같은 디스패처 개체의 작업을 동기화할 수 있습니다. 예를 들어 디바이스 전용 스레드는 세마포에 대해 KeWaitForSingleObject 를 호출하여 스레드의 디바이스가 사용되지 않는 동안 공유 디스패처 개체를 기다릴 수 있습니다. I/O 작업을 수행하기 위해 디바이스 드라이버가 호출될 때까지(이 시점에서 세마포를 신호됨 상태로 설정) 대기 스레드는 CPU 시간을 사용하지 않습니다.

드라이버는 PsCreateSystemThread 를 호출하여 드라이버 또는 디바이스 전용 스레드를 만든 다음 KeSetBasePriorityThread 를 호출하여 스레드의 기본 우선 순위를 설정할 수 있습니다. 드라이버는 SMP 컴퓨터 에서 런타임 우선 순위 반전을 방지하는 우선 순위 값을 지정해야 합니다. 즉, 드라이버에서 만든 스레드의 기본 우선 순위를 너무 높게 설정하면 해당 드라이버에 대한 I/O 요청을 제출하는 우선 순위가 낮은 스레드의 실행에 지연이 발생할 수 있습니다.

스레드 개체는 자체 디스패처 개체의 형식이므로 스레드는 다른 스레드가 완료되기를 기다릴 수 있습니다. 스레드와 연결된 스레드 개체 포인터를 가져오기 위해 드라이버는 ObReferenceObjectByHandle을 호출하여 PsCreateSystemThread에서 받은 스레드 핸들을 전달할 수 있습니다.

스레드는 KeDelayExecutionThread 를 호출하여 전체 시간 조각 이상이 될 수 있는 간격을 기다릴 수 있습니다. KeDelayExecutionThread 간격의 세분성은 약 10밀리초입니다. KeDelayExecutionThread는 타이머 기반 루틴이므로 해당 간격의 세분성은 플랫폼에 따라 10밀리초보다 약간 빠르거나 느립니다.