Non si pone la domanda discutibilmente 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 alla domanda specifica è già stata data una risposta. Come tale, non ho intenzione di fornire una versione TL; DR.
C'era una volta (pensa, 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 condividendole 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 rispediti all'utente. Andava bene, ma significava che, se si voleva fare un calcolo che avrebbe richiesto un paio di giorni, nessun altro poteva usare il computer in quel periodo.
La prossima innovazione (credo, anni '60 -'70) fu la condivisione del tempo . Ora, invece di eseguire l'intero compito, quindi l'intero del prossimo, il computer eseguirà un po 'di un compito, quindi lo metterebbe in pausa ed eseguirà un po' del prossimo, e così via. Pertanto, il computer darebbe l'impressione di eseguire contemporaneamente più processi. Il grande vantaggio di questo è che ora puoi eseguire un calcolo che richiederà un paio di giorni e, anche se ora richiederà ancora più tempo, perché continua a essere interrotto, altre persone possono comunque usare la macchina durante quel periodo.
Tutto questo era per enormi computer in stile mainframe. Quando i personal computer hanno iniziato a diventare popolari, inizialmente non erano molto potenti e, ehi, dal momento che erano personali sembrava OK per loro poter fare solo una cosa - eseguire un'applicazione - alla volta (pensa, anni '80). Ma quando sono diventati più potenti (pensa, per presentare gli anni '90), anche le persone volevano che i loro personal computer condividessero il tempo.
Quindi abbiamo finito con i personal computer che davano l'illusione di eseguire più processi contemporaneamente eseguendoli uno alla volta per brevi periodi e poi sospendendoli. Le discussioni sono essenzialmente la stessa cosa: alla fine, le persone volevano persino i singoli processi per dare l'illusione di fare più cose contemporaneamente. Inizialmente, lo scrittore dell'applicazione doveva gestirlo da solo: passare un po 'di tempo ad aggiornare la grafica, mettere in pausa, passare un po' di tempo a calcolare, mettere in pausa, passare un po 'di tempo facendo qualcos'altro, ...
Tuttavia, il sistema operativo era già bravo a 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 diversi o molti. Ognuno di questi thread corrisponde a una sottoattività in qualche modo indipendente.
Ma, al livello più alto, la CPU continua a dare l'illusione che questi thread siano tutti in esecuzione contemporaneamente. In realtà, ne esegue uno per un po ', mettendolo in pausa, scegliendone un altro per correre un po' e così via. Solo che le moderne CPU possono eseguire più di un thread alla volta. Quindi, nella realtà reale , il sistema operativo sta giocando a questo gioco di "corri per un po ', metti in pausa, esegui qualcos'altro per un po', metti in pausa" su tutti i core contemporaneamente. Quindi, puoi avere quanti thread vuoi tu (e i tuoi progettisti di applicazioni) ma, in qualsiasi momento, tutti, tranne alcuni, verranno effettivamente messi in pausa.