2009-06-27 13 views
10

Tengo un programa escrito en C#, estoy usando VSTS 2008 + .Net 3.5 + Windows Vista Enterprise x86 para desarrollar una aplicación de Windows Forms.cómo configurar la afinidad de la CPU de un programa?

Mi computadora actual es la CPU de doble núcleo, quiero configurar la afinidad de la CPU de mi programa para que se ejecute en una CPU específica y liberar otra CPU para hacer otro trabajo. ¿Alguna idea de como hacer esto? Ya sea a través de la codificación o la configuración está bien.

Un poco más de fondo es que mi programa consume mucha CPU, así que no quiero dejar que ocupe los dos recursos de la CPU en mi computadora y quiero liberar una CPU para que pueda navegar por la red al mismo tiempo rápidamente . :-)

gracias de antemano, George

+1

He visto una utilidad para hacer esto para el servidor interbase (ibaffinity creo que se llamó). También me interesaría ver cómo hacerlo para cualquiera de mis propios programas: presumiblemente no puedes hacerlo en tiempo de ejecución en tu ejecutable, tendrías que hacerlo a través de una configuración externa o durante el proceso de instalación (I supongo). – robsoft

+1

@robsoft: Esto solo fue necesario para versiones antiguas de Interbase/Firebird. Las versiones recientes vinculan los procesos del servidor a un núcleo de procesador cada uno. Es de código abierto, por lo que siempre se puede comprobar cómo se hace allí. – mghie

Respuesta

3

En realidad, su aplicación no va a usar más de una CPU a menos que haga algo en concreto para utilizar más CPU. Si utiliza el grupo de subprocesos y/o inicia subprocesos adicionales, puede usar núcleos adicionales disponibles, pero de lo contrario su aplicación solo tendrá un subproceso por defecto y, por lo tanto, solo utilizará una CPU.

+0

Mi aplicación utilizará más de una CPU porque graba a través de Windows Media Encoder y hace codificación en tiempo real al formato wmv; la he probado y he visto que todos los recursos de la CPU están ocupados desde el administrador de tareas de Windows. ¿Alguna idea de cómo configurar la afinidad de la CPU? – George2

+1

@Brian: Todavía puede tener sentido forzar un hilo para que permanezca en un núcleo, para aquellos sistemas donde el caché es por núcleo. – mghie

+0

@mghie, estoy de acuerdo contigo. Alguna idea para mi problema? – George2

12
  1. Ir al Administrador de tareas ->Procesos pestaña.
  2. Busque su programa. Haga clic derecho sobre él.
  3. Seleccione Establezca Affinity y desmarque una de las casillas de verificación.

Esto debería liberar hasta un procesador para usted.

Para hacerlo desde el código que puede agregar esta declaración:

System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr) 1; 

Salud!

+0

¿Alguna forma de programación o configuración? No quiero que el usuario final haga esto cada vez. :-) – George2

+2

Pruebe esto: System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity = 1; – Gaurav

+0

BTW: Para usar el segundo conjunto en 2 y para usar ambos núcleos, puede establecer el valor en 3 :) – Gaurav

7

funciones de la API de Windows El hacer esto están SetProcessAffinityMask() y SetThreadAffinityMask(). No sé .NET así que no puedo decir si hay envoltorios alrededor de esas funciones, pero this parece sugerir lo contrario.

BTW: Estoy de acuerdo en que estos son necesarios solo en circunstancias muy específicas, normalmente es mejor dejar que el planificador del sistema operativo se encargue de ello. Es una de esas preguntas en las que probablemente no deberías hacerlo si tienes que preguntar cómo.

+1

@mghie, en mi problema, 1. Creo que debería llamar a SetProcessAffinityMask distinto de SetThreadAffinityMask, ¿correcto? 2. ¿Podría llamar a SetProcessAffinityMask del proceso actual para establecer la afinidad del proceso actual? ¿O tengo que configurarlo desde una herramienta externa? – George2

+3

Puedes hacerlo desde el proceso en sí. Probablemente sea mejor comenzar con este artículo de MSDN: http://msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11, debería proporcionar algún código, así como información de fondo útil. – mghie

+0

Me gusta su respuesta sobre el uso de System.Diagnostics.Process.GetCurrentProcess(). Propiedad ProcessorAffinity, ¿por qué deberíamos usar IntPrt? ¿Por qué no usar int? – George2

Cuestiones relacionadas