No se hace la pregunta posiblemente más fundamental: "¿Cómo puedo tener 290 procesos cuando mi CPU solo tiene cuatro núcleos?" Esta respuesta es un poco de historia, lo que podría ayudarlo a comprender el panorama general, a pesar de que la pregunta específica ya ha sido respondida. Como tal, no voy a dar una versión TL; DR.
Érase una vez (piense, de 1950 a 1960), las computadoras solo podían hacer una cosa a la vez. Eran muy caros, llenaban habitaciones enteras, y necesitábamos una manera de hacer un uso eficiente de ellos compartiéndolos entre varias personas. La primera forma de hacerlo era el procesamiento por lotes , en el que los usuarios enviaban tareas a la computadora y se ponían en cola, se ejecutaban una tras otra y los resultados se enviaban de vuelta al usuario. Eso estuvo bien, pero significaba que, si deseaba hacer un cálculo que tomaría un par de días, nadie más podría usar la computadora durante ese tiempo.
La siguiente innovación (piense, 1960-70) fue el tiempo compartido . Ahora, en lugar de ejecutar la totalidad de una tarea, luego la totalidad de la siguiente, la computadora ejecutará un poco de una tarea, luego hará una pausa y ejecutará un poco de la siguiente, y así sucesivamente. Por lo tanto, la computadora daría la impresión de que estaba ejecutando múltiples procesos al mismo tiempo. La gran ventaja de esto es que ahora puede ejecutar un cálculo que tomará un par de días y, aunque ahora tomará aún más tiempo, porque se sigue interrumpiendo, otras personas aún pueden usar la máquina durante ese tiempo.
Todo esto fue para enormes computadoras de estilo mainframe. Cuando las computadoras personales comenzaron a ser populares, inicialmente no eran muy potentes y, hey, dado que eran personales , parecía correcto que solo pudieran hacer una cosa & nbdp; ejecutar una aplicación a la vez (piense en la década de 1980). Pero, a medida que se volvieron más poderosos (piense, de los años 90 al presente), la gente también quería que sus computadoras personales compartieran el tiempo.
Así que terminamos con computadoras personales que daban la ilusión de ejecutar múltiples procesos simultáneamente, ejecutándolos uno a la vez por breves períodos y luego pausándolos. Los hilos son esencialmente lo mismo: eventualmente, las personas querían incluso procesos individuales para dar la ilusión de hacer varias cosas al mismo tiempo. Al principio, el escritor de la aplicación tenía que manejar eso: gastar un poco mientras actualizaba los gráficos, pausar eso, gastar un poco mientras calculaba, pausar eso, gastar un poco mientras hacía otra cosa ...
Sin embargo, el sistema operativo ya era bueno en la gestión de múltiples procesos, tenía sentido extenderlo para administrar estos subprocesos, que se denominan subprocesos. Entonces, ahora, tenemos un modelo donde cada proceso (o aplicación) contiene al menos un hilo, pero algunos contienen varios o muchos. Cada uno de estos hilos corresponde a una subtarea algo independiente.
Pero, en el nivel superior, la CPU solo da la ilusión de que todos estos hilos se están ejecutando al mismo tiempo. En realidad, está ejecutando uno por un momento, pausándolo, eligiendo otro para ejecutar por un momento, y así sucesivamente. Excepto que las CPU modernas pueden ejecutar más de un hilo a la vez. Entonces, en la realidad real , el sistema operativo está jugando este juego de "correr por un momento, pausar, ejecutar algo más por un momento, pausar" en todos los núcleos simultáneamente. Por lo tanto, puede tener tantos subprocesos como desee (y los diseñadores de sus aplicaciones), pero, en cualquier momento, todos menos algunos se detendrán.