다음을 통해 공유


IRP 큐 Driver-Managed

파일 시스템 드라이버를 제외하고 I/O 관리자는 디바이스 큐 개체(IRP 큐에 대한)를 드라이버가 만드는 각 디바이스 개체와 연결합니다.

대부분의 디바이스 드라이버는 I/O 관리자의 지원 루틴을 호출하여 연결된 디바이스 큐를 사용합니다. 이 루틴은 대상 디바이스 개체에 대한 디바이스 I/O 요청이 드라이버가 완료할 때 처리할 수 있는 것보다 더 빠르게 들어올 때마다 IRP를 보유합니다. 이 기술을 사용하면 IRP가 드라이버 제공 StartIo 루틴에 큐에 대기됩니다.

좋은 성능을 위해 대부분의 중간 드라이버는 IAP를 전달하여 들어오는 속도만큼 빠르게 드라이버를 낮추므로 중간 드라이버는 해당 디바이스 개체와 연결된 디바이스 큐를 거의 사용하지 않습니다.

그러나 하나 이상의 디바이스 큐, 상호 잠긴 큐 또는 취소로부터 안전한 큐를 명시적으로 설정하여 IRP의 내부 큐를 관리하도록 드라이버를 디자인할 수 있습니다. 이 방법은 드라이버가 I/O 작업과 겹치는 디바이스를 제어하는 경우에 특히 유용할 수 있습니다. 이러한 디바이스의 경우 단일 큐만 사용하여 동일한 대상 디바이스 개체에 대해 두 개 이상의 IRP의 동시 처리를 관리하기 어려울 수 있습니다.

내부 큐를 빌드하는 가장 간단한 방법은 취소 안전 IRP 큐 프레임워크를 사용하는 것입니다. 드라이버에서 선택한 큐 메커니즘을 구현할 수 있습니다. 그런 다음 IoCsqInitialize 를 사용하여 IRP 삽입 및 삭제를 처리하는 콜백 루틴 집합을 등록하고 큐를 잠그고 잠금 해제할 수 있습니다. 취소 안전 IRP 큐 프레임워크는 콜백 루틴을 사용하여 드라이버 큐에서 IRP를 안전하게 삽입하고 제거하는 IoCsqInsertIrp, IoCsqRemoveIrpIoCsqRemoveNextIrp 루틴을 제공합니다. 또한 시스템은 콜백 루틴을 사용하여 취소된 모든 IRP를 안전하게 제거합니다.

또한 다른 유형의 물리적 디바이스 집합에 대해 디바이스 컨트롤러의 드라이버에서 IRP에 대한 추가 큐를 설정하도록 선택할 수도 있습니다. 예를 들어 SCSI 포트 드라이버는 내부 큐에 디바이스 큐 개체를 사용합니다. 이 드라이버는 모두 StartIo 루틴을 가지고 있으며, HBA를 나타내기 위해 만든 디바이스 개체와 연결된 디바이스 큐 외에도 디바이스 큐 개체를 추가 큐로 설정합니다. SCSI 포트 드라이버는 추가 디바이스 큐를 사용하여 HBA 제어 SCSI 버스의 특정 논리 단위에 바인딩된 IRP를 보유합니다.

시스템 플로피 컨트롤러 드라이버는 StartIo 루틴이 없고 연동된 큐를 사용하는 드라이버의 예입니다. 이 드라이버는 드라이버와 디바이스 전용 스레드가 IRP를 삽입하고 제거하는 이중으로 연결된 상호 잠긴 큐를 설정합니다.

커널은 디바이스 큐 개체 유형을 정의합니다. 경영진 지원 구성 요소는 인터로킹된 큐에서 IRP를 삽입하고 제거하기 위한 루틴을 제공합니다. Windows XP 이상 버전의 Windows용 드라이버는 취소 안전 IRP 큐를 사용하여 IRP 큐를 처리할 수 있습니다.

다음 섹션에서는 디바이스 큐, 상호 잠긴 큐 및 취소로부터 안전한 큐를 사용하는 방법을 설명합니다.

디바이스 큐 설정 및 사용

디바이스 큐 관리

Interlocked 큐 설정 및 사용

Driver-Created 스레드를 사용하여 인터로킹된 큐 관리

취소 안전 IRP 큐