Przejdź do zawartości

Green thread

Z Wikipedii, wolnej encyklopedii
To jest najnowsza wersja artykułu Green thread edytowana 17:31, 9 wrz 2022 przez Velta (dyskusja | edycje).
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Green thread (ang. zielony wątek) − wątek, który jest tworzony i obsługiwany przez maszynę wirtualną, w odróżnieniu od wątków natywnych danego systemu operacyjnego. Zielone wątki emulują środowisko wielowątkowe niezależnie od możliwości systemu, na którym zostały uruchomione. Są zarządzane w przestrzeni użytkownika, a nie jądra systemu, przez co mają możliwość pracy w środowiskach, które nie wspierają wątków[1].

Wydajność

[edytuj | edytuj kod]

Na wielordzeniowych procesorach, natywne implementacje wątków pozwalają na automatyczne podzielenie pracy na poszczególne procesory, na co zwyczajowo nie zezwalają implementacje zielonych wątków[1] [2]. Na niektórych maszynach wirtualnych zielone wątki mogą być uruchamiane szybciej niż odbywa się to dla natywnych wątków systemu operacyjnego. Na jednoprocesorowych komputerach najbardziej wydajny model nie został jeszcze jasno określony, benchmarki na komputerach z zainstalowanym jądrem linuksowym pokazują, że:[3]

  • zielone wątki wypadają lepiej od natywnych pod względem czasu aktywacji i synchronizacji
  • natywne wątki systemu osiągają dużo lepszą wydajność przy operacjach I/O oraz przy przełączaniu kontekstu.

Dodatkowo, zielony wątek może blokować wszystkie inne wątki, jeśli dokonuje blokującej operacji I/O. Aby zapobiec temu problemowi, zielone wątki muszą używać asynchronicznych operacji I/O, co komplikuje ich implementację, oraz zwiększa ich czas reakcji.

Stworzone w przestrzeni użytkownika zielone wątki są lżejsze od natywnych, ale jako że implementują formę wielozadaniowości, błędy implementacyjne w programach używających wątków mogą powodować nieoczekiwane zakończenie działania.

Zielone wątki w wirtualnej maszynie Javy

[edytuj | edytuj kod]

W Javie 1.1, zielone wątki były jedynymi dostępnymi[4], przynajmniej na systemie Solaris. Ponieważ zielone wątki posiadają pewne ograniczenia w stosunku do natywnych, w następnych wersjach Javy ustąpiły im miejsca.

Wyjątkiem jest wirtualna maszyna Squawk, która jest połączeniem systemu operacyjnego (dla niskopoziomowych urządzeń) oraz wirtualnej maszyny Java. Zielone wątki są tu używane w celu zminimalizowania ilości natywnego kodu i obsługi migracji tego, co jest izolowane (poprzez odpowiedni interfejs).

Zielone wątki w innych wirtualnych maszynach

[edytuj | edytuj kod]

Inne maszyny wirtualne, które nadal implementują zielone wątki zamiast wsparcia dla natywnych wątków:

Wirtualna maszyna Erlanga zawiera coś co można nazwać 'zielonymi procesami' - są one podobne do procesów systemu (nie współdzielą stanu tak jak wątki), lecz są zaimplementowane wewnątrz Erlang Run Time System (erts).

W przypadku GHC Haskell, przełączanie kontekstu występuje przy pierwszej alokacji, po upłynięciu konfigurowalnego limitu czasu. W trakcie swojego życia, wątki GHC są uruchamialne na jednym lub kilku wątkach systemu operacyjnego (występuje tu relacja wiele-do-wielu pomiędzy wątkami GHC a wątkami systemu operacyjnego), pozwalając na osiągnięcie współbieżności na maszynach z wieloprocesorowością symetryczną, nie tworząc większej ilości bardziej kosztownych wątków systemu operacyjnego, niż to potrzebne do obsługi dostępnych rdzeni.

Wirtualne maszyny Smalltalka nie oceniają przebiegu działania, mimo to maszyna wirtualna ciągle może zmienić przebieg działania wątku po otrzymaniu zewnętrznego sygnału (wyczerpanie limitu czasowego, zwolnienie zasobów I/O). Niektóre implementacje Smalltalka np. QKS Smalltalk, oceniają przebieg działania, obsługują zielone wątki i zapobiegają inwersji priorytetu. W większości środowisk Smalltalka, regularnie budzący się proces o wysokim priorytecie efektywnie implementuje wywłaszczanie:

 [
    [(Delay forMilliseconds: 50) wait] repeat
 ] forkAt: Processor highIOPriority

Większość implementacji zielonych wątków nie zawiera obsługi zapobiegania przed inwersją priorytetów.

Przypisy

[edytuj | edytuj kod]
  1. a b Four for the ages. javaworld.com. [dostęp 2009-06-01]. [zarchiwizowane z tego adresu (2013-02-06)].
  2. What is the difference between "green" threads and "native" threads?. jguru.com, 6 września 2000. [dostęp 2009-06-01].
  3. Comparative performance evaluation of Java threads for embedded applications: Linux Thread vs. Green Thread [1]
  4. Threading. java.sun.com. [dostęp 2009-06-01].
  5. ruby-doc.org -&nbspRessources et information concernant ruby-doc Resources and Information [online], spec.ruby-doc.org [dostęp 2018-09-07] [zarchiwizowane z adresu 2008-05-10] (ang.).
  6. Stackless.com: About Stackless. [dostęp 2008-08-27]. [zarchiwizowane z tego adresu (2013-02-06)].

Zobacz też

[edytuj | edytuj kod]

Linki zewnętrzne

[edytuj | edytuj kod]