Go-langs goroutine havuzları sadece yeşil dişler midir?


47

Buradaki yorumcu , aşağıdaki yeşil konuların eleştirisini sunmaktadır:

Başlangıçta N: M modelinde, geri çağırma cehennemi olmadan olaya dayalı programlamanın bir aracı olarak satıldım. Acı eski prosedür koduna benzeyen bir kod yazabilirsiniz ancak altında, ne zaman bir şey bloke ederse kullanıcı görevini kullanan sihir vardır. Kulağa harika geliyor. Sorun, karmaşıklığı daha fazla karmaşıklıkla çözmemizdir. swapcontext () ve aile oldukça güçsüzdür, karmaşıklık diğer istenmeyen yerlerden geliyor.

Birdenbire, bir kullanıcı alanı zamanlayıcısı yazmak zorunda kalıyorsunuz ve Linux'un insanlara yönelik çabaları olan programlarının daha iyi bir iş yapacak bir zamanlayıcı yazmanın gerçekten zor olduğunu tahmin ediyorsunuz. Şimdi, programınızın man N yeşil dişlerini M fiziksel dişlerine çevirmesini istersiniz, böylece senkronizasyon konusunda endişelenmeniz gerekir. Senkronizasyon performans problemleri doğurur, böylece şimdi yeni bir kilitli tavşan deliğinden aşağıtasınız demektir. Doğru yüksek eşzamanlı zamanlayıcı oluşturmak kolay bir iş değildir.

Başka bir eleştiri burada :

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.

Sorum şu - edilmektedir go-Lang'ın goroutines (varsayılan havuzu için) sadece yeşil ipler? Eğer öyleyse - yukarıdaki eleştirileri ele alıyorlar mı?

Yanıtlar:


67

Ben sadece sıradan bir Go kullanıcısıyım, bu yüzden aşağıdakileri bir tane tuzla atın.

Wikipedia yeşil konuları "doğal olarak temel işletim sistemi yerine sanal bir makine (VM) tarafından planlanan konular" olarak tanımlar . Yeşil iş parçacıkları, yerel işletim sistemi özelliklerine güvenmeden çok iş parçacıklı ortamlara öykünür ve yerel iş parçacığı desteği olmayan ortamlarda çalışmalarını sağlamak için çekirdek alanı yerine kullanıcı alanında yönetilir.

Go (ya da tam olarak iki uygulama), yalnızca yerel kod üreten bir dildir - VM kullanmaz. Ayrıca, geçerli çalışma zamanı uygulamalarındaki zamanlayıcı, işletim sistemi düzeyinde iş parçacıklarına dayanır (GOMAXPROCS = 1 olduğunda bile). Bu yüzden Go modeli için yeşil ipliklerden bahsetmek biraz küfürbaz.

Go insanlar özellikle diğer eşzamanlılık mekanizmalarıyla (koroinler veya iplikler veya hafif işlemler gibi) kafa karışıklıklarını önlemek için goroutin terimini kullandılar.

Elbette, Go bir M: N diş açma modelini destekliyor, ancak Erlang işlem modeline, Java yeşil diş modelinden çok daha yakın görünüyor.

Go modelinin yeşil dişler üzerindeki bir kaç avantajı (JVM'nin başındaki gibi):

  • Geliştirici için saydam bir şekilde birden fazla çekirdek veya CPU etkin bir şekilde kullanılabilir. Go ile, geliştirici eşzamanlılık ile ilgilenmelidir. Go çalışma zamanı paralelliği önemser. Java yeşil iş parçacığı uygulamaları, birden çok çekirdek veya CPU'yu ölçeklemedi.

  • Sistem ve C çağrıları zamanlayıcı için engelleyici değildir (tüm sistem çağrıları, yalnızca olay döngülerinde çoğullamalı I / O'ları destekleyenler değil). Yeşil iplik uygulamaları bir engelleme sistemi çağrısı yapıldığında tüm süreci engelleyebilir.

  • Kopyalama veya bölümlenmiş yığınlar. Go'da, goroutine için maksimum yığın büyüklüğü sağlamaya gerek yoktur. Yığın, gerektiği kadar artan şekilde büyür. Bunun bir sonucu olarak, bir gorotin çok fazla hafıza gerektirmez (4KB-8KB), bu yüzden çok sayıda mutlu bir şekilde ortaya çıkarılabilir. Goroutin kullanımı bu nedenle yaygın olabilir.

Şimdi, eleştirilere değinmek için:

  • Go ile bir kullanıcı alanı zamanlayıcısı yazmak zorunda değilsiniz: çalışma zamanı zaten sağlanmış durumda. Bu karmaşık bir yazılım parçasıdır, ancak Go kullanıcılarının değil Go geliştiricilerin problemidir. Go kullanıcıları için kullanımı şeffaftır. Go geliştiricileri arasında Dmitri Vyukov , kilitsiz / beklemesiz programlama konusunda uzmandır ve özellikle zamanlayıcının nihai performans sorunlarını ele almakla ilgilenmektedir. Geçerli zamanlayıcı uygulaması mükemmel değil, ancak geliştirecek.

  • Senkronizasyon performans problemi ve karmaşıklık getiriyor: bu Go ile de kısmen doğrudur. Ancak Go modelinin, senkronizasyon karmaşıklığını sınırlamak için kanalların kullanımını ve programın eşzamanlı goroinlerdeki temiz bir şekilde ayrıştırılmasını sağlamaya çalıştığını unutmayın (örn. İletişim kurmak için belleği paylaşmak yerine, iletişim kurarak verileri paylaşın). Bu arada, referans Go uygulaması, bir profiler ve yarış dedektörü gibi performans ve eşzamanlılık sorunlarını ele almak için çeşitli araçlar sunar .

  • Sayfa arızası ve "numaralandırma faktörü" ile ilgili olarak Go'nun, birden fazla sistem parçacığı üzerinde goroutine zamanlama yapabileceğini unutmayın. Bir iş parçacığı herhangi bir sebepten dolayı bloke edildiğinde (sayfa hatası, sistem çağrılarının engellenmesi), diğer iş parçacıklarının diğer iş programlarını programlamaya ve çalıştırmaya devam etmesini engellemez. Şimdi, bir sayfa hatasının OS iş parçacığını engelleyeceği, bu iş parçacığında programlanmış olması gereken tüm goroutinlerle doğru olacağı doğrudur. Ancak pratikte, Go yığın hafızasının değiştirilmemesi gerekiyordu. Bu Java ile aynı olurdu: çöp toplanan diller zaten çok iyi bir şekilde sanal belleği barındırmıyor. Programınız sayfa arızasını zarif bir şekilde ele almalıysa, büyük olasılıkla bazı açık bellek yönetmesi gerektiğinden dolayı. Bu durumda,

Yani IMO, goroutinler yeşil iplikler değildir ve Go dili ve mevcut uygulama çoğunlukla bu eleştirileri ele almaktadır.


1
Soruya mükemmel ve ayrıntılı bir cevap :)
Tuxdude 23:15

1
Bu cevabı seviyorum, ancak işletim sistemi konularının nasıl / ne zaman oluşturulduğuna dair herhangi bir referansınız var mı?
Lars,

1
Go Language'in en büyük dezavantajlarından biri, her engelleme sistemi çağrısı için bir Çekirdek ipliği yaratması!
user1870400,

8
Wikipedia'daki “yeşil iş parçacığı” makalesinin “ çalışma zamanı kitaplığı veya sanal makine (VM) tarafından zamanlanan iş parçacıkları” olarak değiştirildiğini unutmayın ; Bu, çalışma zamanı çizelgeleme / yönetimi yaptığından, bu tanımlamanızın yanıtınızın artık doğru olmayacağı anlamına gelir. Yeşil iş parçacıklarını, işletim sistemi iş parçacıklarının zıt olduğu kullanıcı alanı iş parçacıkları olarak tanımlamanın daha yararlı olduğunu düşünüyorum. Ve sonra, evet, goroutinler elbette yeşil iplikler.
mknecht

1
2. şu @mknecht. VM ile ilgili değil, çalışma zamanı ile ilgili. Ve Go kesinlikle bir çalışma zamanına sahip. (diş açma modelini ve çöp toplama işlemini yönetir).
Tim Harper,
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.