다음을 통해 공유


스레드 DPC 개요

스레드 DPC는 Windows Vista 이상 버전의 Windows에서 사용할 수 있습니다.

스레드된 DPC는 시스템이 IRQL에서 PASSIVE_LEVEL 동일한 DPC입니다. 스레드 DPC는 기본적으로 사용하도록 설정되어 있지만 HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable 레지스트리 키를 0으로 설정하여 사용하지 않도록 설정할 수 있습니다. 스레드된 DPC를 사용하지 않도록 설정하면 일반 DPC로 실행됩니다.

일반 DPC는 모든 스레드의 실행을 선점하며 스레드 또는 다른 DPC에서 선점할 수 없습니다. 시스템에 대기 중인 일반 DPC 수가 많거나 해당 DPC 중 하나가 오랫동안 실행되는 경우 모든 스레드는 임의로 오랫동안 일시 중지된 상태로 유지됩니다. 따라서 각 일반 DPC는 시스템 대기 시간을 증가하여 오디오 또는 비디오 재생과 같은 시간에 민감한 애플리케이션의 성능을 저하할 수 있습니다.

반대로 스레드된 DPC는 일반 DPC에 의해 선점될 수 있지만 다른 스레드에서는 선점할 수 없습니다. 따라서 특정 DPC를 선점해서는 안 되며 다른 DPC에서도 선점하지 않는 한 일반 DPC가 아닌 스레드 DPC를 사용해야 합니다.

시스템은 스레드된 DPC(및 일반 DPC)를 KDPC 구조로 나타냅니다. 스레드된 DPC에 대한 KDPC 구조를 초기화하려면 KeInitializeThreadedDpc 루틴을 호출하고 DPC의 작업을 수행하는 CustomThreadedDpc 루틴을 전달합니다.

CustomThreadedDpc 루틴은 PASSIVE_LEVEL 또는 DISPATCH_LEVEL 실행할 수 있으므로 CustomThreadedDpc 루틴이 두 IRQL에서 올바르게 동기화되는지 확인해야 합니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 동기화 및 스레드 DPC를 참조하세요.

또한 CustomThreadedDpc 루틴이 DISPATCH_LEVEL 코드에 대한 모든 제한을 준수하는지 확인해야 합니다. 스레드 DPC를 사용하는 경우 IRQL = PASSIVE_LEVEL 실행되지만 일반 DPC와 동일한 제한 사항이 적용됩니다. CustomThreadedDpc 루틴에서 호출되는 모든 함수를 포함하여 스레드된 DPC에서 실행되는 모든 코드는 DPC 환경의 제한을 준수해야 합니다. 예를 들어 코드는 KEVENT 개체와 같은 수동 수준 동기화 개체에서 차단해서는 안됩니다. 네트워킹 및 USB와 같은 많은 기존 디바이스 스택은 스레드 DPC 처리를 지원하지 않으며, PASSIVE_LEVEL 호출되는 것을 감지하면 차단을 시도할 수 있습니다. 비슷한 이유로 KMDF( 커널 모드 드라이버 프레임워크 )는 스레드 DPC 처리를 지원하지 않으며 KMDF 드라이버는 스레드 DPC를 사용하려고 하면 안 됩니다. DPC 환경에 대한 자세한 내용은 DPC 루틴 작성을 참조하세요.

스레드 DPC를 DPC 큐에 추가하려면 KeInsertQueueDpc를 호출합니다. 실행하기 전에 큐에서 스레드된 DPC를 제거하려면 KeRemoveQueueDpc를 호출합니다.