Higher-Level 驅動程式中的 StartIo 常式
任何較高層級的驅動程式都可以有 StartIo 常式。 不過,這類驅動程式不太可能與現有的較低層級驅動程式互通,而且可能會呈現不佳的效能特性。
較高層級驅動程式中的 StartIo 常式具有下列效果:
從驅動程式的DispatchXxx 常式呼叫IoStartPacket, (的 ioStartNextPacket) 和IoStartNextPacket從其IoCompletion常式排入佇列, () ,進而讓 IRP 一次透過StartIo常式處理一個。
驅動程式的 I/O 輸送量在大量 I/O 需求期間可能會明顯變慢,因為其 StartIo 常式可能會成為瓶頸。
驅動程式的 StartIo 常式會使用 IRQL = DISPATCH_LEVEL的每個 IRP 呼叫 IoCallDriver ,因而導致所有較低層級驅動程式的分派常式也會在 IRQL = DISPATCH_LEVEL執行。 這會限制較低驅動程式在其分派常式中呼叫的支援常式集合。 由於大部分驅動程式寫入器假設其驅動程式的分派常式是在 IRQL < DISPATCH_LEVEL執行,因此較高層級驅動程式不太可能與許多現有的較低層級驅動程式互通。
StartIo常式會減少整體系統輸送量,因為它及其鏈結中所有較低層級驅動程式的分派常式是在 IRQL = DISPATCH_LEVEL執行。
如需執行標準驅動程式常式之 IRQL 的詳細資訊,請參閱 管理硬體優先順序。
系統提供的較高層級驅動程式都沒有 StartIo 常式,因為它可能會讓驅動程式本身的 IRP 處理速度變慢、所有以上和下方的驅動程式,以及整體系統。
大部分較高層級的驅動程式只會從其分派常式將 IRP 傳送至較低層級的驅動程式,並在 其 IoCompletion 常式中執行任何必要的清除處理。
不過,較高層級的驅動程式可以針對要求特定作業的 IRP 設定內部佇列,或設定內部佇列來保存一組異質基礎裝置所系結的 IRP,例如 SCSI 埠驅動程式。 如需詳細資訊,請參閱 佇列和清除佇列 IRP。