Вы не задаете, возможно, более фундаментальный вопрос: «Как я могу иметь 290 процессов, когда мой процессор имеет только четыре ядра?» Этот ответ - немного истории, которая может помочь вам понять общую картину, даже если на конкретный вопрос уже дан ответ. Таким образом, я не собираюсь давать версию TL; DR.
Когда-то давно (вспомним, 1950–60-е годы) компьютеры могли делать только одно за раз. Они были очень дорогими, занимали целые комнаты, и нам нужен был способ их эффективного использования, разделяя их между несколькими людьми. Первым способом сделать это была пакетная обработка , при которой пользователи отправляли задачи на компьютер, и их ставили в очередь, выполняли одну за другой, а результаты отправляли обратно пользователю. Это было нормально, но это означало, что, если вы хотите сделать расчет, который займет пару дней, никто другой не сможет использовать компьютер в течение этого времени.
Следующим нововведением (вспомним, 1960–70-е годы) стало разделение времени . Теперь вместо выполнения всей одной задачи, а затем всей следующей, компьютер будет выполнять часть одной задачи, затем приостанавливать ее и выполнять следующую часть, и так далее. Таким образом, у компьютера создается впечатление, что он выполняет несколько процессов одновременно. Большим преимуществом этого является то, что теперь вы можете запускать вычисления, которые займут несколько дней, и, хотя теперь это займет еще больше времени, поскольку он продолжает прерываться, другие люди все еще могут использовать машину в течение этого времени.
Все это было для огромных компьютеров в стиле мэйнфреймов. Когда персональные компьютеры начали становиться популярными, они изначально были не очень мощными и, эй, поскольку они были личными, для них казалось нормальным, что они могут выполнять только одну вещь - запускать одно приложение - сразу (вспомним, 1980-е). Но по мере того, как они становились все более влиятельными (представьте, 1990-е годы), люди хотели, чтобы их персональные компьютеры тоже делили время.
Таким образом, мы получили персональные компьютеры, которые создавали иллюзию одновременного запуска нескольких процессов, фактически запуская их по одному на короткое время, а затем останавливая их. Потоки - это одно и то же: в конце концов, люди хотели, чтобы даже отдельные процессы создавали иллюзию одновременного выполнения нескольких действий. Сначала разработчик приложения должен был сам справиться с этим: потратить немного времени на обновление графики, сделать паузу, потратить немного времени на вычисления, сделать паузу, потратить немного времени на что-то другое, ...
Однако операционная система уже хорошо справлялась с управлением несколькими процессами, поэтому имело смысл расширить ее для управления этими подпроцессами, которые называются потоками. Итак, теперь у нас есть модель, в которой каждый процесс (или приложение) содержит хотя бы один поток, а некоторые содержат несколько или несколько. Каждый из этих потоков соответствует несколько независимой подзадаче.
Но на верхнем уровне процессор все еще только создает иллюзию того, что все эти потоки работают одновременно. В действительности, он запускает один на некоторое время, приостанавливает его, выбирает другой, чтобы запустить немного, и так далее. За исключением того, что современные процессоры могут запускать более одного потока одновременно. Таким образом, в реальной реальности операционная система играет в эту игру «беги немного, делай паузу, беги что-то еще, делай паузу» на всех ядрах одновременно. Таким образом, вы можете иметь столько потоков, сколько вам (и вашим разработчикам приложений), но в любой момент времени все, кроме нескольких, будут фактически приостановлены.