Dire ho eseguito un semplice processo a thread singolo come quella qui sotto:Perché un singolo processo filettato viene eseguito su più processori/core?
public class SirCountALot {
public static void main(String[] args) {
int count = 0;
while (true) {
count++;
}
}
}
(Questo è Java perché è quello che ho familiarità con, ma ho il sospetto che non ha molta importanza)
Ho un processore i7 (4 core, o 8 contando hyperthreading), e sto usando Windows 7 a 64 bit, quindi ho attivato Sysinternals Process Explorer per esaminare l'utilizzo della CPU e, come previsto, vedo che utilizza circa il 20% di tutte le CPU disponibili.
Ma quando i Spostare l'opzione per mostrare 1 graph per CPU, vedo che invece di 1 dei 4 "core" in uso, l'utilizzo della CPU è diffuso in tutto i nuclei:
Invece quello che mi aspetterei è un core massimo, ma ciò accade solo quando imposto l'affinità per il processo su un singolo core.
Perché il carico di lavoro diviso nel corso dei nuclei separati? La suddivisione del carico di lavoro su diversi core non creerebbe problemi con il caching o incorre in altre penalità per le prestazioni?
E 'per il semplice motivo di impedire il surriscaldamento di un core? O c'è una ragione più profonda?
Modifica: Sono consapevole del fatto che il sistema operativo è responsabile della pianificazione, ma voglio sapere il motivo per cui "dà fastidio". Sicuramente da un punto di vista ingenuo, incollare un processo (principalmente *) a thread singolo su 1 core è il modo più semplice di fare & più efficiente?
* dico per lo più single-threaded, perché non c'è più theads qui, ma solo 2 di loro stanno facendo nulla:
Piccolo nitpick; dicendo che questo è un processo a thread singolo non sarà corretto. JVM genera internamente più thread per scopi di pulizia come finalizzatori, garbage collector, ecc. È possibile che per ottenere il vero lavoro svolto da ciascun thread, i thread JVM siano mappati a veri thread h/w, che potrebbero spiegare la diffusione. –
Immagino che Caspar abbia inteso i thread _non-daemon_. – Santosh
@ SanjayT.Sharma Sì, ho semplificato un po 'e probabilmente avrei dovuto fornire un programma di esempio in un linguaggio non gestito;) Tuttavia, come ho detto, ho il forte sospetto che non sia la JVM a farlo (e se sta mappando JVM -> HW thread e questo è responsabile, perché la mappatura cambia continuamente?) – Caspar