Nie zadajesz chyba bardziej fundamentalnego pytania: „Jak mogę mieć 290 procesów, skoro mój procesor ma tylko cztery rdzenie?”. Ta odpowiedź to trochę historii, która może pomóc w zrozumieniu ogólnego obrazu, nawet jeśli na konkretne pytanie już udzielono odpowiedzi. W związku z tym nie zamierzam podawać wersji TL; DR.
Dawno, dawno temu (pomyśl, lata 50. i 60. XX wieku) komputery mogły robić tylko jedną rzecz naraz. Były bardzo drogie, wypełniały całe pokoje i potrzebowaliśmy sposobu, aby efektywnie z nich korzystać, dzieląc je między wiele osób. Pierwszym sposobem na wykonanie tego było przetwarzanie wsadowe , w którym użytkownicy przesyłali zadania do komputera, ustawiali się w kolejce, wykonywali jeden po drugim, a wyniki wysyłano z powrotem do użytkownika. To było OK, ale oznaczało, że jeśli chcesz wykonać obliczenia, które potrwają kilka dni, nikt inny nie będzie mógł korzystać z komputera w tym czasie.
Kolejną innowacją (pomyśl, lata 60. i 70.) było dzielenie czasu . Teraz zamiast wykonać całe jedno zadanie, a następnie całe następne, komputer wykonałby trochę jednego zadania, a następnie wstrzymał je i wykonał trochę następnego, i tak dalej. W ten sposób komputer sprawiałby wrażenie, że wykonuje jednocześnie wiele procesów. Ogromną zaletą tego jest to, że teraz możesz uruchomić obliczenia, które potrwają kilka dni i chociaż potrwa to jeszcze dłużej, ponieważ ciągle się przerywa, inne osoby mogą nadal korzystać z maszyny w tym czasie.
Wszystko to dotyczyło wielkich komputerów w stylu mainframe. Kiedy komputery osobiste zaczęły być popularne, początkowo nie były bardzo wydajne, a ponieważ były osobiste , wydawało się, że jest w stanie zrobić tylko jedną rzecz - uruchomić jedną aplikację naraz (pomyśl, lata osiemdziesiąte). Ale kiedy stały się potężniejsze (myślę, że w latach 90. XX wieku), ludzie chcieli, aby ich komputery osobiste również dzieliły czas.
Skończyliśmy z komputerami osobistymi, które dawały złudzenie, że wiele procesów działa jednocześnie, uruchamiając je pojedynczo przez krótki czas, a następnie wstrzymując. Wątki są w gruncie rzeczy tym samym: w końcu ludzie chcieli nawet pojedynczych procesów, aby złudzić, że robi się wiele rzeczy jednocześnie. Początkowo autor aplikacji musiał sam sobie z tym poradzić: poświęcić trochę czasu na aktualizację grafiki, wstrzymać to, poświęcić trochę na obliczenia, zatrzymać to, poświęcić trochę czasu na zrobienie czegoś innego, ...
Jednak system operacyjny był już dobry w zarządzaniu wieloma procesami, sensowne było rozszerzenie go o zarządzanie tymi podprocesami, zwanymi wątkami. Mamy teraz model, w którym każdy proces (lub aplikacja) zawiera co najmniej jeden wątek, ale niektóre zawierają kilka lub wiele. Każdy z tych wątków odpowiada nieco niezależnemu podzadaniu.
Ale na najwyższym poziomie procesor wciąż daje złudzenie, że wszystkie te wątki działają jednocześnie. W rzeczywistości działa jeden na chwilę, wstrzymując go, wybierając inny, aby trochę uruchomić, i tak dalej. Tyle że współczesne procesory mogą obsługiwać więcej niż jeden wątek jednocześnie. Tak więc, w realnej rzeczywistości, system operacyjny jest grać w tę grę „prowadzonym przez bit, pauza, uruchomić coś innego dla kawałka, Pauza” na wszystkich rdzeni jednocześnie. Możesz więc mieć tyle wątków, ile chcesz (i twoi projektanci aplikacji), ale w dowolnym momencie wszystkie z wyjątkiem kilku zostaną faktycznie wstrzymane.