다음을 통해 공유


UMDF 드라이버에서 디바이스 풀링 사용

User-Mode 드라이버 프레임워크(UMDF) 버전 1.11 및 2.0

User-Mode 드라이버 프레임워크(UMDF) 드라이버가 버전 1.11 또는 2.0으로 빌드되고 Windows 8 이상에서 실행되는 경우 프레임워크는 여러 디바이스 스택을 호스트할 수 있는 Wudfhost의 단일 인스턴스를 만듭니다. 이 기술은 디바이스 풀링이라고 합니다. 디바이스 풀링의 주요 이점은 여러 UMDF 디바이스가 있는 환경에서 메모리 사용량을 줄이는 것입니다.

풀된 디바이스가 실패하면 프레임워크는 Wudfhost 인스턴스를 종료하고 이전에 풀에 있던 모든 디바이스를 다시 시작하려고 시도합니다. 풀되는 동안 디바이스가 다시 실패하면 프레임워크는 디바이스에 대해 별도의 Wudfhost 프로세스를 만들고 디바이스를 다시 시작하려고 시도합니다.

별도의 호스트 프로세스에서 디바이스가 실패하는 경우 프레임워크는 디바이스를 최대 5번 다시 시작하려고 시도합니다. 프레임워크는 마지막 오류 이후 30분이 경과하면 디바이스 오류 수를 1로 다시 설정합니다.

시스템이 다시 부팅되면 프레임워크는 별도의 프로세스에서 실행하는 동안 실패한 디바이스를 제외하고 디바이스를 다시 풀합니다.

특정 디바이스에 대해 디바이스 풀링을 사용하지 않도록 설정하려면 INF의 WDF별 DDInstall 섹션에서 UmdfHostProcessSharing 지시문을 사용합니다. UmdfHostProcessSharing에 대한 자세한 내용은 INF 파일에서 WDF 지시문 지정을 참조하세요.

드라이버에서 직접 I/O를 사용하는 경우 UmdfHostProcessSharingProcessSharingDisabled로 설정해야 합니다. 드라이버가 시작하지 않을 수 있으니 주의하십시오. WdfDeviceIoBufferedOrDirect 선택하고 디바이스가 풀링된 경우, 프레임워크는 버퍼 액세스 메서드를 버퍼링된 I/O로 변경합니다. WdfDeviceIoBufferedOrDirect 선택되고 디바이스가 풀링되지 않은 경우 프레임워크는 버퍼 액세스 메서드를 직접 I/O로 변경합니다.

버퍼 액세스 방법을 선택하려면 드라이버가 IDriverEntry::OnDeviceAdd 콜백 함수에서 IWDFDeviceInitialize2::SetIoTypePreference 메서드를 호출해야 합니다. 정보에 대한 액세스 방법을 확인하려면 드라이버의 데이터 버퍼 액세스 섹션 UMDF-Based을 참조하세요.

UMDF 버전 1.9 이하

드라이버가 UMDF 버전 1.9 이전 버전으로 빌드된 경우 프레임워크는 각 디바이스 스택에 대한 호스트 프로세스(Wudfhost)의 별도 인스턴스를 만듭니다.

디바이스를 시작하지 못하면 프레임워크는 디바이스를 최대 5번 다시 시작하려고 시도합니다. 프레임워크는 마지막 오류 이후 30분이 경과하면 디바이스 오류 수를 1로 다시 설정합니다.

풀되지 않은 환경에서 여러 디바이스 스택이 동일한 UMDF 드라이버를 공유하는 경우:

  • 각 디바이스 스택은 별도의 WudfHost 프로세스에서 로드됩니다.
  • 프레임워크는 드라이버의 IDriverEntry::OnInitialize 호출하고 각 장치 스택에 대해 IDriverEntry::OnDeinitialize 메서드를 한 번 호출합니다.
  • 프레임워크는 각 장치 스택에 대해 드라이버의 IDriverEntry::OnDeviceAdd 메서드를 한 번 호출합니다. 각 디바이스 개체는 별도의 드라이버 개체와 연결됩니다.

풀된 환경에서 여러 디바이스 스택이 동일한 사용자 모드 드라이버를 공유하는 경우:

  • 각 디바이스 스택은 동일한 WudfHost 프로세스에서 로드됩니다.
  • 프레임워크는 드라이버의 IDriverEntry::OnInitialize 호출하고 IDriverEntry::OnDeinitialize 메서드를 한 번만 호출합니다.
  • 프레임워크는 각 장치 스택에 대해 드라이버의 IDriverEntry::OnDeviceAdd 메서드를 한 번 호출합니다. 각 디바이스 개체는 동일한 드라이버 개체와 연결됩니다.

풀된 구성에 드라이버 개체가 하나만 있으므로 드라이버가 디바이스별 컨텍스트를 전역 변수 또는 드라이버 콜백 개체와 같이 디바이스 간에 공유되는 개체에 저장해서는 안 됩니다. 대신 드라이버는 디바이스 스택 간에 공유되지 않는 개체(예: 드라이버의 디바이스 콜백 개체)에 디바이스별 컨텍스트를 저장해야 합니다.