Higher-Level 드라이버의 StartIo 루틴
상위 수준 드라이버는 StartIo 루틴을 가질 수 있습니다. 그러나 이러한 드라이버는 기존 하위 수준 드라이버와 상호 운용될 가능성이 낮으며 성능 특성이 저하될 수 있습니다.
상위 수준 드라이버의 StartIo 루틴에는 다음과 같은 효과가 있습니다.
들어오는 IRP는 드라이버의 디스패치Xxx 루틴에서 IoStartPacket을 호출하고 IoCompletion 루틴에서 IoStartNextPacket을 호출하여 큐 에 대기할 수 있으므로 StartIo 루틴을 통해 한 번에 하나씩 IRP가 처리됩니다.
드라이버의 I/O 처리량은 StartIo 루틴이 병목 상태가 될 수 있으므로 I/O 수요가 많은 기간 동안 눈에 띄게 느려질 수 있습니다.
드라이버의 StartIo 루틴은 IRQL = DISPATCH_LEVEL 각 IRP를 사용하여 IoCallDriver 를 호출하므로 모든 하위 수준 드라이버의 디스패치 루틴도 IRQL = DISPATCH_LEVEL 실행됩니다. 이렇게 하면 낮은 드라이버가 디스패치 루틴에서 호출할 수 있는 지원 루틴 집합이 제한됩니다. 대부분의 드라이버 작성기는 드라이버의 디스패치 루틴이 IRQL < DISPATCH_LEVEL 실행된다고 가정하기 때문에 상위 수준 드라이버는 기존의 많은 하위 수준 드라이버와 상호 운용될 가능성이 낮습니다.
StartIo 루틴은 체인에 있는 모든 하위 수준 드라이버의 디스패치 루틴이 IRQL = DISPATCH_LEVEL 실행되므로 전체 시스템 처리량을 줄입니다.
표준 드라이버 루틴이 실행되는 IRQL에 대한 자세한 내용은 하드웨어 우선 순위 관리를 참조하세요.
시스템에서 제공하는 상위 수준 드라이버 중 어느 것도 StartIo 루틴이 없습니다. 드라이버 자체, 위와 아래의 모든 드라이버 및 시스템 전체에 대한 IRP 처리 속도가 느려질 수 있기 때문입니다.
대부분의 상위 수준 드라이버는 단순히 디스패치 루틴에서 하위 수준 드라이버로 IRP를 보내고 IoCompletion 루틴에서 필요한 클린 처리를 수행합니다.
그러나 상위 수준 드라이버는 특정 종류의 작업을 요청하는 IRP에 대한 내부 큐를 설정하거나 SCSI 포트 드라이버와 같은 다른 유형의 기본 디바이스 집합에 바인딩된 IRP를 보유하도록 내부 큐를 설정할 수 있습니다. 자세한 내용은 큐 및 큐 해제 IRP를 참조하세요.