2008-08-31 26 views

Respuesta

5

Si usa varios subprocesos, el sistema operativo se encargará automáticamente de utilizar varios núcleos.

+2

¿Puede citar esto? ¿Dónde encontraste esta información? –

+5

@Josh Brown, esto parece conocimiento común. Como referencia, cualquier libro sobre Win32 API que trate con hilos le dirá esto. –

1

El sistema operativo se encarga de los subprocesos múltiples cuando la máquina virtual usa subprocesos nativos (a diferencia de los subprocesos verdes), y no puede especificar detalles de bajo nivel, como elegir un procesador para un determinado subproceso. Es mejor así porque normalmente tiene muchos más subprocesos que procesadores disponibles, por lo que el sistema operativo necesita hacer un corte de tiempo para que todos los subprocesos tengan la oportunidad de ejecutarse.

Dicho esto, puede establecer las prioridades de subprocesos si tiene una tarea crítica, y una API de subprocesos generalmente ofrece esta posibilidad. Ver la API de Java, por ejemplo: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)

PD: hay algo roto en el motor de análisis ... he tenido que añadir el enlace anterior como texto sin formato

4

hay una manera de elegir qué procesador o núcleo se lanza en?

Usted puede utilizar el administrador de tareas de Windows para contar lo que la CPU (s) de su programa se debe permitir que se ejecuta. Normalmente esto solo es útil para solucionar problemas de programas antiguos que tienen implementaciones rotas de multi-threading. Para ello,

  • administrador de tareas Ejecutar
  • Encuentre su proceso en la ventana Processes.
  • Haga clic derecho y seleccione Set Affinity...
  • Marque las casillas de verificación junto a la CPU que desea permitir que se ejecute su aplicación. Windows entonces solo programará los hilos de ese proceso en esas CPUs particulares

Si recuerdo correctamente, Windows 'recordará' estas configuraciones para las siguientes veces que se ejecute su proceso, pero por favor no me cite en eso - ejecutar algunas pruebas usted mismo :-)

También puede hacer esto programáticamente en .NET después de que su programa se haya iniciado utilizando la propiedad System.Diagnostics.Process.ProcessorAffinity, pero no creo que 'recuerde' la configuración, por lo que siempre habrá una período corto en el que se ejecuta su aplicación en las ventanas de la CPU que considere adecuadas. No sé cómo hacer esto en java, lo siento.

Nota:

Esto se aplica a todo el nivel de proceso. Si configura afinidad solo para CPU0 y luego inicia 50 hilos, los 50 de esos hilos se ejecutarán en CPU0, y CPU1, 2, 3, etc. se quedarán sin hacer nada.

Solo para reiterar este punto, esto es principalmente útil para la solución de problemas de software heredado. Si su software no está roto, no debería interferir con ninguna de estas configuraciones, y deje que Windows decida la mejor CPU (s) para ejecutar su programa, para que pueda tener en cuenta el resto del rendimiento del sistema.


En cuanto al modelo de 'memoria compartida', que funciona de la misma, pero hay más cosas que pueden salir sutilmente mal cuando su aplicación se ejecuta en varios de CPU en lugar de sólo fracciones de tiempo en una sola.

Para un ejemplo ojo-apertura, lee this ridiculousfish article about CPU's and Memory Barriers.

Está dirigido a desarrollo OSX en PowerPC, pero lo suficientemente general que debería aplicarse en todas partes. En mi humilde opinión, es uno de los diez mejores "todos los desarrolladores deben leer estos" artículos que he leído.

0

he utilizado esto en un par de programas porque mi núcleo 0 era una especie de mal estado.

// Programmatically set process affinity 
var process = System.Diagnostics.Process.GetCurrentProcess(); 

// Set Core 0 
process.ProcessorAffinity = new IntPtr(0x0001); 

o

// Set Core 1 
process.ProcessorAffinity = new IntPtr(0x0002); 

Más sobre esto en "Process.ProcessorAffinity Property".

0

me gustaría tener un vistazo a las extensiones en paralelo a la plataforma .NET. Todavía está en CTP, sin embargo, se supone que debe hacer el mejor uso de procesadores multi-core. El lugar más fácil para comenzar a usar .NET es el parallel teams blog.

para Java que no tienen ni idea.

Cuestiones relacionadas