Eşzamanlı programlamayı neden bilmeliyim?


17

Eşzamanlı programlama benim için oldukça zor: temel bir slayta bakmak bile bana zor geliyor. Çok soyut görünüyor.

Eşzamanlı programlama kavramlarını iyi bilmenin faydaları nelerdir? Düzenli, sıralı programlamada bana yardımcı olacak mı? Programlarımızın nasıl çalıştığını anlamak için bir memnuniyet olduğunu biliyorum, ama başka ne var?


3
Bence biraz kapalı, ancak tüm kişisel şeyleri düzenlerseniz (eşzamanlı programlama herkes için oldukça zor olsa da ) ve kavramların somut teknik değerlerini sorarsanız biraz topicky alabilir .
yannis

1
Faydaları oldukça açık olmalıdır. Eşzamanlı programlamanın sunduğu iş bölümü sayesinde mevcut tüm performans geliştirmelerinden yararlanabilecek programlar yazabilirsiniz. Kimse için kolay değil. Bugün çok zor bir kavram.
Rig

3
Bir şey öğrenmek için motivasyon kazanmanıza yardımcı olamayız, ancak eşzamanlılık hakkında neden bilmesi gereken genel soru yeterince konudur.

2
Eşzamanlı programlamayı biliyorum. Verdiğiniz slaydın anlamaya yardımcı olmadığını söyleyebilirim. Bunun yerine, yemek filozoflarının olduğu bir partiye gidin .
mouviciel

1
Rahatlayın, en büyüğü bile zor görünüyor: informit.com/articles/article.aspx?p=1193856
SK-logic

Yanıtlar:


32

İşte hızlı ve kolay bir motivasyon: En küçük, en zayıf sistemlerden başka bir şey kodlamak istiyorsanız , eşzamanlı kod yazacaksınız.

Bulut için yazmak ister misiniz? Buluttaki hesaplama örnekleri küçüktür. Büyük olanları alamazsınız, birçok küçük olanları alırsınız. Aniden küçük web uygulaması eşzamanlı bir uygulama. İyi tasarladıysanız, müşteri kazandıkça daha fazla sunucuya atabilirsiniz. Yoksa, örneğinizin yük ortalaması sabitlenmişken nasıl olduğunu öğrenmek zorundasınız.

Tamam, masaüstü uygulamaları yazmak ister misiniz? Her şeyin çift veya daha fazla çekirdekli bir CPU'su vardır. En ucuz makineler hariç. Ve en ucuz makinelere sahip insanlar muhtemelen pahalı yazılımlarınız için çatallanmayacaklar, değil mi?

Belki mobil geliştirme yapmak istersiniz? Hey, iPhone 4S'de çift çekirdekli bir CPU var. Gerisi çok geride kalmayacak.

Video oyunları? Xbox 360 çok işlemcili bir sistemdir ve Sony'nin PS3 modeli aslında çok çekirdekli bir sistemdir.

Küçük, basit problemler üzerinde çalışmadığınız sürece, eşzamanlı programlamadan kurtulamazsınız.

2016 güncellemesi : 35 $ 'lık Raspberry Pi'nin mevcut tekrarı, cep telefonları için tasarlanmış bir çip üzerinde dört çekirdekli bir sistem üzerine inşa edilmiştir. Yapay zekadaki dramatik ilerlemeler kısmen paralel hesaplama motorları olarak ileri teknoloji ekran kartlarının bulunması nedeniyle sağlanmıştır.


1
Prensipte hemfikir olsam da, Everything has a dual-or-more-core-CPU. Except the least expensive machines.bunun biraz mantıksız göründüğünü söylemek . Birçok insanın tek çekirdekli makineleri var, ucuz olduğu için değil, sahip oldukları şeylerden memnun oldukları ve yükseltmeye gerek duymadıkları için. Yani her yerde çaba boşa değildir bu yüzden (ki, ya önleyici multitasking varsayabiliriz yanı tek çekirdekli sistem üzerinde zamanlayıcı yardımcı olacaktır eşzamanlılık açısından düşünerek söyleyen olduğunu , çoğu geliştirici temas edecek her çoklu görev çevre hakkında bugünlerde).
CVn

1
tamam - bu biraz abartı, ancak yeni donanım ezici bir şekilde çok çekirdekli olma eğilimindedir. Uzaklaştığını görmüyorum. Bu nedenle, bugün gelecekte profesyonel olarak yapacağınız işi düşünen bir öğrenciyseniz, çok çekirdekli sistemler üzerinde çalışacağınızı varsaymak güvenlidir.
ObscureRobot

Benim lol ile katılmıyorum kadar cevap ile katılmıyorum merak ediyorum;)

1
Okuduğum gibi, ikimizin de söylediklerine benzer bir çekirdek var, @ acidzombie24. Bir geliştiricinin eşzamanlılık ile nasıl başa çıkacağını bilmesi gerektiğini söylüyorum çünkü her yerde olacak. Eşzamanlı programlamada iyi olmanız gerekmediğini söylüyorsunuz ... eşzamanlı sistemlerin tuzaklarından kaçının :)
ObscureRobot

Eşzamanlılık hakkında bilgi sahibi olmanın çok yararlı olduğunu kabul ediyorum, ancak ondan sadece "küçük, basit problemler" için kurtulabileceğinize katılmıyorum. Önemsiz sistemlerde bile, örneğin mevcut çerçevelere ve uygulama sunucularına güveniyorsanız, eşzamanlılıktan büyük ölçüde kurtulabilirsiniz. Altyapı kurulduktan sonra, bir web uygulaması için yeni hizmetler yazan genç bir geliştirici olabilirim ve eşzamanlılık veya paralellik hakkında neredeyse hiçbir şey bilmiyorum.
Andres F.

21

1970'den 2002'ye kadar işlemciler yaklaşık 18 ayda bir iki katına çıktı. Yani bir programcı olarak tek yapmanız gereken beklemekti ve programınız daha hızlı gidecekti. Sorun 2002 civarında kuralların değişmesidir. Şimdi daha büyük hızlı işlemciler yapmıyorlar, daha küçük daha yavaş işlemciler yapıyorlar, ancak bunları gruplara ayırıyorlar. Üzerinde çalıştığım bilgisayarın 4 çekirdeği var ve 8 çekirdeğe kadar çekirdek (ve çekirdek başına 4 iş parçacığı) var. Yakında çok daha fazla çekirdekli cipsimiz olacak.

Dolayısıyla, eşzamanlı olmayan bir program yazarsanız, 1 çekirdek veya iplik kullandığınızı göreceksiniz, ancak CPU'nun geri kalanı hiçbir şey yapmadan orada oturuyor. Yani 16 çekirdeğiniz varsa 1 programınızı çalıştırıyor ve diğer 15 tanesi orada oturuyor!

Eşzamanlılık sorunu, deterministik olmamasıdır. Bu, farklı iş parçacıklarının hangi sırayla bir şeyler yapacağını tam olarak bilmediğiniz anlamına gelir. Geleneksel olarak programcılar bunu kilitleri ve benzerlerini kullanarak çözmeye çalışmıştır. Bu yol açmıştır LOT ağrı. Birden fazla iş parçacığının serbestçe erişebildiği bir tür değişebilir duruma sahip olmak, genellikle ağrı ve heisnebugs için bir formüldür!

Geç eğilim, değişebilir durumu sıkı bir şekilde kontrol eden fonksiyonel dillere geçmektir. İşlevsel dillerin eşzamanlılığı ele almasının iki temel yolu vardır. Birincisi mesaj iletimi kullanmaktır. Bu en iyi Erlang tarafından gösterilir. Erlang'da genellikle süreçler arasında Paylaşılan durum yoktur. Hafızayı değil, geçen mesajlarımı paylaşarak iletişim kurarlar. Şu anda yaptığımız için bu sizin için anlamlı olmalıdır. Bu bilgiyi size bir mesaj göndererek gönderiyorum, beynimden hatırlayarak değil! Kilitleme hatalarının çoğunu geçen mesaja geçerek kolayca uzaklaşın. Ayrıca, mesajlar ağ üzerinden ve bir düğüm içinde iletilebilir.

Diğer yöntem, Yazılım Transkripsiyonel Belleği anlamına gelen STM'dir, Bu clojure ve Haskell'de (ve diğerlerinde) bulunur. STM'de bellek paylaşılır ancak değişiklikler yalnızca bir işlemle yapılabilir. Veritabanı milletvekilleri 1970'lerde tüm bunları anladım gibi biz doğru olsun sağlamak oldukça kolaydır.

Aslında biraz fazla basitleştirdim, Clojure ve Haskell her ikisi de mesaj geçişi yapabilir ve Erlang STM yapabilir.

Feragatname Erlang ile Programming Web Services'in yazarı , önümüzdeki birkaç hafta içinde erken sürümde çıkacak.


1
@Zachary K: hesaplama dilini yoğun olarak ana dilde uygulamak için işlevsel dilleri ana dillerle harmanlayan yaklaşımlar var mı, ancak işlevsel dilde yazılmış bir sunucu tarafından tüketilebilecek arayüzler sağlıyorlar mı?
rwong

% 100 emin değilim, ama hem Clojure hem de Scala JVM'de var, bu yüzden başlayacağım yer burası. Belki de Akka çerçevesine bir göz atın. Kullanmadım ama bir süre önce Akka hakkında bir konuşma dinledim ve oldukça havalı görünebilir. Şimdilik zamanımın çoğunu alan Erlang ve Javascript yapıyorum!
Zachary K

1
@rwong: .NET, programcıların uygulamalarının bazı bölümleri için C # veya diğer işlevsel olmayan dilleri ve diğerleri için işlevsel bir dil olan F #'ı kullanmasına izin verir.
Kevin

5

Çünkü en azından beklediğinizde eşzamanlılık yüzünüzde patlayabilir ...


4
+10000000000000000000000000000000000000000

8
Eşzamanlılık yeni İspanyol Engizisyonu [/ python] [olduğu gibi: kimse beklemiyor ...]
ObscureRobot

1
@ObscureRobot iki kat komik! (açıklama gerekli değildi :-p)
fortran

4

Eşzamanlı programlamanın ilk kuralı "Zor" dur. Eşzamanlı programlamanın ikinci kuralı "Bu. Zor." .. !!

Ciddi olarak, eşzamanlı programlama, çoklu iş parçacığı ve çoklu işleme için iki ortak yaklaşım vardır. Çoklu işlem, anlaşılması en kolay olanıdır, çünkü bir görevi yerine getirmek için bir işlemin birden çok örneğini çalıştırmak anlamına gelir. Fork / join çağrıları ile Unix tabanlı sistemlerde yapmak oldukça kolaydır, ancak Windows sistemlerinde o kadar kolay değildir.

Çoklu iş parçacığı muhtemelen çoğu zaman eşzamanlılık hakkında konuşurken düşünen yaklaşımdır. Bir uygulamada birden çok iş parçacığı başlatmak zor değildir, ancak şeytan ayrıntıda gizlidir. Kilitlenme veya geçersiz durumdaki verilere yol açabilecek evre (genellikle kilitleri kullanarak) arasındaki veri paylaşımını koordine etmeniz gerekir. Ayrıca semaforlar, koşullu değişkenler vb. Kavramları kullanarak evre arasında nasıl iletişim kuracağınızı anlamanız gerekir.

Tüm bunların avantajı, onu anladıktan sonra alttaki donanımı daha etkili bir şekilde kullanabilmenizdir. Günümüzde bir işlemcinin birden fazla çekirdeğe sahip olması normdur. Eşzamanlı programlamayı kullanarak bu çekirdeklerin sizin için çalışmasını sağlayabilirsiniz ve uygulamanız hız artışı sağlayacaktır.

Dezavantajı, uygulamanızı farklı iş parçacıklarında çalıştırılabilecek küçük parçalara nasıl ayıracağınızı düşünmeye başlamanızdır. Bu göründüğünden çok daha zor. Ayrıca, yürütme sırası daha az belirleyici olduğundan, yüksek eşzamanlı çözümler birim test için garip olabilir.

Günümüzde çoğu dil, hayatı biraz daha kolaylaştırmak için çoğu eşzamanlı ilkelden soyutlama ile gelir. Örneğin, .NET 4, hayatı biraz daha kolaylaştıran Görev Paralel Kütüphanesi ile birlikte gelir . Java ülkesinde Concurrency paketi var.


1
Kilitlerden mümkün olduğunca hızlı kaçarsanız büyüklük emirleri alır. STM veya aktörler kullanın ve söylediklerinizin hepsi gider. Tabii ki bu Java'dan Scala, Erlang veya Clojure gibi dillere geçmek anlamına geliyor. (bunun da iyi bir şey olduğunu iddia etsem de)
Zachary K

@Zachary: Bu iyi bir şey olabilir, ancak bir .NET mağazasında çalışıyorsanız, bu pratik değildir. STM gelecekte bir seçenek olabilir, ancak şu anda ana dilde bir seçenek değildir.
Sean

Clojure .net üzerinde çalışır ve F # vardır. Ayrıca C # için STM uygulamaları olduğunu iddia ediyorum.
Zachary K

3

Son zamanlarda çok işlemciliğin beni kurtardığı çok ilginç bir görevim vardı. Temelde birkaç ayrı sunucuya çok fazla istek yapmak zorunda kaldım, çok az miktarda veriyle uğraştım, ancak birçok istek.

PHP ile çalışarak, eski moda şekilde işler yaptım ve birkaç saatlik çalışmadan sonra elde ettiğim en iyi zaman , belirli bir testin çalıştırılması için ~ 120 saniye oldu (birçok istek + ağ gecikmesi + zaman uyumsuz)

Ama bu, ihtiyacım olana kıyasla neredeyse yeterli değildi ve PHP'lerin çoklu işlemiyle sefil bir şekilde başarısız olduktan sonra Python'a geçtim.

Birkaç saat sonra, 20 saniyede çalışan bir Python çok işlemcili betiğim vardı ve zaman aşımları ile uğraştıktan sonra ve hayır. Kullanılacak ipliklerin sayısı ~ 10 saniyeye düştü .

Bu, 100 satırlık tek bir Python betiği dışında PHP'de% 100 yazılmış bir web sitesi içindi. Ve her şey mükemmel çalışıyor.

Sonuç olarak, günlük olarak size yardımcı olmasa bile, en azından eşzamanlı programlamanın temellerini bilmenin size büyük ölçüde yardımcı olacağı durumlarla karşılaşabilirsiniz.

İyi şanslar ve mutlu kodlama!

PS: Ben PHP bash çalışmıyorum, ama PHP sadece eldeki iş için doğru araç değildi.

PS2: Yeni bir teknoloji ya da yeni bir şeyler yapmanın bilinmesi, yepyeni bir olasılıklar dünyasına kapı açabilir.


2

Herhangi bir web geliştirme yaparsanız, en azından çoğu dilde eşzamanlılık devreye girer. Örneğin, web geliştirme için bahar kullanıyorum ve her yeni istek kendi iş parçacığı olarak geliyor. Bu nedenle, herhangi bir istek, durumun bir değişkeni değiştirebileceği paylaşılan bir nesneye erişirse, eşzamanlılık çok büyük bir faktördür ve dikkate alınması gerekir. Değilse, veriler öngörülemeyen şekillerde düzenlenebilir ve veri bozulması oluşabilir. Eşzamanlılık hakkında her son ayrıntıyı bilmek kritik değildir, ancak bir seferde parça öğrenmek, web uygulaması programlamasını daha iyi anlamak için önemlidir, masaüstü uygulamalarında çalışıyorsanız, belki de birden fazla iş parçacığı çalıştırmanız gerekmedikçe çok önemli değildir.


-1

İşletim sistemleri hakkında bilgi edinin. Zamanlayıcıların ve aygıt sürücülerinin kaynak kodunun okunması yardımcı olacaktır; kesinlikle eşzamanlıdırlar.


2
Programcılar için eşzamanlılık genellikle birden çok durumda çalışan kendi programlarınız için geçerlidir .

OS çekirdeğinin programlama algoritmasının ayrıntılarını bilmeden kendi eş zamanlı programınızı yazamayacağınızı vurgulamaya çalıştım.
jj1bdx

Neden olmasın? Kilit mekanizmalarını doğru kullanırsanız, OS zamanlama algoritması önemsizdir.
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.