共用方式為


Multiprocessor-Safe

Microsoft Windows NT型作業系統是設計成在單處理器和對稱多處理器上統一執行, (SMP) 平臺,而核心模式驅動程式應該設計為同樣地執行。

在任何 Windows 多處理器平臺中,有下列條件:

  • 所有 CPU 都相同,而且所有處理器或所有處理器都必須具有相同的協同處理器。

  • 所有 CPU 都會共用記憶體,並具有記憶體的統一存取權。

  • 對稱 平臺中,每個 CPU 都可以存取記憶體、進行中斷,以及存取 I/O 控制暫存器。 (相反地,在 非對稱 多處理器機器中,一個 CPU 會針對一組次級 CPU.) 進行所有中斷

若要安全地在 SMP 平臺上執行,作業系統必須保證在一個處理器上執行的程式碼不會同時存取和修改另一個處理器正在存取和修改的資料。 例如,如果最低層級驅動程式的 ISR 正在處理一個處理器上的裝置中斷,它必須具有裝置暫存器或重要驅動程式定義資料的獨佔存取權,以防裝置在另一個處理器上同時中斷。

此外,在單處理器機器中序列化的驅動程式 I/O 作業可以在 SMP 機器中重迭。 也就是說,處理傳入 I/O 要求的驅動程式常式可以在一個處理器上執行,另一個與裝置通訊的常式會在另一個處理器上同時執行。 無論是在單處理器或對稱多處理器電腦上執行核心模式驅動程式,都必須同步處理驅動程式常式之間共用的任何驅動程式定義資料或系統提供的資源存取,以及同步存取實體裝置。如果有的話。

Windows NT核心元件會匯出稱為微調鎖定的同步處理機制,驅動程式可用來保護共用資料 (或裝置註冊) ,避免在對稱多處理器平臺上同時執行的一或多個常式同時存取。 核心會強制執行兩個關於使用微調鎖定的原則:

  • 在任何指定的時間,只有一個常式可以保存特定的微調鎖定。 存取共用資料之前,每個必須參考資料的常式都必須先嘗試取得資料的微調鎖定。 若要存取相同的資料,另一個常式必須取得微調鎖定,但必須等到目前的持有者放開它之後,才能取得微調鎖定。

  • 核心會將 IRQL 值指派給系統中的每個微調鎖定。 只有當常式是在微調鎖定的指派 IRQL 執行時,核心模式常式才能取得特定的微調鎖定。

這些原則會防止通常以較低的 IRQL 執行驅動程式常式,但目前會保留微調鎖定,讓嘗試取得相同微調鎖定的較高優先順序驅動程式常式先占。 因此,會避免死結。

指派給微調鎖定的 IRQL 通常是可取得微調鎖定的最高 IRQL 常式。

例如,最低層級驅動程式的 ISR 經常會與驅動程式的 DPC 常式共用狀態區域。 DPC 常式會呼叫驅動程式提供 的重要區段 常式,以存取共用區域。 保護共用區域的微調鎖定,IRQL 等於裝置中斷的 DIRQL。 只要重要區段常式保存微調鎖定並存取 DIRQL 的共用區域,ISR 就無法在單處理器或 SMP 機器中執行。

  • ISR 無法在單處理器機器中執行,因為裝置中斷已遮罩,如 Always Preemptible 和 Always Interruptible中所述。

  • 在 SMP 機器中,ISR 無法取得可保護共用資料的微調鎖定,而關鍵區段常式會保存微調鎖定,並在 DIRQL 存取共用資料。

一組核心模式執行緒可以等候其中一個核心的發送器物件:事件、mutex、旗號、計時器或其他執行緒,來同步存取共用的資料或資源。 不過,大部分的驅動程式不會設定自己的執行緒,因為它們在避免執行緒內容切換時有更好的效能。 每當時間關鍵核心模式支援在 IRQL = DISPATCH_LEVEL或 DIRQL 上執行的常式和驅動程式時,都必須使用核心的微調鎖定來同步存取共用資料或資源。

如需詳細資訊,請參閱 微調鎖定管理硬體優先順序核心發送器物件