Di corro un proceso simple de un solo subproceso como la siguiente:¿Por qué un único proceso con hilos se ejecuta en varios procesadores/núcleos?
public class SirCountALot {
public static void main(String[] args) {
int count = 0;
while (true) {
count++;
}
}
}
(Esto es Java, porque eso es lo que estoy familiarizado, pero sospecho que en realidad no importa)
Tengo un procesador i7 (4 núcleos, o 8 contando hyperthreading), y estoy ejecutando Windows 7 de 64 bits, así que encendí Sysinternals Process Explorer para ver el uso de la CPU, y como esperaba veo que está usando alrededor del 20% de toda la CPU disponible.
Pero cuando activar y desactivar la opción de mostrar 1 gráfico por CPU, veo que en vez de 1 de los 4 "núcleos" siendo utilizado, el uso de la CPU se extiende por todo los núcleos:
En lugar de lo que esperaría es 1 núcleo máximo, pero esto solo ocurre cuando establezco la afinidad para el proceso a un solo núcleo.
¿Por qué la carga de trabajo divididos sobre los núcleos separados? ¿No dividiría la carga de trabajo entre varios núcleos con el almacenamiento en caché o incurriría en otras penalizaciones de rendimiento?
¿Es por la simple razón de evitar el sobrecalentamiento de un núcleo? ¿O hay alguna razón más profunda?
Edit: Soy consciente de que el sistema operativo es responsable de la programación, pero quiero saber por qué "molesta". Sin duda, desde un punto de vista ingenuo, pegar un (en su mayoría *) proceso de un único subproceso a 1 núcleo es el más simple & manera más eficiente de ir?
* Me dicen su mayoría un único subproceso porque hay múltiples theads aquí, pero sólo 2 de ellos están haciendo nada:
Pequeño nitpick; decir que este es un proceso de un solo subproceso no será correcto. JVM internamente genera múltiples hilos para fines de limpieza como finalizadores, recolectores de basura, etc. Es muy posible que para hacer un trabajo real por cada hilo, los hilos JVM se mapeen a hilos reales h/w, lo que de nuevo podría explicar la dispersión. –
Supongo que Caspar significaba los hilos _non-daemon_. – Santosh
@ SanjayT.Sharma Sí, simplifiqué un poco y probablemente debería haber dado un programa de ejemplo en un lenguaje no administrado;) Sin embargo, como dije, sospecho que no es la JVM la que está haciendo esto (y si está mapeando JVM -> hilos HW y que es responsable, ¿por qué la asignación está cambiando constantemente?) – Caspar