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