2012-03-01 10 views
7

Duplicar posible:
Would a multithreaded Java application exploit a multi-core machine very well?doble núcleo utilización de la CPU w solo hilo/Java que se ejecuta

tengo un hilo de Java simple y sencillo como esto se ejecuta en mi máquina de doble núcleo (Entorno de 32 bits de Windows XP)

public static void main(String[] strs) { 

    long j = 0; 
    for(long i = 0; i<Long.MAX_VALUE; i++) 
     j++; 

    System.out.println(j); 
    } 

Mi expectativa era que se pegaría a un único CP U para aprovechar al máximo la caché de alta velocidad (ya que en el ciclo seguimos operando con la variable local j, por lo tanto, una utilización de la CPU sería del 100% y la otra estaría prácticamente inactiva). Para mi sorpresa, ambas CPU se están utilizando a aproximadamente 40% ~ 60% después de que se inicia el hilo y la utilización de una CPU es ligeramente más alta que la otra.

Mi pregunta es: ¿Hay algún mecanismo de equilibrio de carga del sistema operativo que se active cuando se haya detectado un desequilibrio? En mi caso, ¿es posible que el sistema operativo Windows haya detectado que una CPU está alcanzando casi el 100% y la otra está casi inactiva, por lo que reprograma el hilo a otra CPU periódicamente?

enter image description here

# EDIT1 he encontrado una posible explicación: http://siber.cankaya.edu.tr/ozdogan/OperatingSystems/ceng328/node130.html

+0

Sí, el SO rebotará los hilos. – Mysticial

+0

Creo que esta pregunta ya ha sido respondida http://stackoverflow.com/questions/1649402/would-a-multithreaded-java-application-exploit-a-multi-core-machine-very-well – parion

+0

Y tenga en cuenta que la mayoría de los programas de Java intentarán usar un núcleo y permanecer con un núcleo, como descubrí con Minecraft. Aquí hay una historia de un chico que descubrió esto con su nueva computadora http://mlee888.wordpress.com/2006/03/31/java-performance-in-dual-coremultiprocessor-environment/ – parion

Respuesta

3

Cuando el sistema operativo se ejecuta hilos, que se ejecuta cada hilo durante un determinado período de tiempo (por ejemplo 10-20ms), a continuación, guarda el estado de la rosca, y busca otros hilos correr.

Ahora, a pesar de lo que pueda pensar al mirar el gráfico de utilización de la CPU, el sistema operativo realmente está ejecutando muchos más hilos que los de su programa. Hay subprocesos que ejecutan bucles UI, subprocesos en E/S, subprocesos que ejecutan servicios en segundo plano, etc. La mayoría de los subprocesos pasan la mayor parte del tiempo bloqueados esperando algo.

La razón por la que estoy hablando de esto es para explicar que, desde el punto de vista de OS, la situación es más compleja de lo que podría parecer. Hay un montón de hilos haciendo un montón de cosas, y el sistema operativo está intentando cambiar entre ellos. Supongamos que quiere implementar una heurística de que si un subproceso utilizó todo su quantum la última vez, entonces el sistema operativo hará un esfuerzo para programarlo en el mismo núcleo. El sistema operativo necesita rastrear y tener en cuenta más información, y el éxito de la optimización puede depender de muchos factores difíciles de predecir.

Además, el beneficio de affinitizar un hilo en un núcleo a menudo es insignificante en la práctica, por lo que los sistemas operativos no intentan hacerlo automáticamente. En su lugar, exponen una característica que le permite al desarrollador decir explícitamente que un hilo en particular debe affinitizarse en un núcleo, y entonces el sistema operativo respetará la decisión.

Parece un compromiso razonable: si su hilo funciona mejor cuando está affinitizado en un núcleo, solo solicite al sistema operativo que lo haga. Pero, el sistema operativo no se molestará en intentar resolverlo.

1

Como usted menciona, el sistema operativo se va a recuperar las discusiones alrededor. El siguiente código nativo también hace lo que usted describió.

int main(int argc, char** argv) 
{ 
    while(true); 
    return 0; 
} 

Si nos fijamos en el proceso, que es constante en el 25% (con un quad-core), pero el Monitor de recursos de Windows 7 muestra que ninguno de los 4 núcleos está en constante 100%, a pesar del núcleo 0 tiene un uso más elevado que los demás.

cpu may share la memoria caché entre los núcleos, por lo que este comportamiento no significa que la memoria caché no se está utilizando.

+1

¿hay alguna explicación oficial/documentada de por qué y cómo el sistema operativo rebota en los hilos? – njzhxf

+0

@njzhxf - ¿Importa? –

+0

@StephenC quería saber un poco más al respecto – njzhxf

Cuestiones relacionadas