다음을 통해 공유


어떤 유형의 DPC를 사용해야 하나요?

드라이버의 디자인에 따라 다음 중 어느 것이든 가질 수 있습니다.

  • 모든 인터럽트 기반 I/O 작업을 완료하는 단일 DpcForIsr

  • 하나 이상의 CustomDpc 루틴 집합입니다.

  • DpcForIsr 및 작업별 CustomDpc 루틴 집합 모두

드라이버에 단일 DpcForIsr 루틴, CustomDpc 루틴 집합 또는 둘 다 있는지 여부는 기본 디바이스의 특성과 지원해야 하는 I/O 요청 집합에 따라 달라집니다.

가장 낮은 수준의 디바이스 드라이버에는 각 디바이스에서 하나 이상의 작업이 필요한 각 IRP에 대한 I/O 처리를 완료하는 단일 DpcForIsr 루틴이 있습니다. 단일 DpcForIsr 를 사용하여 한 번에 하나의 작업을 수행하는 디바이스에서 요청당 인터럽트 기반 I/O 작업을 완료하는 것은 비교적 쉽습니다. 이러한 드라이버의 ISR은 각 인터럽트 기반 I/O 작업에 대해서만 IoRequestDpc 를 호출해야 합니다.

디바이스가 다양한 인터럽트 기반 I/O 작업을 완료하는 데 둘 이상의 DPC가 필요하지 않은 한 가장 낮은 수준의 드라이버는 CustomDpc 루틴을 가지고 있습니다.

단일 DpcForIsr 를 사용하여 동시에 작업을 수행할 수 있는 디바이스에서 겹치는 인터럽트 기반 I/O 작업을 완료하는 것은 신중한 설계로 가능하지만 상대적으로 어려울 수 있습니다. ISR은 DpcForIsr를 큐에 대기하는 것 외에도 KeInsertQueueDpc를 호출하여 드라이버에서 제공하는 작업별 CustomDpc 루틴 집합을 큐에 대기할 수 있습니다.

예를 들어 직렬 드라이버 작성과 관련된 몇 가지 디자인 문제를 고려합니다. 전체 이중 디바이스의 드라이버인 직렬 드라이버는 IRP가 StartIo 루틴에 큐에 대기하는 순서와 멀티태스킹 다중 프로세서 시스템에서 디바이스의 인터럽트 시퀀스 간의 일대일 대응을 사용할 수 없습니다. 또한 직렬 드라이버는 이전에 요청한 작업을 취소하고 버퍼링된 데이터를 제거하는 등 타이밍 초과 요청 및 비동기 사용자 생성 요청을 처리해야 합니다.

따라서 직렬 드라이버는 사용자 모드 COM 포트 애플리케이션이 요청할 수 있는 읽기, 쓰기, 제거 및 대기 작업에 대한 내부 큐를 유지할 수 있습니다. 또한 참조 수를 유지 관리하거나 내부 큐의 IRP에 대해 플래그 집합과 같은 다른 추적 메커니즘을 사용할 수도 있습니다. ISR은 드라이버가 할당하고 초기화된 여러 DPC 개체를 사용하여 KeInsertQueueDpc 를 호출하며, 각 개체는 드라이버 제공 CustomDpc 루틴과 연결됩니다.