Jak mogę mieć 1805 wątków, skoro mam tylko 4 wirtualne procesory?


10

Zastanawiałem się, czy ktoś mógłby mi wyjaśnić, jak w moim monitorze aktywności napisano, że mam obecnie 1805 wątków Zrzut ekranu z Monitora aktywności OS X

Ale mam tylko 4 wirtualne rdzenie na moim komputerze (co oznacza, że ​​powinienem mieć tylko 4 wątki). Czy liczba wątków oznacza wszystkie wątki obsługiwane przez procesory, gdy podejmują one decyzję, który wątek wykonać?

EDYCJA: Powód, dla którego uważam, że na moim komputerze mogą być tylko 4 wątki, pochodzi z tej odpowiedzi . Uważam, że moje nieporozumienie wynika z użycia słowa „wątek” w innym kontekście.


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
bmike

Odpowiedzi:


24

Planowanie

Twoje 1,805 wątków nie działa jednocześnie . Wymieniają się. Jeden rdzeń uruchamia kawałek wątku, a następnie odkłada go na bok, aby wykonać kawałek innego wątku. Inne rdzenie robią to samo. Okrągłe i okrągłe wątki wykonują się po trochu, nie wszystkie naraz.

Główną odpowiedzialnością systemu operacyjnego (Darwin i macOS) jest ustalenie, który wątek ma zostać wykonany na jakim rdzeniu przez jak długi czas.

Wiele wątków nie ma nic do roboty, dlatego są uśpione i nieplanowane. Podobnie wiele wątków może oczekiwać na niektóre zasoby, takie jak dane do pobrania z pamięci, połączenie sieciowe do ukończenia lub dane do załadowania z bazy danych. Nie mając prawie nic do roboty, jak tylko sprawdzić status oczekiwanego zasobu, takie wątki są planowane dość krótko, jeśli w ogóle.

Programista aplikacji może pomóc w tej operacji planowania, śpiąc przez pewien czas w swoim wątku, gdy wie, że oczekiwanie na zasób zewnętrzny zajmie trochę czasu. A jeśli działa „ciasna” pętla, która wymaga dużej mocy obliczeniowej bez konieczności oczekiwania na zasoby zewnętrzne, programista może wstawić wezwanie do ochotnika, aby zostać na krótko odłożonym na bok, aby nie porywać rdzenia, a tym samym umożliwić wykonywanie innych wątków.

Aby uzyskać więcej informacji, zobacz stronę Wikipedii dotyczącą wielowątkowości .

Jednoczesne wielowątkowość

Jeśli chodzi o powiązane pytanie , wątki są rzeczywiście takie same jak tutaj.

Jednym z problemów jest narzut związany z przełączaniem wątków zgodnie z harmonogramem systemu operacyjnego. Wyładowanie instrukcji i danych bieżącego wątku z rdzenia wiąże się ze znacznymi kosztami, a następnie załadowanie instrukcji i danych następnego zaplanowanego wątku. Częścią systemu operacyjnego jest staranie się sprytnie planować wątki, aby zoptymalizować koszty ogólne.

Niektórzy producenci procesorów opracowali technologię, która skraca ten czas, aby znacznie przyspieszyć przełączanie między parą wątków. Intel nazywa swoją technologię Hyper-Threading . Znany ogólnie jako jednoczesne wielowątkowość (SMT) .

Podczas gdy para wątków nie wykonuje się jednocześnie, przełączanie jest tak płynne i szybkie, że oba wątki wydają się być praktycznie jednoczesne. Działa to tak dobrze, że każdy rdzeń przedstawia się jako para wirtualnych rdzeni systemu operacyjnego. Na przykład procesor obsługujący SMT z czterema rdzeniami fizycznymi zaprezentuje się w systemie operacyjnym jako ośmiordzeniowy procesor.

Pomimo tej optymalizacji nadal istnieje pewien narzut związany z przełączaniem między takimi wirtualnymi rdzeniami. Zbyt wiele wątków intensywnie wykorzystujących procesor, wszystkie domysły, aby czas wykonania mógł zostać zaplanowany na rdzeniu, mogą sprawić, że system będzie nieefektywny, a żaden wątek nie wykona zbyt wiele pracy. Podobnie jak trzy kulki na placu zabaw są dzielone pomiędzy dziewięciu dzieci, w porównaniu do dzielenia się między dziewięciu sto dzieci, gdzie nikt dzieciak naprawdę dostaje żadnego poważnego utworu z piłką.

W oprogramowaniu procesora jest więc opcja, w której sysadmin może wcisnąć przełącznik na maszynie, aby wyłączyć SMT, jeśli uzna, że ​​byłoby to korzystne dla jej użytkowników korzystających z aplikacji, która jest wyjątkowo związana z procesorem i ma bardzo mało możliwości wstrzymania.

W takim przypadku wracamy do twojego pierwotnego pytania: W tej szczególnej sytuacji naprawdę chciałbyś ograniczyć operacje, aby nie mieć więcej tych hiperaktywnych wątków niż rdzeni fizycznych. Ale powtórzę: jest to niezwykle niezwykła sytuacja, która może wystąpić w czymś w rodzaju specjalistycznego projektu polegającego na łamaniu danych naukowych, ale prawie nigdy nie miałaby zastosowania do typowych scenariuszy biznesowych / korporacyjnych / korporacyjnych.


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
bmike

Ponadto nikt nie umieszcza yield()wywołań systemowych w swoich wątkach intensywnie wykorzystujących procesor (chyba że jest to starszy kod ze współpracy wielozadaniowej na klasycznym MacOS). Zapobiegawcza wielozadaniowość zmienia harmonogram, gdy wątek zużyje swoją szczelinę czasową.
Peter Cordes

Twój opis hiperwątkowania jest nieprawidłowy. Wątki sprzętowe! = Wątki oprogramowania, są to konteksty wykonania / rdzenie logiczne. Oba rdzenie logiczne na rdzeniu fizycznym naprawdę uruchamiają instrukcje w tym samym czasie. Interfejs naprzemiennie przełącza się między wątkami (każdy cykl), ale rdzeń wykonawczy poza kolejnością może wykonywać instrukcje / wyskakiwać z obu wątków w tym samym cyklu. To ujawnia równoległość na poziomie instrukcji z dwóch wątków do wykonywania OoO, aby lepiej utrzymywać jednostki wykonawcze zasilane pracą (jest to w zasadzie sedno SMT). To nie tylko „zoptymalizowane przełączanie kontekstu”.
Peter Cordes,


7

W dawnych czasach pamięć nie była zwirtualizowana ani chroniona, a każdy kod mógł pisać w dowolnym miejscu. W tamtych czasach sens miał jeden wątek do jednego procesora. Od dziesięcioleci pamięć była najpierw chroniona, a następnie wirtualizowana. Pomyśl o wątkach jak o wirtualnych rdzeniach - coś w rodzaju obietnicy, że w pewnym momencie, gdy twoje dane i kod były gotowe, wątek zostaje wypchnięty ( lub zaplanowany, jak nazywają to inżynierowie i matematyki PHD ) na rzeczywisty procesor, aby wykonywać rzeczywistą pracę.

wprowadź opis zdjęcia tutaj

Teraz - ze względu na różnice w czasie - procesor i pamięć podręczna działają tak szybko w porównaniu do pobierania danych z pamięci lub sieci - że tysiące wątków mogą przychodzić i odchodzić, podczas gdy jeden wątek czeka na www.google.com pakiet lub dwa dane, dlatego właśnie widzisz o wiele więcej wątków niż rzeczywisty procesor.

Jeśli przekonwertujesz operacje wątku, które mają miejsce na czarno / niebieskiej skali czasu i przekonwertujesz je na sekundę = 1 ns, to, na czym nam zależy, bardziej przypomina dysk IO. 100 mikrosekund trwa około 4 dni, a 200 ms podróż w obie strony to 20 lat opóźnienia, jeśli odliczasz sekundy na skali czasu procesora. Podobnie jak wiele mocy dziesięciu ćwiczeń , w prawie wszystkich przypadkach - procesor pozostaje bezczynny przez „miesiące”, czekając na znaczącą pracę z bardzo, bardzo wolnego świata zewnętrznego.

Nic nie wydaje się błędne na opublikowanym obrazie, więc być może nie rozumiemy, do czego zmierzasz, zastanawiając się nad wątkami.

Jeśli klikniesz prawym przyciskiem myszy (kliknięcie kontrolne) na wątki słowa w wierszu nagłówka u góry, dodaj status aplikacji, a zobaczysz, że większość wątków jest prawdopodobnie bezczynna, śpi, nie działa w danym momencie.


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
bmike

1

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.