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

Jaka jest różnica między nicią a włóknem? Słyszałem o włóknach z ruby 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 wątkiem a włóknem.

Author: Grzegorz Wierzowiecki, 0000-00-00

4 answers

Najprościej mówiąc, wątki są ogólnie uważane za prewencyjne (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 wątki. Obie są oddzielnymi ścieżkami wykonania dla Twojej aplikacji.

With threads: bieżąca ścieżka wykonania może zostać przerwana lub wycofana w dowolnym momencie (Uwaga: Ta instrukcja jest uogólnieniem i nie zawsze może być prawdziwa w zależności od pakietu OS / threading / etc.). To 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 niekompletnym 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 deweloperowi 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 włókna zawsze zaczynają się i zatrzymują w dobrze zdefiniowanych miejscach, więc integralność danych jest znacznie mniejsza. Ponadto, ponieważ włókna są często zarządzane w przestrzeni użytkownika, kosztowne przełączniki kontekstowe i zmiany stanu procesora nie muszą być dokonywane, co sprawia, że zmiana z jednego włókna do drugiego jest niezwykle wydajna. Z drugiej strony, ponieważ żadne dwa włókna nie mogą działać dokładnie w tym samym czasie, samo użycie włókien nie wykorzysta wielu procesorów ani wielu rdzeni procesora.

 128
Author: Jason Coco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-28 04:40:19

Threads use pre-emptive scheduling, while fibers usecooperative scheduling.

W przypadku wątku przepływ sterowania może zostać przerwany w dowolnym momencie, a inny wątek może przejąć kontrolę. Z wieloma procesorami, możesz mieć wiele wątków uruchomionych w tym samym czasie (jednoczesne wielowątkowość lub SMT). W rezultacie musisz być bardzo ostrożny w dostępie do współbieżnych danych i chronić swoje dane za pomocą muteksów, semaforów, warunku zmienne i tak dalej. Często jest to bardzo trudne, aby uzyskać prawo.

W przypadku światłowodu, sterowanie przełącza się tylko wtedy, gdy go każesz, zazwyczaj za pomocą wywołania funkcji o nazwie coś w rodzaju yield(). Ułatwia to współbieżny dostęp do danych, ponieważ nie musisz się martwić o atomiczność struktur danych lub muteksów. Tak długo, jak nie poddasz się, nie ma niebezpieczeństwa bycia preempted i posiadania innego włókna próbującego odczytać lub zmodyfikować dane, z którymi pracujesz. W rezultacie, jednak, jeśli twój włókno wchodzi w nieskończoną pętlę, żadne inne włókno nie może działać, ponieważ nie ulegasz.

Można również mieszać nici i włókna, co powoduje problemy napotykane przez oba. Nie zaleca się, ale czasami może to być słuszne, jeśli zrobione starannie.

 47
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-28 04:38:10

W Win32 włókno jest rodzajem wątku zarządzanego przez użytkownika. Włókno ma swój własny stos i własny wskaźnik instrukcji itp., ale włókna nie są zaplanowane przez system operacyjny: musisz wywołać switchtofiber jawnie. Natomiast wątki są wstępnie zaplanowane przez system operacyjny. Tak więc z grubsza mówiąc włókno jest wątkiem zarządzanym na poziomie aplikacji/runtime, a nie prawdziwym wątkiem OS.

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

(mogą być inne zastosowania tego samego terminu; jak zauważono, jest to definicja Win32.)

 42
Author: itowlson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-28 04:35:44

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

Gdy już przeczytasz, że to całkiem proste. Wątki mogą być zaimplementowane albo w jądrze, w przestrzeni użytkownika, albo oba mogą być mieszane. Włókna to w zasadzie wątki zaimplementowane w przestrzeni użytkownika.

  • to, co zwykle nazywa się wątkiem, jest wątkiem wykonania zaimplementowanym w jądrze: co jest znane jako wątek jądra. Na 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 używać blokowania We/Wy i pozwalać jądru martwić się o planowanie. Główną wadą jest to, że przełączanie wątków jest stosunkowo powolne, ponieważ wymaga zalewkowania jądra.
  • Włókna to wątki przestrzeni użytkownika, których szeregowanie jest obsługiwane w przestrzeni użytkownika przez jeden lub więcej wątków jądra pod jednym proces. To sprawia, że przełączanie światłowodów jest bardzo szybkie. Jeśli zgrupujesz wszystkie włókna uzyskujące dostęp do określonego zestawu współdzielonych danych w kontekście pojedynczego wątku jądra, a ich planowanie jest obsługiwane przez pojedynczy wątek jądra, możesz wyeliminować problemy z synchronizacją, ponieważ włókna będą skutecznie działać szeregowo i masz pełną kontrolę nad ich planowaniem. Grupowanie powiązanych włókien pod pojedynczym wątkiem jądra jest ważne, ponieważ wątek jądra, w którym są uruchomione, może być / align = "left" / Kwestia ta nie jest wyjaśniona w wielu innych odpowiedziach. Ponadto, jeśli używasz blokowania We / Wy w włóknie, cały wątek jądra jest częścią bloków, w tym wszystkich włókien, które są częścią tego wątku jądra.

W sekcji 11.4 "procesy i wątki w Windows Vista" w nowoczesnych systemach operacyjnych, Tanenbaum Komentarze:

Chociaż włókna są wspólnie zaplanowane, jeśli istnieje wiele wątki, włókna, dużo staranności synchronizacja jest wymagane, aby upewnić się, że włókna nie kolidują ze sobą. Na uprość interakcję między nitkami i włóknami, często jest to przydatne do tworzenia tylko tylu wątków ile jest procesorów do uruchomienia ich, i affinitize threads to each run only on a distinct set of dostępne procesory, a nawet tylko jeden procesor. Każdy wątek może następnie uruchom określony podzbiór włókien, ustanawiając jeden to-wiele relacji między nitkami i włóknami, które upraszcza synchronizacja. Mimo to nadal istnieje wiele trudności z włókna. Większość bibliotek Win32 jest zupełnie nieświadoma włókien, a aplikacje, które próbują używać włókien tak, jakby były nitkami, będą napotkać różne niepowodzenia. Jądro nie posiada wiedzy o włóknach, a gdy włókno wchodzi do jądra, wątek jest wykonywany w maju bloku i jądro zaplanuje dowolny wątek na procesor, co uniemożliwia uruchamianie innych światłowodów. Dla tych uzasadnienie włókna są rzadko używane, z wyjątkiem przenoszenia kodu z innych systemy, które wyraźnie potrzebują funkcjonalności zapewnianej przez włókna.

 33
Author: Robert S. Barnes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:11