共用方式為


佇列和清除佇列 IRP

因為 I/O 管理員支援多工和多執行緒系統內的非同步 I/O,所以對裝置的 I/O 要求可能會比驅動程式可以更快處理完成,特別是在多處理器機器中。 因此,當裝置已經在處理另一個 IRP 時,系結至任何特定裝置的 IRP 必須在驅動程式中排入佇列。

因此,最低層級驅動程式需要下列其中一項:

  • StartIo常式,I/O 管理員呼叫以啟動 I/O 作業的 I/O 作業,驅動程式已排入系統提供的 IRP 佇列, (請參閱IoStartPacket) 。

  • 內部 IRP 佇列和清除佇列機制,驅動程式會用來管理比滿足它們快的 IRP。 驅動程式可以使用裝置佇列、連結佇列或取消安全佇列。 如需詳細資訊,請參閱 驅動程式管理的 IRP 佇列

只有可滿足並完成其分派常式中每個可能 IRP 的最低層級設備磁碟機不需要 StartIo 常式,也不需要 IRP 的驅動程式管理佇列。

較高層級的驅動程式幾乎永遠不會有 StartIo 常式。 大部分中繼驅動程式都沒有 StartIo 常式或內部佇列;中繼驅動程式通常會從其分派常式傳遞具有有效參數的 IRP,並對其 IoCompletion 常式中的任何 IRP 執行任何後置處理。

下列一般描述一些設計考慮,用來判斷是否要針對 IRP 使用或不使用內部、驅動程式管理的佇列來實作 StartIo 常式。

驅動程式中的 StartIo 常式

對於一次只能處理一個裝置 I/O 作業的電腦周邊裝置,設備磁碟機可以實作 StartIo 常式。 針對這些驅動程式,I/O 管理員會提供 IoStartPacketIoStartNextPacket 常式,以佇列和從系統提供的 IRP 佇列中清除佇列 IRP。

如需 StartIo 常式的詳細資訊,請參閱 撰寫 StartIo 常式

驅動程式中 IRP 的內部佇列

如果裝置可以支援多個並行 I/O 作業,其最低層級設備磁碟機必須設定內部要求佇列,並管理自己的 IRP 佇列。 例如,系統序列驅動程式會在其裝置上維護不同的佇列,以進行讀取、寫入、清除和等候作業,因為它支援全雙工序列裝置。

將要求傳送至某些基礎設備磁碟機數目的較高層級驅動程式,也可能維護 IRP 的內部佇列。 例如,檔案系統驅動程式幾乎一律會有 IRP 的內部佇列。

如需詳細資訊,請參閱 驅動程式管理的 IRP 佇列

內部佇列同步處理

具有裝置專用線程和最高層級驅動程式的驅動程式,這些驅動程式使用執行背景工作執行緒 (包括大部分的檔案系統驅動程式) 通常會為 IRP 設定自己的佇列。 佇列是由驅動程式執行緒或驅動程式提供的背景工作執行緒回呼,以及處理 IRP 的其他驅動程式常式共用。

實作自己的佇列結構的驅動程式必須確定已同步處理佇列的存取權,且已取消的 IRP 會從佇列中移除。 為了簡化驅動程式寫入器的工作,取消安全的 IRP 佇列提供可在實作 IRP 佇列時使用的標準架構。 如需詳細資訊 ,請參閱取消安全的 IRP 佇列 。 這是實作 IRP 佇列的慣用方法。

驅動程式也可以實作所有 IRP 佇列同步處理,並明確取消邏輯。 例如,驅動程式可以使用連結的佇列。 驅動程式的分派常式會將 IRP 插入連結佇列中,而驅動程式建立的執行緒或驅動程式的背景工作執行緒回呼會藉由呼叫 ExInterlockedXxx清單 支援常式來移除它們。

例如,系統磁片磁碟機驅動程式會使用連結的佇列。 其裝置專用線程會處理其他設備磁碟機 StartIo 常式所完成的相同 IRP 處理,以及由其他設備磁碟機 的 DpcForIsr 常式完成的一些相同 IRP 處理。

驅動程式中具有 StartIo 常式的內部佇列

管理自己的內部佇列的驅動程式也可以有 StartIo 常式,但不需要。 大部分最低層級設備磁碟機都有 StartIo 常式,或管理自己的 IRP 佇列,但不能同時管理這兩者。

例外狀況是 SCSI 埠驅動程式,其具有 StartIo 常式並管理 IRP 的內部佇列。 I/O 管理員會將 IRP 排入埠驅動程式 的 StartIo 常式,該裝置佇列中與代表 SCSI HBA 之驅動程式建立的裝置物件相關聯。 SCSI 埠驅動程式也會設定和管理每個目標裝置的 IP 裝置佇列, (對應到機器中任何 HBA 驅動 SCSI 匯流排上的 SCSI 邏輯單元) 。

每當 SCSI 匯流排上的任何裝置特別忙碌時,SCSI 埠驅動程式會使用其補充裝置佇列來保存從 LU 特定佇列中的 SCSI 類別驅動程式傳送的 IRP。 實際上,此驅動程式的補充 LU 特定裝置佇列可讓 SCSI 埠驅動程式透過 HBA 將異質 SCSI 裝置的作業序列化,同時讓該 HBA 的 SCSI 匯流排上的每個裝置盡可能忙碌。