다음을 통해 공유


디바이스 전용 스레드

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

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

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

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

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