Always Preemptible 和 Always Interruptible
作業系統優先、可中斷的設計目標是將系統效能最大化。 任何執行緒都可以由優先順序較高的執行緒先占,而任何驅動程式的插斷服務常式 (ISR) 都可以由在較高中斷要求層級執行的常式中斷, (IRQL) 。
核心元件會根據下列其中一個優先順序準則,判斷程式碼序列何時執行:
執行緒的核心定義執行時間優先順序配置。
系統中的每個執行緒都有相關聯的優先順序屬性。 一般而言,大部分執行緒都有 可變 的優先順序屬性:它們一律是優先的,而且排程在目前處於相同優先順序層級的所有其他執行緒執行迴圈配置資源。 某些執行緒具有 即時 優先順序屬性:這些時間關鍵執行緒會執行到完成,除非執行緒被具有較高即時優先順序屬性的執行緒優先。 Microsoft Windows 架構不提供原本就即時的系統。
不論其優先順序屬性為何,系統中的任何執行緒都可以在硬體中斷和特定類型的軟體插斷發生時先占。
核心定義的 中斷要求層級 (IRQL) 指定平臺上指派特定中斷向量。
核心會排定硬體和軟體插斷的優先順序,讓某些核心模式程式碼包括大部分的驅動程式在較高的 IRQL 上執行,使其具有比系統中其他執行緒更高的排程優先順序。 核心模式驅動程式程式碼執行的特定 IRQL 是由其基礎裝置 的硬體優先順序 所決定。
核心模式程式碼一律可中斷:隨時可能會發生具有較高 IRQL 值的中斷,因而造成另一段具有較高系統指派 IRQL 的核心模式程式碼立即在該處理器上執行。 不過,當程式碼片段在指定的 IRQL 上執行時,核心會遮罩處理器上具有較少或等於 IRQL 值的所有中斷向量。
最低 IRQL 層級稱為 PASSIVE_LEVEL。 在此層級,不會遮罩任何中斷向量。 執行緒通常會在 IRQL=PASSIVE_LEVEL上執行。 下一個較高的 IRQL 層級適用于軟體插斷。 這些層級包括APC_LEVEL、DISPATCH_LEVEL或核心偵錯WAKE_LEVEL。 裝置中斷仍有較高的 IRQL 值。 核心會保留系統關鍵性中斷的最高 IRQL 值,例如來自系統時鐘或匯流排錯誤的中斷值。
某些系統支援常式會在 IRQL=PASSIVE_LEVEL執行,可能是因為它們實作為可分頁程式碼或存取可分頁資料,或因為某些核心模式元件會設定自己的執行緒。
同樣地,某些 標準驅動程式常式 通常會在 IRQL=PASSIVE_LEVEL上執行。 不過,數個標準驅動程式常式會在 IRQL=DISPATCH_LEVEL或針對最低層級驅動程式執行,在裝置 IRQL (也稱為 DIRQL) 。 如需 IRQL 的詳細資訊,請參閱 管理硬體優先順序。
驅動程式中的每個常式都會中斷。 這包括在比PASSIVE_LEVEL更高的 IRQL 執行的任何常式。 任何在特定 IRQL 上執行的常式,只有在執行該常式時沒有發生較高 IRQL 的中斷時,才會保留處理器的控制。
不同于某些舊版個人電腦作業系統中的驅動程式,Microsoft Windows 驅動程式的 ISR 永遠不會是執行大部分驅動程式 I/O 處理的大型複雜常式。 這是因為任何驅動程式的 插斷服務常式 (ISR) 可由另一個常式 (中斷,例如在另一個驅動程式的 ISR) 在較高的 IRQL 上執行。 因此,驅動程式的 ISR 不一定會從其執行路徑的開頭到結尾,保留 CPU 的控制權,不受中斷。
在 Windows 驅動程式中,ISR 通常會儲存硬體狀態資訊、將 延遲的程式調用 排入佇列 (DPC) ,然後快速結束。 之後,系統會取消佇列驅動程式的 DPC,讓驅動程式可以在較低的 IRQL (DISPATCH_LEVEL) 完成 I/O 作業。 為了達到良好的整體系統效能,以高 IRQL 執行的所有常式都必須快速放棄 CPU 的控制。
在 Windows 中,所有線程都有線程內容。 此內容包含資訊,可識別擁有線程的進程,以及執行緒存取權限等其他特性。
一般而言,在要求驅動程式目前 I/O 作業的執行緒內容中,只會呼叫最高層級的驅動程式。 中繼層級或最低層級驅動程式絕對不能假設它正在要求其目前 I/O 作業的執行緒內容中執行。
因此,驅動程式常式通常會在 任意執行緒內容中執行,也就是呼叫標準驅動程式常式時,任何執行緒目前的內容。 基於效能考慮, (避免內容切換) ,很少的驅動程式會設定自己的執行緒。