I/O 큐에 대한 디스패치 모드 구성

경고

UMDF 2는 UMDF의 최신 버전이며 UMDF 1을 대체합니다. 모든 새 UMDF 드라이버는 UMDF 2를 사용하여 작성해야 합니다. UMDF 1에 새 기능이 추가되지 않으며 최신 버전의 Windows 10 UMDF 1에 대한 지원이 제한됩니다. 유니버설 Windows 드라이버는 UMDF 2를 사용해야 합니다.

보관된 UMDF 1 샘플은 Windows 11 버전 22H2 - 2022년 5월 드라이버 샘플 업데이트에서 찾을 수 있습니다.

자세한 내용은 UMDF를 사용하여 시작 참조하세요.

애플리케이션의 I/O 요청이 도착하면 프레임워크는 각 요청을 적절한 I/O 큐에 배치합니다. 드라이버에 요청이 전달되는 방법과 시기는 드라이버가 I/O 큐에 대한 디스패치를 구성하는 방법과 드라이버가 콜백 함수 동기화를 지정하는 방법에 따라 달라집니다. I/O 큐는 디바이스가 적절한 상태에 도달할 때까지 큐에 I/O 요청을 보관하기 위해 UMDF의 PnP 및 전원 관리 하위 시스템과도 상호 작용합니다.

참고 I/O 큐의 디스패치 모드는 동기화 모드와 관련이 없습니다. I/O 큐의 디스패치 구성은 드라이버가 지정된 시간에 처리를 위해 수락할 수 있는 요청 수를 제어하는 반면 동기화는 요청을 표시하거나 취소하는 이벤트 콜백 함수의 동시 실행을 제어합니다. 그러나 디스패치 및 동기화 모드를 결합하여 여러 작업 모드를 만듭니다.

드라이버는 드라이버가 IWDFDevice::CreateIoQueue 메서드를 호출하여 기본 큐를 구성하거나 보조 큐를 만들 때 I/O 큐에 대한 디스패치를 구성합니다. 드라이버는 IWDFDevice::CreateIoQueueDispatchType 매개 변수에서 WDF_IO_QUEUE_DISPATCH_TYPE 열거형 형식의 값 중 하나를 지정하여 디스패치 모드를 식별할 수 있습니다. I/O 큐 개체는 다음 디스패치 모드를 지원할 수 있습니다.

  • 순차

    순차 디스패치 모드는 WdfIoQueueDispatchSequential 값을 사용하여 지정됩니다. 이 디스패치 모드에서 처리 상태의 큐는 드라이버가 한 번에 하나의 요청만 처리할 수 있도록 이벤트를 발생합니다. 큐는 드라이버가 현재 요청 처리를 완료하거나 IWDFIoRequest::ForwardToIoQueue 메서드를 호출하여 요청을 다시 큐에 추가할 때까지 추가 요청을 연기합니다. 현재 요청이 완료되거나 전달되면 큐는 다음 요청을 제공하기 위해 이벤트를 발생합니다.

  • 병렬

    병렬 디스패치 모드는 WdfIoQueueDispatchParallel 값을 사용하여 지정됩니다. 이 디스패치 모드에서 처리 상태의 큐는 I/O 요청이 드라이버에 대해 준비되는 즉시 이벤트를 발생합니다. 드라이버가 I/O 요청을 받으면 드라이버는 다음 방법 중 하나로 I/O 요청을 처리할 수 있습니다.

    • 드라이버는 IWDFIoRequest::Complete 또는 IWDFIoRequest::CompleteWithInformation 메서드를 호출하여 I/O 요청을 즉시 완료합니다. I/O 요청이 유효하지 않거나, 서비스를 받을 수 없거나, 데이터가 있는 버퍼 또는 캐시에서 데이터를 복사하여 완료할 수 있는 경우 드라이버는 I/O 요청을 즉시 완료합니다.
    • 드라이버는 IWDFIoRequest::ForwardToIoQueue 메서드를 호출하여 I/O 요청을 다시 큐에 추가합니다.
    • 드라이버는 IWDFIoRequest::Send 메서드를 호출하여 I/O 요청을 하위 수준 드라이버에 전달합니다.
  • 수동

    수동 디스패치 모드는 WdfIoQueueDispatchManual 값을 사용하여 지정됩니다. 이 디스패치 모드에서는 요청이 큐에 도착하면 I/O 큐가 드라이버에 자동으로 알리지 않습니다. 드라이버는 큐에서 요청을 수동으로 검색하려면 IWDFIoQueue::RetrieveNextRequest 메서드를 호출해야 합니다. 폴링 모델입니다.

    UMDF 버전 1.9 이상에서 드라이버가 수동 디스패치 모드를 사용하는 경우 IWDFIoRequest2::Requeue 를 호출하여 드라이버가 가져온 I/O 큐의 헤드에 I/O 요청을 반환할 수 있습니다. IWDFIoRequest2::Requeue를 호출한 후 IWDFIoQueue::RetrieveNextRequest에 대한 드라이버의 다음 호출은 다시 큐에 넣은 요청을 검색합니다.

모든 디스패치 모드의 경우 I/O 큐 개체 는 드라이버가 요청을 처리하거나 요청이 취소될 때까지 요청을 수신하고 추적합니다.

드라이버가 직렬 또는 병렬 디스패치를 위해 큐를 구성하는 경우 프레임워크는 드라이버가 큐를 만들거나 기본 큐를 구성할 때 드라이버가 등록한 콜백 함수를 통해 요청의 드라이버를 알 수 있습니다. 자세한 내용은 I/O 큐 이벤트 콜백 함수를 참조하세요.