作業系統的先佔式、可中斷設計的目標是最大化系統效能。 任何執行緒都可以被具有較高優先順序的執行緒搶先,而且任何驅動程式的中斷服務例程(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 上執行的任何常式才會保留處理器的控制權,前提是該常式執行時不會發生較高 IRQL 的中斷。
與某些較舊的個人電腦作業系統中的驅動程式不同,Microsoft Windows 驅動程式的 ISR 從來都不是大型、複雜的常式,可執行驅動程式的大部分 I/O 處理。 這是因為任何驅動程式的 中斷服務常式(ISR)可能會被另一個常式所中斷,例如運行在較高 IRQL 的另一個驅動程式的 ISR。 因此,驅動程式的 ISR 不一定會在整個執行過程中不間斷地保留 CPU 的控制權。
在 Windows 驅動程式中,ISR 通常會儲存硬體狀態資訊、將 延遲的程式呼叫 (DPC) 排入佇列,然後快速結束。 稍後,系統會將驅動程式的 DPC 取消佇列,讓驅動程式可以在較低的 IRQL (DISPATCH_LEVEL) 完成 I/O 作業。 為了獲得良好的整體系統效能,所有在高 IRQL 執行的處理程序都必須迅速放棄 CPU 的控制權。
在 Windows 中,所有執行緒都有執行緒上下文。 此內容包含識別擁有執行緒之進程的資訊,以及其他特性,例如執行緒的存取權限。
一般而言,只會在要求驅動程式目前 I/O 作業的執行程內容中呼叫最高層級的驅動程式。 中繼層級或最低層級的驅動程式永遠不能假設它在提出其當前 I/O 作業要求的執行緒上下文中執行。
因此,驅動程式常式通常會在任意線程上下文中執行,即當標準驅動程式常式被呼叫時,所處於的當前線程的上下文。 基於效能原因 (以避免內容切換),很少有驅動程式會設定自己的執行緒。