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.
źródło
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.
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.
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.
źródło
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.)
źródło
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.
W sekcji 11.4 „Procesy i wątki w systemie Windows Vista” w nowoczesnych systemach operacyjnych Tanenbaum komentuje:
źródło
Pamiętaj, że oprócz wątków i włókien system Windows 7 wprowadza harmonogram trybu użytkownika :
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) .
źródło
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.
źródło
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:
źródło
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.
źródło
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:
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.
źródło