Non si pone la domanda, probabilmente più fondamentale, "Come posso avere 290 processi quando la mia CPU ha solo quattro core?" Questa risposta è un po 'di storia, che potrebbe aiutarti a capire il quadro generale, anche se la domanda specifica ha già avuto risposta. Come tale, non ho intenzione di dare una versione TL; DR.
C'era una volta (pensate negli anni '50 -'60), i computer potevano fare solo una cosa alla volta. Erano molto costosi, riempivano intere stanze e avevamo bisogno di un modo per farne un uso efficiente condividendoli tra più persone. Il primo modo per farlo era l'elaborazione in batch , in cui gli utenti avrebbero inviato attività al computer e sarebbero stati messi in coda , eseguiti uno dopo l'altro e i risultati sarebbero stati restituiti all'utente. Era OK, ma voleva dire che, se volevi fare un calcolo che richiedeva un paio di giorni, nessun altro avrebbe potuto usare il computer durante quel periodo.
La prossima innovazione (pensate tra gli anni '60 e '70) era time-sharing . Ora, invece di eseguire l'intera attività, quindi l'intera di quella successiva, il computer eseguirà un po 'di un compito, quindi lo interromperà ed eseguirà un po' di quello successivo, e così via. Pertanto, il computer darebbe l'impressione che stesse eseguendo più processi contemporaneamente. Il grande vantaggio di questo è che ora puoi eseguire un calcolo che impiegherà un paio di giorni e, anche se ora richiederà ancora più tempo, perché continua a essere interrotto, altre persone possono ancora usare la macchina durante quel periodo.
Tutto ciò era per enormi computer in stile mainframe. Quando i personal computer hanno cominciato a diventare popolari, inizialmente non erano molto potenti e, hey, dal momento che erano personali , sembrava giusto per loro essere in grado di fare solo una cosa & nbdp; - eseguire un'applicazione - subito (pensa agli anni '80). Ma, man mano che diventavano più potenti (pensate, dagli anni '90 ad oggi), le persone volevano che anche i loro personal computer condividessero il tempo.
Quindi abbiamo finito con i personal computer che davano l'illusione di eseguire più processi contemporaneamente eseguendoli effettivamente uno alla volta per brevi periodi e poi interrompendoli. I thread sono essenzialmente la stessa cosa: alla fine, le persone volevano anche i singoli processi per dare l'illusione di fare più cose contemporaneamente. In un primo momento, lo sviluppatore dell'applicazione ha dovuto gestirli: passare un po 'di tempo ad aggiornare la grafica, metterla in pausa, passare un po' di tempo a calcolare, mettere in pausa, passare un po 'di tempo a fare qualcos'altro, ...
Tuttavia, il sistema operativo era già in grado di gestire più processi, aveva senso estenderlo per gestire questi sottoprocessi, che sono chiamati thread. Quindi, ora, abbiamo un modello in cui ogni processo (o applicazione) contiene almeno un thread, ma alcuni ne contengono molti o molti. Ognuno di questi thread corrisponde ad una sottoattività un po 'indipendente.
Ma, al livello più alto, la CPU sta ancora dando l'illusione che questi thread funzionino tutti allo stesso tempo. In realtà, ne viene eseguito uno per un po ', fermandolo, scegliendo un altro da correre per un po', e così via. Tranne che le moderne CPU possono eseguire più thread contemporaneamente. Quindi, nella realtà reale , il sistema operativo sta giocando questo gioco di "correre per un po ', mettere in pausa, eseguire qualcos'altro per un po', mettere in pausa" su tutti i core contemporaneamente. Quindi, puoi avere tutti i thread che desideri (e i tuoi progettisti di applicazioni) ma, in qualsiasi momento, solo alcuni di essi verranno effettivamente messi in pausa.