操作系统的抢占性和可中断性设计的目标是最大程度地提高系统性能。 任何线程都可以被优先级较高的线程抢占,任何驱动程序的中断服务例程(ISR)都可以被在更高的中断请求级别(IRQL)运行的例程中断。
内核组件根据以下优先级条件之一确定代码序列何时运行:
线程的内核定义的运行时优先级方案。
系统中的每个线程都有关联的优先级属性。 通常,大多数线程都具有可变优先级属性:它们始终是可抢占的,并计划与当前处于相同优先级级别的所有其他线程进行轮转调度。 某些线程具有 实时 优先级属性:这些时间关键线程运行到完成状态,除非线程被具有较高实时优先级属性的线程抢占。 Microsoft Windows 体系结构不提供本质上的实时系统。
无论其优先级属性如何,当发生硬件中断和某些类型的软件中断时,系统中的任何线程都可能被抢占。
在给定平台上分配特定中断向量的内核定义的 中断请求级别 (IRQL)。
内核优先处理硬件和软件中断,以便某些内核模式代码(包括大多数驱动程序)在更高的 IRCL 下运行,从而使其具有比系统中其他线程更高的计划优先级。 内核模式驱动程序代码执行时的特定 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 操作。 为了获得良好的整体系统性能,以高 IRCL 运行的所有例程都必须快速放弃对 CPU 的控制。
在 Windows 中,所有线程都具有线程上下文。 此上下文包含用于标识拥有线程的进程以及线程访问权限等其他特征的信息。
一般情况下,只在请求驱动程序当前 I/O 操作的线程上下文中调用最高层级的驱动程序。 中间层或最低层驱动程序永远不能假设它是在发起其当前 I/O 操作的线程上下文中执行。
因此,驱动程序例程通常在 任意线程上下文中执行,即调用标准驱动程序例程时任何线程的当前上下文。 出于性能原因(为了避免上下文切换),很少有驱动程序设置自己的线程。