quinta-feira, 17 de dezembro de 2009

Thread e a Máscara de Afinidade

Que perrengue!

Estou tentando melhorar um processo que consome muita CPU. E por estar em um ambiente multi processado optei por direcionar a thread gulosa via SetThreadAffinityMask.

A principio o Windows se encarrega de direcionar o uso do processador para aquel que estiver mais ocioso naquele momento.

Em um servidor com 8 processadores, funciona assim:


00000001 = 1 = Processador nº1 (Concentra no 1º processador)
00000010 = 2 = Processador nº2 (Concentra no 2º processador)
00000011 = 3 = Processador nº1 e nº2 (Balanceia entre o 1º e o 2º)
00000100 = 4 = Processador nº3 (Concentra no 3º processador)
00000101 = 5 = Processador nº1 e nº3 (Balanceia entre o 1º e o 3º)
...
11111111 = 255 = Balanceia entre os 8 processadores


Ou seja, cada bit ligado representa o processador que será usado. Mas usa-se a representação decimal no momento de passar para a função.

Já a função SetProcessAffinityMask define a máscara de afinidade do processo, sendo que as threads herdam esta mascara.

Existe também a função SetThreadIdealProcessor, que indica ao Windows qual o processador preferido para aquela thread, e o Windows irá dar "preferência" a esta thread.

Uma função interessante foi a SetPriorityClass, que permite baixar ou aumentar a prioridade de um processo. O correlato para a thread é a SetThreadPriority.


Função que retorna o processador que está sendo usado no momento:
(Só funciona do Vista para frente e Server 2003 para frente)

interface

function GetCurrentProcessorNumber: DWORD; stdcall;

implementation

function GetCurrentProcessorNumber; external kernel32 name 'GetCurrentProcessorNumber';



http://msdn.microsoft.com/en-us/library/ms683181(VS.85).aspx

Minha lista de blogs