Jaka jest różnica między nicią a włóknem?


187

Jaka jest różnica między nicią a włóknem? Słyszałem o włóknach z rubinu i czytałem, że są one dostępne w innych językach, czy ktoś mógłby mi wyjaśnić w prosty sposób, jaka jest różnica między nitką a włóknem.

Odpowiedzi:


162

Mówiąc najprościej, nici są ogólnie uważane za zapobiegawcze (chociaż nie zawsze może to być prawdą, w zależności od systemu operacyjnego), podczas gdy włókna są uważane za lekkie, współpracujące nici. Obie są osobnymi ścieżkami wykonywania dla aplikacji.

W przypadku wątków: bieżąca ścieżka wykonania może zostać w dowolnym momencie przerwana lub wstrzymana (uwaga: ta instrukcja jest uogólnieniem i może nie zawsze być prawdziwa w zależności od systemu operacyjnego / pakietu wątków / itp.). Oznacza to, że w przypadku wątków integralność danych jest dużym problemem, ponieważ jeden wątek może zostać zatrzymany w trakcie aktualizacji fragmentu danych, pozostawiając integralność danych w złym lub niepełnym stanie. Oznacza to również, że system operacyjny może korzystać z wielu procesorów i rdzeni procesora, uruchamiając więcej niż jeden wątek w tym samym czasie i pozostawiając programistom ochronę dostępu do danych.

Z włóknami: bieżąca ścieżka wykonania jest przerywana tylko wtedy, gdy włókno daje wykonanie (ta sama uwaga jak powyżej). Oznacza to, że światłowody zawsze zaczynają się i zatrzymują w ściśle określonych miejscach, więc integralność danych jest znacznie mniejszym problemem. Ponadto, ponieważ włóknami często zarządza się w przestrzeni użytkownika, nie trzeba wprowadzać drogich przełączników kontekstu i zmian stanu procesora, dzięki czemu zmiana jednego włókna na drugie jest niezwykle wydajna. Z drugiej strony, ponieważ żadne dwa włókna nie mogą działać dokładnie w tym samym czasie, samo użycie samych włókien nie skorzysta z wielu procesorów lub wielu rdzeni procesora.


7
Czy jest jakiś sposób na użycie wielu wątków do równoległego wykonywania włókien?
Baradé,

2
@Jason, Kiedy podajesz ~ "z włóknami, bieżąca ścieżka wykonania zostaje przerwana tylko wtedy, gdy włókno daje wykonanie", a "włókna zawsze zaczynają się i zatrzymują w dobrze określonych miejscach, więc integralność danych jest znacznie mniejszym problemem", Czy masz na myśli, że dzieląc zmienne, nie musimy używać „mechanizmów blokujących” i zmiennych niestabilnych? Czy masz na myśli, że nadal musimy robić te rzeczy?
Pacerier

@ Baradé To interesujące pytanie, czy znalazłeś odpowiedź?
Mayur

57

Wątki używają planowania wyprzedzającego , podczas gdy włókna używają planowania kooperacyjnego .

W przypadku wątku przepływ sterowania może zostać przerwany w dowolnym momencie, a inny wątek może przejąć kontrolę. Dzięki wielu procesorom możesz mieć wiele wątków działających jednocześnie ( jednoczesny wielowątkowość lub SMT). W rezultacie musisz bardzo uważać na równoczesny dostęp do danych i chronić swoje dane za pomocą muteksów, semaforów, zmiennych warunkowych itd. Często bardzo trudno jest się dobrze postarać.

W przypadku światłowodu sterowanie przełącza się tylko wtedy, gdy zostaniesz o to poproszony, zwykle z wywołaniem funkcji o nazwie coś takiego yield(). Ułatwia to równoczesny dostęp do danych, ponieważ nie musisz się martwić atomicznością struktur danych lub muteksów. Dopóki nie poddasz się, nie ma niebezpieczeństwa, że ​​zostaniesz zatrzymany i że inny światłowód spróbuje odczytać lub zmodyfikować dane, z którymi pracujesz. Jednak w rezultacie, jeśli twoje włókno wpada w nieskończoną pętlę, żadne inne włókno nie może działać, ponieważ nie poddajesz się.

Możesz także mieszać nici i włókna, co powoduje problemy, z którymi borykają się oba. Nie jest to zalecane, ale czasem może to być właściwe, jeśli zrobione ostrożnie.


3
Myślę, że nieskończona pętla jest tylko błędem, który należy naprawić, a wątki mają dość niejasną przewagę tylko wtedy, gdy istnieje nieskończona pętla. Powiązana koncepcja niezwiązana z błędami ma miejsce, gdy istnieje długotrwały proces, który użytkownik może chcieć anulować. W tym przypadku, bez względu na to, czy używasz nici, czy włókna, długotrwały proces musi być kooperatywny - samo zabicie jego wątku może popsuć niektóre struktury danych, więc jednym z lepszych sposobów jest np. Długotrwały wątek procesowy sprawdzany okresowo gdyby zostało przerwane. Nie różni się to tak bardzo od okresowego plonowania włókna.
Evgeni Sergeevev

43

W Win32 światłowód jest rodzajem wątku zarządzanego przez użytkownika. Światłowód ma swój własny stos i własny wskaźnik instrukcji itp., Ale światłowody nie są planowane przez system operacyjny: musisz jawnie wywołać SwitchToFiber. W przeciwieństwie do tego wątki są uprzednio planowane przez system operacyjny. Mówiąc z grubsza, światłowód jest wątkiem zarządzanym na poziomie aplikacji / środowiska wykonawczego, a nie prawdziwym wątkiem systemu operacyjnego.

Konsekwencje są takie, że włókna są tańsze, a aplikacja ma większą kontrolę nad harmonogramem. Może to być ważne, jeśli aplikacja tworzy wiele współbieżnych zadań i / lub chce ściśle zoptymalizować działanie. Na przykład serwer bazy danych może wybrać użycie włókien zamiast wątków.

(Mogą istnieć inne zastosowania tego samego terminu; jak wspomniano, jest to definicja Win32.)


37

Najpierw poleciłbym przeczytanie tego wyjaśnienia różnicy między procesami a wątkami jako materiału tła.

Po przeczytaniu, że jest to całkiem proste. Wątki mogą być zaimplementowane w jądrze, w przestrzeni użytkownika lub oba mogą być mieszane. Włókna to w zasadzie wątki zaimplementowane w przestrzeni użytkownika.

  • To, co zwykle nazywa się wątkiem, to wątek wykonania zaimplementowany w jądrze: tak zwany wątek jądra. Planowanie wątku jądra jest obsługiwane wyłącznie przez jądro, chociaż wątek jądra może dobrowolnie zwolnić procesor przez uśpienie, jeśli chce. Wątek jądra ma tę zaletę, że może korzystać z blokowania we / wy i pozwolić jądrze martwić się o planowanie. Jego główną wadą jest to, że przełączanie wątków jest stosunkowo wolne, ponieważ wymaga pułapkowania w jądrze.
  • Włókna to wątki przestrzeni użytkownika, których planowanie jest obsługiwane w przestrzeni użytkownika przez jeden lub więcej wątków jądra w ramach jednego procesu. Dzięki temu przełączanie światłowodów jest bardzo szybkie. Jeśli zgrupujesz wszystkie włókna uzyskujące dostęp do określonego zestawu współużytkowanych danych w kontekście pojedynczego wątku jądra, a ich planowanie będzie obsługiwane przez pojedynczy wątek jądra, możesz wyeliminować problemy z synchronizacją, ponieważ włókna będą działały szeregowo, a Ty ukończysz kontrola nad ich harmonogramem. Ważne jest grupowanie powiązanych włókien w jednym wątku jądra, ponieważ wątek jądra, w którym pracują, może zostać uprzednio opróżniony przez jądro. Ten punkt nie jest wyjaśniony w wielu innych odpowiedziach. Ponadto, jeśli korzystasz z blokowania I / O we włóknie, cały wątek jądra jest częścią bloków, w tym wszystkie włókna, które są częścią tego wątku jądra.

W sekcji 11.4 „Procesy i wątki w systemie Windows Vista” w nowoczesnych systemach operacyjnych Tanenbaum komentuje:

Chociaż włókna są planowane wspólnie, jeśli istnieje wiele wątków szeregujących włókna, potrzeba dużo starannej synchronizacji, aby upewnić się, że włókna nie przeszkadzają sobie nawzajem. Aby uprościć interakcję między wątkami i włóknami, często warto utworzyć tylko tyle wątków, ile jest procesorów, aby je uruchomić, i afinizować wątki do każdego uruchomienia tylko na odrębnym zestawie dostępnych procesorów lub nawet tylko na jednym procesorze. Każdy wątek może następnie prowadzić określony podzbiór włókien, ustanawiając relację jeden do wielu między nitkami i włóknami, co upraszcza synchronizację. Mimo to nadal istnieje wiele trudności z włóknami. Większość bibliotek Win32 jest całkowicie nieświadoma włókien, a aplikacje, które próbują używać włókien tak, jakby były wątkami, napotykają różne awarie. Jądro nie ma wiedzy o włóknach, a gdy włókno wejdzie do jądra, wątek, na którym wykonuje, może się zablokować, a jądro zaplanuje dowolny wątek na procesorze, uniemożliwiając uruchomienie innych włókien. Z tych powodów włókna są rzadko używane, z wyjątkiem przypadków przenoszenia kodu z innych systemów, które wyraźnie potrzebują funkcjonalności zapewnianej przez włókna.


4
To jest najbardziej kompletna odpowiedź.
Bernard

12

Pamiętaj, że oprócz wątków i włókien system Windows 7 wprowadza harmonogram trybu użytkownika :

Planowanie w trybie użytkownika (UMS) to lekki mechanizm, za pomocą którego aplikacje mogą planować własne wątki. Aplikacja może przełączać się między wątkami UMS w trybie użytkownika bez angażowania programu planującego system i odzyskać kontrolę nad procesorem, jeśli wątek UMS zablokuje się w jądrze. Wątki UMS różnią się od włókien tym, że każdy wątek UMS ma własny kontekst wątku zamiast współdzielić kontekst wątku jednego wątku. Możliwość przełączania między wątkami w trybie użytkownika czyni UMS bardziej wydajnym niż pule wątków do zarządzania dużą liczbą krótkotrwałych elementów pracy, które wymagają niewielu wywołań systemowych.

Więcej informacji na temat wątków, włókien i UMS można znaleźć, oglądając Dave'a Proberta: Inside Windows 7 - User Mode Scheduler (UMS) .


7

Wątki są planowane przez system operacyjny (z wyprzedzeniem). Wątek może być zatrzymany lub wznowiony w dowolnym momencie przez system operacyjny, ale włókna mniej więcej sobie radzą (współpracują) i ulegają sobie nawzajem. Oznacza to, że programista kontroluje, kiedy włókna wykonują przetwarzanie, a kiedy przetwarzanie to przełącza się na inne włókno.


7

Wątki zwykle polegają na jądrze, aby przerwać wątek, aby mógł on działać lub inny wątek (co jest lepiej znane jako wielozadaniowość z wyprzedzeniem), podczas gdy włókna wykorzystują wielozadaniowość kooperacyjną, gdy to samo włókno poświęca czas pracy, aby inne włókna mogą działać.

Niektóre przydatne linki wyjaśniające to lepiej niż prawdopodobnie to:


7

Wątki zostały pierwotnie utworzone jako lekkie procesy. W podobny sposób, włókna są lekką nicią, polegającą (w uproszczeniu) na samych włóknach, aby wzajemnie się układały, dając kontrolę.

Myślę, że następnym krokiem będą pasma, w których musisz wysłać im sygnał za każdym razem, gdy chcesz, aby wykonali instrukcję (podobnie jak mój syn 5yo :-). W dawnych czasach (a nawet teraz na niektórych platformach osadzonych) wszystkie wątki były włóknami, nie było uprzedzeń i trzeba było pisać wątki, aby zachowywać się ładnie.


3

Definicja włókna Win32 jest w rzeczywistości definicją „zielonego wątku” opracowaną przez Sun Microsystems. Nie ma potrzeby marnowania terminu włókno na jakiś wątek, tj. Wątek wykonywany w przestrzeni użytkownika pod kontrolą kodu użytkownika / biblioteki wątków.

Aby wyjaśnić argument, spójrz na następujące komentarze:

  • Dzięki hiperwątkowości wielordzeniowy procesor może przyjmować wiele wątków i dystrybuować je po jednym na każdym rdzeniu.
  • Potokowy procesor superskalarny akceptuje jeden wątek do wykonania i używa równoległości poziomu instrukcji (ILP) w celu szybszego uruchomienia wątku. Możemy założyć, że jeden wątek jest podzielony na równoległe włókna biegnące w równoległych rurociągach.
  • Procesor SMT może akceptować wiele wątków i zamieniać je we włókna instrukcji w celu równoległego wykonywania na wielu potokach, przy użyciu bardziej wydajnych potoków.

Powinniśmy założyć, że procesy są wykonane z nici i że nici powinny być wykonane z włókien. Mając to na uwadze, używanie włókien do innych rodzajów nici jest złe.


To jest interesujące.
JSON,
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.