处理器数量的更改
在可动态分区的服务器上,可以随时将处理器添加到硬件分区。 因此,不应对硬件分区中的活动处理器数、处理器相关性值或分配给每个活动处理器的处理器编号做出任何假设。 在处理器相关性值中设置的位表示硬件分区中的每个当前活动处理器。 如果将处理器添加到硬件分区,则设置的特定位将更改。
如果以下任一语句对设备驱动程序是正确的,则必须更新驱动程序,以便在将处理器动态添加到硬件分区时,该驱动程序在可动态分区服务器上正常运行:
设备驱动程序使用硬件分区中的活动处理器数来确定它使用的资源量,例如它分配的内存量、它创建的线程数或它使用的其他资源量。 在这种情况下,如果将处理器动态添加到硬件分区,则设备驱动程序的资源分配将不正确。 这可能会对驱动程序的性能或行为产生负面影响。
设备驱动程序遍取处理器相关性值的位。 在这种情况下,如果设备驱动程序无法处理处理器相关性值的动态更改,或者无法处理所设置的位序列中的间隙,则设备驱动程序可能无法正常工作。
设备驱动程序使用处理器相关性值中的位将驱动程序分配的资源分配给特定处理器。 在这种情况下,如果将处理器动态添加到硬件分区,则设备驱动程序的资源分配将不正确。 这可能会对驱动程序的性能或行为产生负面影响。
设备驱动程序为硬件分区中的每个活动处理器分配数据结构。 在这种情况下,如果设备驱动程序尝试访问动态添加到硬件分区的处理器的这些数据结构,则设备驱动程序可能会导致不良行为、数据损坏或出现 bug 检查。
设备驱动程序的调度例程使用运行它们的处理器的处理器编号来访问分配给该特定处理器的数据结构或其他资源。 在这种情况下,如果设备驱动程序的调度例程尝试访问已动态添加到硬件分区的处理器的这些资源,则可能会导致不良行为、数据损坏或 bug 检查。
设备驱动程序计划其中断服务例程 (ISR) 、延迟过程调用 (DPC) 或特定处理器上的其他线程。 在这种情况下,如果将处理器添加到硬件分区,设备驱动程序可能会停止正常运行,并且设备驱动程序将无法完全使用任何新处理器。
设备驱动程序不支持资源重新平衡。 在这种情况下,设备驱动程序将无法使用添加到硬件分区的任何新处理器来处理中断。
设备驱动程序使用负载均衡算法在多个处理器之间分配 I/O 请求的处理。 在这种情况下,如果将处理器添加到硬件分区,设备驱动程序可能会停止正常运行,并且设备驱动程序将无法完全使用任何新处理器。
如果设备驱动程序受活动处理器数更改的影响,则必须将自身注册到操作系统,以便向硬件分区添加处理器时收到通知。 当设备驱动程序收到通知时,它可以根据需要做出响应,以实现安全和最佳操作。 有关设备驱动程序如何向操作系统注册自身的详细信息,请参阅 驱动程序通知。
若要检索硬件分区中的当前活动处理器数,设备驱动程序应调用 KeQueryActiveProcessorCount 函数。 若要检索当前处理器相关性值,设备驱动程序可以调用 KeQueryActiveProcessors 函数或 KeQueryActiveProcessorCount 函数。
注意 如果设备驱动程序为硬件分区中的每个活动处理器分配数据结构,并且如果新处理器的数据结构的内存分配失败,设备驱动程序将失败,则设备驱动程序可以在驱动程序初始化期间分配足够的这些数据结构,以处理操作系统支持的最大处理器数。 在这种情况下,将新处理器添加到硬件分区时,设备驱动程序不必分配新的数据结构。 但是,除非这些数据结构的大小相当小,否则可能会降低内存资源的使用效率。 设备驱动程序可以通过调用 KeQueryMaximumProcessorCount 函数来查询操作系统支持的最大处理器数。
重要 收到已将处理器添加到硬件分区的通知时,设备驱动程序应始终更新活动处理器数和处理器相关性的任何已保存值。
重要 设备驱动程序不应计算处理器相关性值中的设置位数,以确定硬件分区中的活动处理器数。 建议设备驱动程序为此调用 KeQueryActiveProcessorCount 函数。 此函数返回活动处理器数和关联的处理器相关性值。
重要 为 Windows Vista、Windows Server 2008 及更高版本的 Windows 生成的设备驱动程序不得使用 KeNumberProcessors 内核变量来确定硬件分区中的活动处理器数。 KeNumberProcessors 内核变量在 Service Pack 1 (SP1) 、Windows Server 2008 及更高版本的 Windows 中已过时。