Neden Yeşil Konular?


33

Bununla ilgili soruları çoktan öğrendiğim halde (örneğin, https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), tatmin edici bir cevabım varmış gibi hissetmiyorum .

Soru şudur: JVM neden artık yeşil konuları desteklemiyor?

Kod stili Java SSS’inde şöyle yazıyor :

Yeşil iş parçacığı, tüm kodun tek bir işletim sistemi iş parçacığında yürütüldüğü Java Sanal Makinesi (JVM) için bir çalışma modunu ifade eder.

Ve java.sun.com sitesinde bu :

Dezavantajı, yeşil iş parçacıkları kullanmanın Linux'taki sistem iş parçacıklarından yararlanılmadığı ve bu nedenle ek sanal makineler eklendiğinde Java sanal makinesinin ölçeklenemeyeceği anlamına gelir.

Bana göre JVM, çekirdek sayısına eşit bir sistem işlem havuzuna sahip olabilir ve ardından bunun üzerine yeşil ipler koyabilir. Sık sık engelleyen çok sayıda dişe sahip olduğunuzda bu büyük avantajlar sağlayabilir (çoğunlukla mevcut JVM'nin başlık sayısı nedeniyle).

Düşünceler?


5
Bana göre soru şöyle görünüyor: Neden yeşil iplikler? Birden çok işlemle çoklu okuyucuyu JVM düzeyinde taklit ederek neden yeniden tanıtıyorsunuz? Programcıların yumurtlama ipliklerine karşı daha cömert olmalarına izin vermekten başka bir kazanç görünmüyor olması çok fazla acı ve ek yük (ve bunun bir avantaj olduğuna ikna olmadım).

4
Eh, ölçeklendiren eş zamanlı bir programlama modeline sahip olmakla ilgili. Şu anda Java'da ölçeklenebilirlik istiyorsanız, kendi iş parçacığı havuzunuzla NIO'ya geçersiniz. En azından benim anlayışım bu.
redjamjar

3
Hafif iplikleri destekleyen < akka.io > gibi şeylerin varlığı da bir ihtiyaç olduğunu düşünmemi sağlıyor. Aslında, burada çok iyi bir tartışma buldum < stackoverflow.com/questions/7458782/… >
redjamjar

2
@delnan Çünkü yerel iş parçacığı maliyetleri için bağlam anahtarı. Yeşil iş parçacıkları bağlam geçişi ve işlemler arası senkronizasyon için daha az ek yüke sahiptir. Ek olarak, yeşil ipliklerin miktarı pratik olarak sınırsızdır (VM işlemi için çok fazla stres olmadan yüz binlerce olabilir), yerel ipliklerin sayısı ise işletim sistemi ve bellek yükü ile sınırlıdır.
permeakra,

JVM'nin yerel iş parçacıklarını doğrudan desteklemesi uzun zaman aldı. Yeşil ipler o zamana kadar ara solüsyondu.
Thorbjørn Ravn Andersen

Yanıtlar:


29

JVM'nin yeşil iplikleri bıraktığını ve yerel dişlere geçtiğini hatırlıyorum. Bu iki basit nedenden dolayı oldu: yeşil iplikler açıkçası çöptü ve çok çekirdekli işlemcileri Sun'taki sınırlı geliştirici çabasıyla desteklemeye ihtiyaç vardı.

Bu utanç verici bir şeydi - yeşil iplikler, eşzamanlılığın tökezleyen bir blok değil faydalı bir araç olmasını sağlayan çok daha iyi bir soyutlama sağlıyordu. Ancak birkaç engelin üstesinden gelinemediğinde yeşil dişler kullanılamaz:

  • onlar için mevcut olan tüm işlemci çekirdeğini kullanmalı

  • bağlam anahtarlama ucuz olmalı

  • I / O herhangi bir iş parçacığı içinde yapan engelleyebilirsiniz ancak olabilir değil kesinlikle başka iplik ve bazı erken uygulamalarda olduğu tüm diğer ipler.

Java'da çoklu iş parçacılığının neden bu kadar zor olduğunu merak ettim ama şimdi daha da belirginleşiyor - sonuçta yerel konulara geçiş yapmakla ilgiliydi:

  • Tüm işlemci çekirdeği kullanarak iyi

  • eşzamanlı olma konusunda iyi, bağımsız G / Ç vb. sağlama

  • bağlam anahtarlamada yavaş (en iyi yeşil iplik uygulamalarıyla karşılaştırıldığında)

  • hafıza ile korkunç açgözlü, bu nedenle maksimum kullanılabilir sayısını sınırlamak

  • Elbette yüksek derecede eşzamanlı olan gerçek dünyayı ifade etmek için herhangi bir temel için zayıf bir soyutlama.

Günümüzde, pek çok programcı zamanı, bloke edici olmayan G / Ç, vadeli işlemler vb. Gibi kodlamalar yapıyor.

Karşılaştırma için, Erlang'ın yanı sıra yeni Go dili de çok büyük eşzamanlılık yapıyor. Hepsinin torunu , halen devam etmekte olan bir araştırma projesi olan Occam olarak kaldı .


Gönderdiğiniz zamandan beri ne kadar uzağa gittik: O
Dmitry

3
Ne yazık ki, Rust, daha iyi eşzamanlılık soyutlamaları bırakan başka bir dildir. Onlar da kooperatif ipliklerden doğal ipliklere geçmeye karar verdiler.
Rick-777

2
@ Rick-777 Rust bunu yapmak için çok düşük seviyede.
Malcolm

15

Birden fazla iş parçacığını taklit eden tek bir işlemin birçok sorunu var. Bunlardan biri, sahte numaraların tüm sayfa hatalarında durmasıdır.

Önerdiğiniz alternatif, bir işlem havuzu, bazı avantajlara ve bazı dezavantajlara sahiptir. En büyük avantaj, 'dişlilerin' izolasyonu, sizi burada fazla alamazdı. Büyük dezavantaj, uygulamanın aşırı zorluğu ve daha az verimli senkronizasyon, buradaki anlaşma katildir.

Bununla birlikte, bir iş parçacığı havuzu (ancak daha fazla yalıtımlı) gibi kullanabileceğiniz bir işlem havuzunun olması harika bir şey olduğu bazı uygulamalar (Java değil) bulunduğunu kabul ediyorum. Konular hemen hemen her şeyi paylaşıyor. İşlemlerle, neyi paylaşacağınızı özellikle seçebilirsiniz. Bildiğim kadarıyla, kimse henüz bunu uygulama çabasına gitmedi.


Occam bunu teklif ettiğini iddia ediyor. 80'lerde önemli bir dildi, ancak kalkınma fonu yetersizliğinden sıkıntı çekti ve sonuç olarak sadece bir araştırma alanı haline geldi. Ancak eşzamanlılık konusundaki fikirleri, şimdi olduğu kadar sağlam ve henüz geliştirilmemiştir.
Rick-777,

"Çok iş parçacıklı" bir la golang ("M: N" tipi programlama) ise, teorik olarak sadece bir yeşil iş parçacığı bir sayfa hatasıyla engellenir, çünkü diğer dişliler "boşluğu kaldırır" (diğer yeşil dişler) görünebilir. .. softwareengineering.stackexchange.com/questions/222642/…
rogerdpack

13

Ortalama bir Java kodu için hiçbir fayda sağlanmaz. Java Erlang değildir ve Java programcıları Erlang programcılarıyla aynı zihniyette değildir. Dil hiçbir zaman bu şekilde kullanılmaya yönelik değildi.

Gerçek hafif işlemeyi istiyorsanız - Erlang'ı kullanın ve mesajlarla iletişim kuran binlerce iş parçacığı oluşturun. Java'da, mutekslerle ve semaforlarla ortak bir hafıza paylaşan bir düzine iş parçacığınız olacak. Farklı bir problemler için tasarlanan sadece farklı bir programlama modelidir.


Yani, netleştirmek için Erlang'da yararlı bir yaklaşımdır. Ve, Java zihniyetinin sorunlarını göz ardı etmek, gerçekten yardımcı olabilir mi?
redjamjar

1
@redjamjar, Java'da yararlı olması pek mümkün değil, dilin kendisi böyle bir kullanım için pek uygun değil ve ana (ve sadece) avantajı - kullanıma hazır kütüphanelerin geniş gövdesi - böyle bir yabancıya sığmayacak programlama yaklaşımı.
SK-mantığı

Evet, eğer bu modeli istiyorsan, sadece Erlang'ı kullan, daha büyük bir emir olacak
Zachary K

1
Java! = JVM, sadece diyerek :)
Kamil Tomšík

1
@Bane, bu "avantajlar" yalnızca karşılaştıracak bir şeyiniz yoksa ortaya çıkar
SK-mantık
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.