Você não faz a pergunta sem dúvida mais fundamental: "Como posso ter 290 processos quando minha CPU possui apenas quatro núcleos?" Esta resposta é um pouco histórica, o que pode ajudá-lo a entender o panorama geral, mesmo que a pergunta específica já tenha sido respondida. Como tal, não darei uma versão TL; DR.
Era uma vez (pense nos anos 50-60), os computadores só podiam fazer uma coisa de cada vez. Eles eram muito caros, enchiam salas inteiras e precisávamos de uma maneira de usá-los com eficiência, compartilhando-os entre várias pessoas. A primeira maneira de fazer isso era o processamento em lote , no qual os usuários enviavam tarefas ao computador e eram colocados em fila, executados um após o outro e os resultados eram enviados de volta ao usuário. Tudo bem, mas significava que, se você quisesse fazer um cálculo que levaria alguns dias, ninguém mais poderia usar o computador durante esse período.
A próxima inovação (pense nos anos 1960-70) foi o compartilhamento de tempo . Agora, em vez de executar a tarefa inteira, e depois a próxima, o computador executaria um pouco de uma tarefa, depois a pausaria e executaria um pouco da próxima, e assim por diante. Assim, o computador daria a impressão de que estava executando vários processos simultaneamente. A grande vantagem disso é que agora você pode executar um cálculo que levará alguns dias e, embora demore ainda mais, porque continua sendo interrompido, outras pessoas ainda podem usar a máquina durante esse período.
Tudo isso foi para grandes computadores no estilo mainframe. Quando os computadores pessoais começaram a se popularizar, eles inicialmente não eram muito poderosos e, como eram pessoais , parecia bom para eles conseguirem fazer apenas uma coisa & nbdp; - executar um aplicativo - ao mesmo tempo (pense nos anos 80). Mas, à medida que se tornaram mais poderosos (pense nos anos 90 até o presente), as pessoas queriam que seus computadores pessoais também compartilhassem tempo.
Por isso, acabamos com computadores pessoais que deram a ilusão de executar vários processos simultaneamente, executando-os um de cada vez por breves períodos e depois pausando-os. Threads são essencialmente a mesma coisa: eventualmente, as pessoas queriam até processos individuais para dar a ilusão de fazer várias coisas simultaneamente. No início, o criador do aplicativo tinha que lidar com isso: gastar um pouco atualizando os gráficos, pausar isso, gastar um pouco de cálculo, pausar isso, passar um pouco fazendo outra coisa, ...
No entanto, o sistema operacional já era bom em gerenciar vários processos; fazia sentido estendê-lo para gerenciar esses subprocessos, chamados de threads. Portanto, agora, temos um modelo em que todo processo (ou aplicativo) contém pelo menos um encadeamento, mas alguns contêm vários ou muitos. Cada um desses segmentos corresponde a uma subtarefa um tanto independente.
Mas, no nível superior, a CPU ainda está apenas dando a ilusão de que esses threads estão todos executando ao mesmo tempo. Na realidade, ele roda um por um tempo, faz uma pausa, escolhe outro para rodar um pouco, e assim por diante. Exceto que as CPUs modernas podem executar mais de um thread de uma vez. Então, na realidade real , o sistema operacional está jogando esse jogo de "corra um pouco, faça uma pausa, corra outra coisa um pouco, faça uma pausa" em todos os núcleos simultaneamente. Portanto, você pode ter quantos threads quiser (e os designers de aplicativos), mas, a qualquer momento, todos, com exceção de alguns, serão pausados.