2012-03-21 24 views
6

tengo un servicio de Windows escrito en .net 4 que hace trabajos periódicamente utilizando subprocesos. el servidor tiene más de 20 núcleos de CPU.asignar a cada hilo un núcleo de la CPU

creo 10 hilos en mi servicio de Windows. ¿Es posible asignar a cada hilo un núcleo de CPU?

+2

¿Por qué querría adivinar el programador/despachador del sistema operativo? Tales ejercicios raramente terminan bien. –

+0

@Martin: curiosidad, curiosidad y curiosidad – ehsan

+0

Suena más como "no tengo ni idea de lo que sé" – TomTom

Respuesta

7

El sistema operativo ya lo hace precisamente por usted. No garantiza que cada hilo sea permanezca en el mismo núcleo para siempre (y en casi todos los casos, tampoco es necesario), pero intenta mantener ocupados tantos núcleos como sea posible. Lo que significa dar a todos los hilos disponibles su propio núcleo tanto como sea posible.

+0

bueno! ¿hay alguna documentación oficial para este reclamo? – ehsan

+0

Es muy probable, pero no estoy seguro de dónde encontrarlo, al igual que no estoy seguro de dónde encontrar la documentación para afirmar que el sistema operativo no reescribirá repentinamente el espacio de memoria de su proceso. Son los sistemas operativos 101. Un sistema operativo que no * intenta * utilizar todos los núcleos de CPU está fundamentalmente roto. – jalf

+0

a jalf: leí algunos documentos y entiendo que tienes razón! – ehsan

6

Es posible tocando en las llamadas al sistema nativo Win32, específicamente SetThreadAffinityMask. Usted tendrá que hacer algunas DllImports:

[DllImport("kernel32.dll")] 
static extern IntPtr GetCurrentThread(); 
[DllImport("kernel32.dll")] 
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask); 

Y luego usarlos en el interior de cada uno dio lugar a rosca (con un parámetro diferente para la máscara, por supuesto):

// set affinity of current thread to the given cpuID 
SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1 << (int)cpuID)); 

Advertencia: correlación directa entre .NET hilos y hebras de SO no está garantizada, al menos de acuerdo a lo siguiente: http://msdn.microsoft.com/en-us/library/74169f59.aspx

un sistema operativo ThreadId no tiene ninguna relación fija con un logrado hilo, debido a que una u el host nmanaged puede controlar la relación entre hilos administrados y no administrados. Específicamente, un host sofisticado puede usar la API de Fiber para programar muchos hilos administrados contra el mismo hilo del sistema operativo , o para mover un hilo administrado entre diferentes subprocesos del sistema operativo .

+1

-1. Un hilo .NET es un hilo de nivel del sistema operativo. Hasta que el programador puede configurar cosas como el aislamiento de infrarrojos. Esto está garantizado a menos que MS lo chagnes, en una importante actualización de tiempo de ejecución de .NET. – TomTom

+0

@TomTom: estoy bastante seguro de que lo que dices no es válido para todas las versiones de .NET. Lea aquí: http://msdn.microsoft.com/en-us/library/74169f59.aspx. También agregué la cita en mi publicación. – Tudor

+0

Y, por cierto, creo que he respondido su pregunta, así que no veo la razón para rechazar una oración debatible al final. – Tudor

Cuestiones relacionadas