Paralel ve Eşzamanlı programlama arasındaki fark?


44

Eşzamanlı programlamaya bakıldığında, iki terim sıklıkla kullanılır, yani eşzamanlı ve paralel.

Bazı programlama dilleri, özellikle Java gibi paralel programlama için destek talep eder .

Bu paralel ve eşzamanlı programlamanın aslında farklı olduğu anlamına mı geliyor?


10
Evet, eşzamanlı ve paralel programlama farklı. örneğin, bağlam geçişi yoluyla aynı çekirdekte aynı anda çalışan iki iş parçacığına (veya işlemine) sahip olabilirsiniz. İki iş parçacığı (veya işlem) iki farklı çekirdeğe (veya işlemciye) uygulandığında, paralelliğe sahip olursunuz. Öyleyse, eski durumda (eşzamanlılık) paralellik sadece "sanal" dır, ikincisinde gerçek paralellik var. Bu nedenle, her paralel program eşzamanlıdır, ancak sohbet mutlaka doğru değildir.
Massimo Cafaro

1
Burada dikkatli ol. Aynı sonucu ya dil desteği (yani yeni bir yapıya sahip bir dili genişletme) ya da düşük seviyeli bir yaklaşım kullanarak (örneğin, MPI ve OpenMP'de olduğu gibi bir kütüphane kullanarak) elde edebilirsiniz. Yine de, mevcut çok çekirdekli işlemciler ve SMP destekli işletim sistemlerinde, eski tek çekirdekli işlemcilerde çalıştırılırken eşzamanlı olacak olan program, işletim sistemi programın farklı çekirdeklerde çalıştırılmasının işleyişini zamanlarsa paralel olarak çalıştırılabilir. Dolayısıyla, ayrım bugünlerde biraz "bulanık".
Massimo Cafaro

3
Işık gecikme sabiti hızı için ne kullanıyorsunuz? Eşzamanlılık olarak, ışık gecikme hızının bir saat döngüsü olduğunu farzedin. Paralel olarak bir sunucunun yan tarafta olduğunu, dağıtılmış durumda bir sunucunun Mars'ta olduğunu varsayarsınız.


1
Robert Harper, konuyu, kontrol etmek isteyebileceğiniz "Paralelcilik eşzamanlılık değil" ve "Paralellik ve Eşzamanlılık, Yeniden Düzenlendi" şeklinde iki blog yazısında tartışıyor .
Basil

Yanıtlar:


26

Paralelliği (birim zaman başına daha fazla iş yapmak için fazladan hesaplama birimleri kullanarak) eşzamanlılıktan (paylaşılan kaynaklara erişimi yönetme) ayırın. İlk önce paralellik öğretin çünkü daha kolay ve sıra dışı bir zihniyet oluşturmaya yardımcı olur.

Dan Grossman'ın "Sophomoric" Paylaşımlı Bellek Paralelliği ve Eşzamanlılığına Giriş "den Dan Grossman (16 Kasım 2013)


21

Nish'in cevabına ek olarak, Simon Marlow'un Haskell'deki Paralel ve Eşzamanlı Programlama kitabını veya kısa öğreticisini önereyim . İlk sorunuzu Hask'ın perspektifinden yanıtlıyorlar, bu nedenle teorik olarak eğimli okuyucular için daha uygun olabilirler (Haskell, Matematiğe diğer dillerden çok daha yakın olan tamamen işlevsel, tembel bir programlama dilidir).

Oradan alıntı yapmak:

Birçok alanda, paralel ve eşzamanlı kelimeler eşanlamlıdır; öyle değil programlama, temelde farklı kavramları tanımlamak için kullanılırlar.

Paralel bir program, hesaplama işlemlerini daha hızlı yapmak için çok sayıda hesaplama donanımı (örn. Çoklu işlemci çekirdeği) kullanan programdır. Hesaplamanın farklı bölümleri, aynı anda (paralel olarak) çalışan farklı işlemcilere verilir; böylece sonuçlar, sırayla gerçekleştirilenden daha erken elde edilebilir.

Buna karşılık, eşzamanlılık, birden fazla denetim dizisinin olduğu bir program yapılandırma tekniğidir. Nosyonel olarak kontrol iplikleri "aynı anda" yürütülür; yani kullanıcı efektlerini araya eklenmiş olarak görür. Aslında aynı anda mı çalıştıkları ya da uygulanmadıkları bir uygulama detayıdır; eşzamanlı bir program, tek bir işlemcide bir araya getirilmiş yürütme yoluyla veya birden çok fiziksel işlemcide gerçekleştirilebilir.

Geri kalanı öğretici kitabında okumanızı tavsiye ederim (s.4), fakat verimlilik, modülerlik ve determinizm gibi programların nicel ve nitel özellikleriyle bağlantılı olan programlama paradigmalarını birbirine bağladığı için bu bölümün geri kalanından bazılarını alıntılayayım.

Paralel programlama sadece verimlilik ile ilgili olsa da, eşzamanlı programlama, birden fazla bağımsız harici aracıyla (örneğin, kullanıcı, bir veritabanı sunucusu ve bazı harici istemciler) etkileşime girmesi gereken bir programın yapılandırılması ile ilgilidir. Eşzamanlılık, bu tür programların modüler olmasına izin verir; kullanıcıyla etkileşime giren iş parçacığı, veritabanıyla konuşan iş parçacığından farklıdır. Eşzamanlılık olmadığında, bu tür programlar olay döngüleri ve geri aramalarla yazılmalıdır - aslında, aslında birçok olayda eşzamanlılık çok pahalı ya da çok zor olduğu için, eşzamanlılık mümkün olduğunda bile olay döngüleri ve geri çağrılar kullanılır. kullanın.

"Kontrol iplikçikleri" kavramı, tamamen işlevsel bir programda anlam ifade etmemektedir, çünkü gözlemlenecek bir etkisi yoktur ve değerlendirme sırası ilgisizdir. Yani eşzamanlılık, etkili kod için bir yapılanma tekniğidir; Haskell'de bu, IO monadındaki kod anlamına gelir.

İlişkili bir ayrım deterministik ve klasik olmayan programlama modelleri arasındadır. Deterministik bir programlama modeli, her programın yalnızca bir sonuç verebileceği bir modeldir; oysa, klasik olmayan bir programlama modeli, uygulamanın bir yönüne bağlı olarak farklı sonuçlara sahip olan programları kabul eder. Eşzamanlı programlama modelleri mutlaka belirleyici değildir, çünkü öngörülemeyen zamanlarda olaylara neden olan harici ajanlarla etkileşime girmeleri gerekir. Nondeterminizm bazı kayda değer dezavantajlara sahiptir: programlar sınanması ve nedenleri ile ilgili önemli ölçüde zorlaşır.

Paralel programlama için mümkünse deterministik programlama modellerini kullanmak istiyoruz. Amaç sadece cevaba daha hızlı bir şekilde ulaşmak olduğundan, programımızı süreçte hata ayıklamayı zorlaştırmayacağız. Deterministik paralel programlama her iki dünyanın da en iyisidir: sıralı programda test etme, hata ayıklama ve mantık yürütme yapılabilir, ancak işlemciler eklendiğinde program daha hızlı çalışır. Aslında, çoğu bilgisayar işlemcisinin kendisi boru hatları ve çoklu uygulama birimleri şeklinde deterministik paralellikler uygulamaktadır.

Eşzamanlılık kullanarak paralel programlama yapmak mümkün olsa da, bu eşzamanlılık fedakarlık determinism çünkü bu genellikle kötü bir seçimdir. Haskell'de paralel programlama modelleri belirleyicidir. Bununla birlikte, deterministik programlama modellerinin her türlü paralel algoritmayı ifade etmek için yeterli olmadığını belirtmek önemlidir; iç kararsızlığa bağlı algoritmalar, özellikle de çözüm alanı aramayı içeren problemler var. Haskell'de, bu algoritma sınıfı sadece eşzamanlılık kullanılarak açıklanabilir.


20

Eşzamanlılık ve paralellik çözdükleri ve sebep oldukları problemlerde farklılık gösterir, ancak bağımsız değillerdir.

eşzamanlılık

İki görevi aynı anda yürütmek, her iki görevin bireysel adımlarının bir araya eklenmiş şekilde yürütülmesi anlamına gelir. Paralelliğe aldırış etmezseniz, herhangi bir zamanda yalnızca bir ifadenin yürütüldüğünü varsayabilirsiniz, ancak bir sonraki adımı hangi görevin yerine getireceğine dair hiçbir garantiniz yoktur.

Bu bazı açılardan kullanışlıdır:

  • Bir programda bağımsız görevlerin daha net programlanması.
  • Hesaplama sırasında IO ile baş etmenize izin verir (örn. GUI'de).
  • Bir seferde birden fazla programın yürütülmesine izin verir (işletim sistemi seviyesinde eşzamanlılık).

Başlıca zorluklardan bazıları:

  • Veri tutarlılığını koruyun.
  • Kilitlenmelerden ve livelockslardan kaçının .
  • Eşzamanlı işlemlerin kesin anlamını belirler.
  • Doğruluğunu sağlayan statik özellikleri belirleyin.

paralellik

İki görevi paralel olarak gerçekleştirmek , ifadelerin aynı anda yürütüldüğü anlamına gelir . Bu özellikle aşağıdakiler için kullanışlıdır:

  • Programları paralel olarak çalıştırarak sistem verimini artırın (örneğin, çok çekirdekli sistemlerde).
  • Tek seferde birden fazla CPU kullanarak bireysel programların çalışma süresini iyileştirin.
  • Birçok makinede IO kullanın (örneğin dağıtık veritabanları).

Anahtar zorluklar:

  • Paralellik kullanabilecek algoritmalar sağlayan ve geliştiren bölümleme problemleri.
  • Hesaplama birimleri arasındaki bağımlılıkları ve iletişimi en aza indirin.
  • Eşzamanlılığın getirdiği tüm problemler: en azından hafıza açısından, paralel programlar hafıza erişiminin serileştirilmesi nedeniyle eşzamanlı olanlara benziyor.
  • En düşük donanım desteği ile uğraşın.

Paralel ve dağıtık bilgisayarları ayırt etmek için ayrıca bu soruya bakın .


4

Belki birazcık idealize olmuş bir cevap ...

  • Eşzamanlılık , bir programın nasıl yazıldığı bir özelliktir . Eğer bir program çatal / birleştirme, kilitler, işlemler, atomik karşılaştırma ve takas işlemleri ve benzeri yapılar kullanılarak yazılırsa, o zaman eşzamanlı olur.

  • Paralelcilik , bir programın nasıl yürütüldüğünün bir özelliğidir . Bir program aynı anda birden fazla hesaplama biriminde yürütülürse, paralel olarak yürütülür.


1

Bu konuda çok fazla cevap var, ancak kafa karıştırıcı olabilir. Bunu bu şekilde düşünmeyi seviyorum ve belki de yardımı olur ::

Eşzamanlı programlama , yürütme sırasına aldırış etmeyen koddur. Java, eşzamanlı programlama için zayıf bir dildir, ancak yardımcı olacak kütüphaneler ve çerçeveler vardır. JavaScript, eşzamanlı programlama için mükemmel bir dildir ve eş zamanlı olmayan bir şey yazmak istediğinizde genellikle zordur(örneğin, yürütme sırasını zorlamak istiyorsanız). Eşzamanlı programlama, olaya dayalı programlama için harikadır (yürütme sırasını, bir düğmeyi tıklattığınızda veya bir kutuya yazdığınızda hareket eden tarayıcınızda çalışan kod gibi) olay dinleyicileri tarafından belirlenir.

Bir örnek, yüz HTTP isteği oluşturmayı içerir. DüğümJS'de en basit çözüm, geri çağırma yöntemiyle 100 isteğin tümünü aynı anda açmaktır ve yanıtlar geri geldiğinde, her seferinde bir yöntem yürütülür. Bu eşzamanlı programlama. Ruby'de, en basit (en yaygın) çözüm, bir istek açmak ve yanıtı işlemek, bir sonraki isteği açmak ve yanıtı işlemek vb. Sunucuyu kırmaktan veya giden bağlantılarınızı en üst düzeye çıkarmaktan kaçınmak için dikkatli olun (yanlışlıkla yapmak kolaydır). Ruby'yi eşzamanlı bir şekilde yazabilirsiniz, ancak çoğu Ruby kodunun yazılma şekli değildir ve bunu yapmak için biraz acı verir.

Paralel programlamaAynı anda birden fazla iş parçacığında veya işleminde çalıştırılabilen koddur. Bu, kodu birden fazla CPU'da çalıştırarak performansı optimize etmenize olanak sağlar (genellikle Akka gibi bir makinede olduğu gibi birden fazla makine dahil). NodeJS çoklu iş parçacığı olmadığından ve paralel yürütme olmadığından, iş parçacığı kodu yazma konusunda endişelenmenize gerek yoktur (ve gördüğüm çoğu JavaScript kodu iş parçacığı güvenliği değildir). Java, dil eşzamanlı programlamayı normal kalıp yapmasa da, paralel programlama oldukça yerleşiktir ve iş parçacığı güvenliği konusunda sık sık endişelenmeniz gerekir. Java’da bir Web Sitesi yazıyorsanız, bu genellikle her isteği aynı bellekte ayrı bir iş parçacığında çalıştıran bir kapta çalıştırılır,


Yukarıdakilerden bazıları bahsettiğiniz kapsam ve sınırlara bağlıdır. Web sitelerinde çalışıyorum. Gördüğüm çoğu Java kodu eşzamanlı programlama değil. Tabii, yeterince yakınlaştırırsanız, müşterinin istediği siparişin gelme sırası önemli değildir, ancak bundan daha fazla yakınlaştırırsanız, işlerin gerçekleştirilme sırası kod tarafından belirlenir. Ancak kod, isteklerin iş parçacığı için güvenli olması gereken çok sayıda paylaşılan nesneye paralel olarak yürütülebilmesi için yazılmıştır.

Bu arada, gördüğüm çoğu JavaScript kodu eşzamanlı: yürütme sırasının birçok düzeyde önemsiz olduğu şekilde yazılıyor. Ancak paylaşılan bellekte paralel yürütmeyi desteklemek için yazılmamıştır. Elbette, aynı kodu birden fazla işlem boyunca paralel olarak çalıştırabilirsiniz, ancak nesneler paylaşılmaz, bu nedenle anlamlı bir şekilde paralel programlama değildir.

Ek okumalar için, bu sorunun en üst cevabındaki resimlerden gerçekten hoşlanıyorum: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming

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.