Chociaż wiem, że pytania na ten temat zostały już omówione (np. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), nie czuję, że mam satysfakcjonującą odpowiedź.

Pytanie brzmi: dlaczego JVM nie obsługuje już zielonych wątków?

Tak jest w często zadawanych pytaniach dotyczących języka Java w stylu kodu :

Zielony wątek odnosi się do trybu działania wirtualnej maszyny języka Java (JVM), w którym cały kod jest wykonywany w pojedynczym wątku systemu operacyjnego.

I to koniec java.sun.com :

Wadą jest to, że używanie zielonych wątków oznacza, że wątki systemowe w Linuksie nie są wykorzystywane, więc wirtualna maszyna Java nie jest skalowalna po dodaniu dodatkowych procesorów.

Wydaje mi się, że JVM mogłaby mieć pulę procesów systemowych równą liczbie rdzeni, a następnie uruchamiać zielone wątki. Może to dać duże korzyści, gdy masz bardzo dużą liczbę wątków, które często blokują (głównie dlatego, że obecna JVM ogranicza liczbę wątków).

Przemyślenia?

Komentarze

  • Wydaje mi się pytanie: po co zielone wątki? Po co ponownie wprowadzać wielowątkowość, emulując ją na poziomie maszyny JVM za pomocą wielu procesów? ' to dużo bólu i kosztów ogólnych, bo pozornie nie ma żadnych innych korzyści niż umożliwienie programistom bycia bardziej hojnymi w tworzeniu wątków (i ' nie jestem przekonany, że ' to zaleta).
  • Cóż, ' dotyczy współbieżnego modelu programowania, który skaluje. Obecnie w Javie, jeśli chcesz skalować przełączasz się na NIO z własną pulą wątków. Przynajmniej to ' rozumiem.
  • Obecność rzeczy takich jak < akka.io > który obsługuje Lekkie nici rts również każą mi myśleć, że jest taka potrzeba. Właściwie znalazłem tutaj całkiem niezłą dyskusję < stackoverflow.com/questions/7458782/… >
  • @delnan Ponieważ przełącznik kontekstu dla wątków natywnych kosztuje. Zielone wątki mają znacznie mniej narzutu na przełączanie kontekstu i synchronizacje międzyprocesowe. Ponadto liczba zielonych wątków jest praktycznie nieograniczona (może to być setki tysięcy bez zbytniego obciążenia dla procesu maszyny wirtualnej), podczas gdy liczba natywnych wątków jest ograniczona przez system operacyjny i narzut pamięci.
  • To zajęło dużo czasu, zanim maszyna JVM bezpośrednio obsługiwała wątki natywne. Do tego czasu zielone wątki były rozwiązaniem pośrednim.

Odpowiedź

Pamiętam, że JVM porzuciło zielone wątki i przeszło do natywne wątki. Dzieje się tak z dwóch prostych powodów: zielone wątki były szczerze śmieciami i istniała potrzeba wspierania wielordzeniowych procesorów przy ograniczonym wysiłku programistów dostępnym w firmie Sun.

Szkoda – zielone wątki zapewniają znacznie lepsza abstrakcja, pozwalająca współbieżności być użytecznym narzędziem, a nie przeszkodą. Ale zielone wątki nie są przydatne, jeśli nie można pokonać kilku przeszkód:

  • muszą używać wszystkich dostępnych rdzeni procesora

  • przełączanie kontekstu musi być tanie

  • I / O może blokować każdy zaangażowany wątek, ale nie żaden inny wątek i na pewno nie wszystkie inne wątki , co miało miejsce w niektórych wczesnych implementacjach.

Często zastanawiałem się, dlaczego wielowątkowość jest tak trudna w Javie, ale teraz staje się jaśniejsza – ostatecznie zrobić z przejściem na wątki natywne, które są:

  • dobry w używaniu wszystkich rdzeni procesora

  • dobry w byciu naprawdę współbieżne, zapewniające niezależne we / wy itp.

  • wolno przełączać kontekst (w porównaniu z najlepszymi implementacjami zielonych wątków)

  • strasznie chciwi z pamięcią, co ogranicza ich maksymalną użyteczną liczbę.

  • kiepska abstrakcja dla jakichkolwiek podstaw do wyrażania prawdziwego świata, co oczywiście jest wysoce zbieżne.

Obecnie plik Dużo czasu programisty przeznacza się teraz na kodowanie nieblokujących wejść / wyjść, przyszłości itp. Szkoda, że nie mamy lepszego poziomu abstrakcji.

w porównaniu, poza Erlangiem, nowy język Go świetnie radzi sobie z dużą współbieżnością. Dziadkiem z nich wszystkich pozostaje Occam , wciąż trwający projekt badawczy.

Komentarze

  • jak daleko zaszliśmy od czasu, gdy opublikowałeś: O
  • Niestety, Rust to kolejny język, który porzucił lepsze abstrakcje współbieżności. Oni również zdecydowali się przejść z wątków kooperacyjnych do wątków natywnych.
  • @ Rick-777 Rust jest na zbyt niskim poziomie, aby to zrobić.

Odpowiedź

Pojedynczy proces fałszujący wiele wątków wiąże się z wieloma problemami. Jedną z nich jest to, że wszystkie sfałszowane wątki zatrzymują się przy każdym błędzie strony.

Alternatywa, którą proponujesz, zbiór procesów, ma pewne zalety i wady. Największą zaletą jest izolacja „wątków”, tak naprawdę nie dałaby ci tutaj wiele. Dużą wadą, ekstremalną trudnością implementacji i mniej wydajną synchronizacją, jest tutaj zabójca transakcji.

Jednak ja zgadzam się, że istnieją aplikacje (nie Java), w których pula procesów, których można by używać jako puli wątków (ale z większą izolacją), byłaby świetna. Wątki współużytkują prawie wszystko. Dzięki procesom możesz konkretnie wybierz, czym chcesz się podzielić. O ile mi wiadomo, nikt nie podjął jeszcze wysiłku, aby go wdrożyć.

Komentarze

  • Occam twierdzi, że oferuje to. Był to znaczący język w ' latach 80., ale cierpiał z powodu braku funduszy na rozwój, przez co stał się tylko niszą badawczą. Jednak jego pomysły na temat współbieżności są teraz tak samo solidne jak wtedy i nie zostały jeszcze ulepszone.
  • Jeśli jesteś ” wielowątkowym ” al golang (” M: N ” planowanie typu), to teoretycznie tylko jeden zielony wątek jest blokowany przez błąd strony, ponieważ inne wątki mogą ” podnieś luz ” (inne zielone wątki) wygląda na to … softwareengineering.stackexchange.com/questions/222642/…

Odpowiedz

Przeciętny kod Java nie przyniesie żadnych korzyści. Java to nie Erlang, a programiści Java nie są tak samo nastawieni jak programiści Erlang. Język nigdy nie miał być używany w ten sposób.

Jeśli chcesz mieć naprawdę lekki proces – użyj Erlang i utwórz tysiące wątków komunikujących się za pośrednictwem wiadomości. W Javie będziesz mieć kilkanaście wątków współużytkujących wspólną pamięć z muteksami i semaforami. To po prostu inny model programowania, przeznaczony dla innego zestawu problemów.

Komentarze

  • Tak więc, żeby wyjaśnić, jest to przydatne podejście w Erlangu. I ignorując kwestie związane z nastawieniem w Javie, może faktycznie pomóc?
  • @redjamjar, jest mało prawdopodobne aby być użytecznym w Javie, sam język nie nadaje się do takiego zastosowania, a jego główna (i jedyna) zaleta – ogromna liczba gotowych do użycia bibliotek – wygrała ' nie pasuje dobrze w takie obce podejście do programowania.
  • Tak, jeśli chcesz ten model, po prostu użyj Erlanga, będzie to o rząd wielkości łatwiejsze
  • Java! = JVM, po prostu mówiąc 🙂
  • @Bane, te ” zalety ” istnieją tylko wtedy, gdy ' nie mam nic do porównania

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *