Partilhar via


Afinidade de interrupção

A afinidade de uma interrupção é o conjunto de processadores que podem atender a interrupção. Cada dispositivo tem uma política de afinidade. O sistema operativo utiliza a política de afinidade para calcular a afinidade das interrupções desse dispositivo. A política de afinidade pode ser especificada no arquivo INF do dispositivo ou nas configurações do registro. Os administradores podem usar o Registro para definir uma política de afinidade para uma interrupção.

Os administradores podem definir as seguintes entradas na chave de registo \Interrupt Management\Affinity Policy :

  • DevicePolicy é um valor REG_DWORD que especifica uma política de afinidade. Para valores possíveis e seus significados, ver IRQ_DEVICE_POLICY. A Microsoft recomenda o uso da política padrão, se aplicável.

  • AssignmentSetOverride pode ser um valor REG_BINARY, REG_DWORD ou REG_QWORD que especifica uma máscara KAFFINITY . Para o REG_BINARY, o tamanho deve ser menor ou igual ao tamanho KAFFINITY para a plataforma, e a ordem dos bytes de entrada é little endian. Se DevicePolicy estiver 0x04 (IrqPolicySpecifiedProcessors), essa máscara especifica um conjunto de processadores aos quais atribuir as interrupções do dispositivo.

O arquivo INF de um driver pode fornecer configurações padrão para os valores do Registro. Aqui está um exemplo de como definir o valor DevicePolicy como IrqPolicyOneCloseProcessor no arquivo INF. Para obter mais informações, consulte Diretiva INF AddReg.

[install-section-name.HW]
AddReg=add-registry-section 

[add-registry-section]
HKR, "Interrupt Management\Affinity Policy", DevicePolicy, 0x00010001, 2

O sistema disponibiliza as configurações do Registro para o driver do dispositivo quando ele envia o IRP IRP_MN_FILTER_RESOURCE_REQUIREMENTS para o driver. O sistema operacional fornece uma estrutura IO_RESOURCE_DESCRIPTOR para cada interrupção com o membro Type definido como CmResourceTypeInterrupt. Para uma interrupção sinalizada por mensagem, o bit CM_RESOURCE_INTERRUPT_MESSAGE do membro Flags é definido; caso contrário, está limpo. O membro u.Interrupt descreve as configurações para a interrupção.

A tabela a seguir fornece a correspondência entre as configurações do Registro e os membros do u.Interrupt.

Valor do Registo Membro de u.Interrupt
DevicePolicy Política de Afinidade
AssignmentSetOverride TargetedProcessors

Sobre o KAFFINITY

O tipo KAFFINITY é uma máscara de afinidade que representa um conjunto de processadores lógicos em um grupo.

typedef ULONG_PTR  KAFFINITY;

O tipo KAFFINITY é de 32 bits numa versão de 32 bits do Windows e de 64 bits numa versão de 64 bits do Windows.

Se um grupo contiver n processadores lógicos, os processadores serão numerados de 0 a n-1. O número do processador i no grupo é representado pelo bit i na máscara de afinidade, onde i está no intervalo de 0 a n-1. Os bits de máscara de afinidade que não correspondem aos processadores lógicos são sempre zero.

Por exemplo, se um valor KAFFINITY identificar os processadores ativos em um grupo, o bit de máscara para um processador será um se o processador estiver ativo e será zero se o processador não estiver ativo.

O número de bits na máscara de afinidade determina o número máximo de processadores lógicos em um grupo. Para uma versão de 64 bits do Windows, o número máximo de processadores por grupo é 64. Para uma versão de 32 bits do Windows, o número máximo de processadores por grupo é 32. Chame a rotina KeQueryMaximumProcessorCountEx para obter o número máximo de processadores por grupo. Este número depende da configuração de hardware do sistema multiprocessador, mas nunca pode exceder os limites fixos de 64 e 32 processadores que são definidos pelas versões de 64 bits e 32 bits do Windows, respectivamente.

A estrutura GROUP_AFFINITY contém uma máscara de afinidade e um número de grupo. O número do grupo identifica o grupo ao qual a máscara de afinidade se aplica.

As rotinas do kernel que usam o tipo KAFFINITY incluem IoConnectInterrupt, KeQueryActiveProcessorCount e KeQueryActiveProcessors.