Eşzamanlı programlama ile paralel programlama arasındaki fark nedir?


346

Eşzamanlı programlama ile paralel programlama arasındaki fark nedir? Google'a sordum ama bu farkı anlamama yardımcı olacak hiçbir şey bulamadım. Bana her ikisine de bir örnek verebilir misiniz?

Şimdilik bu açıklamayı buldum: http://www.linux-mag.com/id/7411 - ama "eşzamanlılık programın bir özelliği" vs "paralel yürütme makinenin bir özelliği" benim için yeterli değil - hala ne olduğunu söyleyemem.


Yanıtlar:


310

Program iş parçacıkları (eşzamanlı programlama) kullanıyorsanız, makinenin birden fazla iş parçacığını işleyip işleyemeyeceğine bağlı olduğundan, bu şekilde (paralel yürütme) mutlaka yürütülmesi gerekmez.

İşte görsel bir örnek. Dişli olmayan bir makinedeki dişler :

        --  --  --
     /              \
>---- --  --  --  -- ---->>

Bir Kanallama dişli makinede:

     ------
    /      \
>-------------->>

Kısa çizgiler yürütülen kodu temsil eder. Gördüğünüz gibi, ikisi de ayrı ayrı ve yürütüyor, ancak dişli makine aynı anda birkaç ayrı parça yürütebiliyor.


34
Paralel yürütme ve paralel programlama aynı şey değildir. Jon Harrop'un cevabı doğrudur. Ancak sorunun kendisi paralel yürütme ve paralel programlamayı karıştırıyor gibi görünüyor.
Blaisorblade

3
İplikleri paralel olarak yürütme yeteneği, makineden daha fazlasına bağlıdır. Örneğin, OCaml (ve Python?), Çöp toplayıcı için küresel bir kilit nedeniyle aynı anda iş parçacıkları yürütür ancak paralel olarak yürütmez.
Jon Harrop

1
Bu bloga göre paralel programlama eş zamanlı programlamanın bir alt kümesi değildir ; cevabınız bunu dikkate almaz, bu ifade hakkında ne düşünüyorsunuz?
Kevin

1
@Kevin: Bence "daha genel" süper set demek. Yanlış olduğuna katılıyorum.
Jon Harrop

1
Bu cevap, eşzamanlı ve paralel yürütme arasındaki farkı görselleştirmek için iyidir, ancak posterin programlama hakkındaki orijinal sorusu için değil .
reorx

396

Eşzamanlı programlamaörtüşüyormuş gibi görünen operasyonlar ve öncelikle belirleyici olmayan kontrol akışı nedeniyle ortaya çıkan karmaşıklıkla ilgilidir. Eşzamanlı programlarla ilişkili nicel maliyetler tipik olarak hem verim hem de gecikmedir. Eşzamanlı programlar genellikle IO'ya bağlıdır, ancak her zaman değil, örneğin eşzamanlı çöp toplayıcıları tamamen CPU'dur. Eşzamanlı bir programın pedagojik örneği bir web tarayıcıdır. Bu program, web sayfaları için istekleri başlatır ve indirmelerin sonuçları kullanıma sunuldukça yanıtları aynı anda kabul eder ve daha önce ziyaret edilmiş olan bir dizi sayfayı biriktirir. Kontrol akışı belirleyici değildir, çünkü programın her çalıştırılışında yanıtların mutlaka aynı sırada alınmaması gerekir. Bu özellik eşzamanlı programlarda hata ayıklamayı çok zorlaştırabilir.Erlang , F # eşzamansız iş akışları ve Scala'nın Akka kütüphanesi, yüksek eşzamanlı programlamaya belki de en umut verici yaklaşımlardır.

Çok çekirdekli programlamaparalel programlama için özel bir durumdur. Paralel programlama, iş hacmini iyileştirme hedefi için çakışan işlemler ile ilgilidir. Eşzamanlı programlamanın zorlukları, kontrol akışını deterministik hale getirerek önlenir. Genellikle, programlar paralel çalışan alt görev kümeleri oluşturur ve üst görev yalnızca her alt görev tamamlandığında devam eder. Bu, paralel programların hata ayıklamasını eşzamanlı programlardan daha kolay hale getirir. Paralel programlamanın zor kısmı, ayrıntı düzeyi ve iletişim gibi konularda performans optimizasyonudur. İkincisi hala çok çekirdekli bağlamda bir sorundur, çünkü verilerin bir önbellekten diğerine aktarılmasıyla ilgili önemli bir maliyet vardır.Cilk , çoklu çekirdeklerde yüksek performanslı paralel programlama için belki de en umut verici yaklaşımdır ve hem Intel'in Dişli Yapı Taşları'nda hem de Microsoft'un Görev Paralel Kütüphanesinde (.NET 4'te) benimsenmiştir .


18
"Paralel programlamanın zor kısmı ... taneciklik ve iletişim gibi." Paralel görevlerin iletişim kurması gerekiyorsa, bu onları eşzamanlı hale getirmez mi?
Justin M. Keyes

13
"Paralel görevlerin iletişim kurması gerekiyorsa, bu onları eşzamanlı hale getirmez mi?". Vay canına, harika soru! Mutlaka hayır, hayır. Süper bilgisayarlar genellikle toplu paralel işlemlerle ve ardından verilerin küresel olarak yeniden dağıtılması ve daha fazla toplu paralellik ile programlanır. Yani paralellik ve iletişim var ama konuşmak için gerçek bir eşzamanlılık yok. Bu bağlamda, iletişimin önbellek karmaşıklığı, örneğin önbellek tutarlılığı için gerekli iletişim anlamına geldiği çok çekirdekli paralellik düşünüyorum. Bu eşzamanlı olmasına rağmen, doğrudan görünmez.
Jon Harrop

43
@BoppityBop Bir çizimde bir romanda söylediklerinin cevabımı daha az doğru yapmadığını söyleyebileceğim için. Cevabı gerçekten bilmeyenler için okuması daha kolay. Sanırım buraya gelme noktası. Bu yazı tarafından kullanılan dilde bir kitap yazabilirsiniz, ancak jon'un yazdıklarının yarısını zaten biliyorsanız, muhtemelen bu soruyu google'da bilmediğiniz için çoğu okuyucuya kesinlikle saçma olacaktır.
Tor Valamo

18
Resim benim için çok yardımcı oldu, konuya oldukça yeni birisi ve @JonHarrop'un açıklaması benim için yararlıydı, teknik bile olsa, doğru olanı takdir eden biri. Her iki cevap da daha kapsamlı bir anlayışa katkıda bulundu. Hepimiz kazanıyoruz! (paralel yürütme ve paralel programlama arasındaki ayrımı takdir
etsem de

3
"Erlang belki de en umut verici gelecek dil ...". Erlang ~ 30 yaşında ve 1998'de açık kaynaklı olduğu için ilginç kelime seçimi.
steinar

151

https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html

Eşzamanlı = İki kuyruk ve bir kahve makinesi.

Paralel = İki kuyruk ve iki kahve makinesi.


9
Yanlış ve yanıltıcı. Eşzamanlı = bir veya daha fazla kuyruğa izin verme (belirsiz olmayan kompozisyon). Paralel = boş değilse, orijinalinden daha kısa yapmak için birden fazla kuyruğa sahip olmak (asimtotik verimlilik).
FrankHB

Eşzamanlı kod için iki veya daha fazla işlemci (veya "kahve makinesi") gerekir. Dolayısıyla bu cevap aslında yanlıştır.
Geoffrey Anderson

6
@GeoffreyAnderson Hayır değil. Örneğin, dişler ve işlemler tek bir çekirdek makinede eşzamanlı olarak yürütülür.
Jon Harrop

@FrankHB - Lütfen stackoverflow.com/a/57223044/1406510 adresine bir göz atın ve kaynak linkine bakın - Oracle sitesinde - Yani yanlış olamaz ama anlayışımız olabilir. Yeniden düşünme zamanı. Bunu okuduktan sonra görüşümü değiştirdim.
nanosoft

@GeoffreyAnderson - Lütfen stackoverflow.com/a/57223044/1406510 adresine bakın. Kehanet bağlantısını içerir ve neyin ne olduğunu açıkça belirtir. Bu yüzden kendimizi onunla hizalamamız gerekiyor.
nanosoft

40

Orijinal sorunun programlama yerine paralel / eşzamanlı hesaplama olarak yorumlanması .

Gelen iki hesaplamaları hem peşin eşzamanlı hesaplama birbirinden bağımsız. İkinci hesaplamanın ilerlemesi için ilk işlemin bitmesini beklemek zorunda değildir. Bununla birlikte, bunun nasıl gerçekleştirildiğini ifade etmemektedir. Tek çekirdekli kurulumda, iş parçacıklarının askıya alınması ve değiştirilmesi gerekir ( önleyici olarak da adlandırılır) iş parçacıkları çoklu iş parçacığı olarak ).

In hem avans aynı anda paralel hesaplama iki hesaplamaları aynı anda tam anlamıyla -. Bu, tek CPU ile mümkün değildir ve bunun yerine çok çekirdekli kurulum gerektirir.

Makaleden resimler: "Paralel vs Eşzamanlı Node.js"

askıya alma ve sırayla karşı paralel hesaplama



21

Eşzamanlı programlamanın, programınızın donanım ayrıntılarından soyutlanmış birden çok iş parçacığı çalıştırmasına izin vermekle ilgili çok iş parçacıklı programlamayı ifade ettiğine inanıyorum.

Paralel programlama, mevcut paralel yürütmeden yararlanmak için program algoritmalarınızı özel olarak tasarlamayı ifade eder. Örneğin, bazı algoritmaların iki dalını paralel olarak, sonucu ilk önce ikinci dalda kontrol ettiğinizden daha erken (ortalama) vuracağı beklentisiyle çalıştırabilirsiniz.


2
Başka bir deyişle, iki şeyi paralel olarak yürütmek onları iki kat daha hızlı yapabilir. İki şeyi eşzamanlı olarak yürütmek, birinciyi ve sonra ikincinin birazını çalıştırmak arasında sadece bir CPU zaman dilimlemesi varsa, ilkini ve ardından diğerini yapmakla aynı zaman alabilir.
user189169

14

Bu içeriği bazı bloglarda buldum. Yararlı ve alakalı olduğunu düşündüm.

Eşzamanlılık ve paralellik aynı şey DEĞİLDİR. İki görevin zamanında yürütülme sırası önceden belirlenmemişse, iki görev T1 ve T2 eşzamanlıdır,

T1, T2'den önce çalıştırılabilir ve bitirilebilir, T2, T1, T1 ve T2'nin aynı anda (paralellik) aynı anda yürütülebilmesinden önce T2 çalıştırılabilir ve bitirilebilir, T1 ve T2 alternatif olarak çalıştırılabilir, ... işletim sistemi tarafından tek çekirdekli SMT olmayan bir CMP olmayan işlemci üzerinde çalışacak şekilde zamanlanırsa, eşzamanlılık elde edebilirsiniz, ancak paralellik elde edemezsiniz. Paralellik çok çekirdekli, çok işlemcili veya dağıtılmış sistemlerde mümkündür.

Eşzamanlılık genellikle bir programın özelliği olarak adlandırılır ve paralellikten daha genel bir kavramdır.

Kaynak: https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming


9

Aynı şeyi (çok az) farklı bakış açılarından tanımlayan iki cümledir. Paralel programlama, durumu donanım açısından açıklamaktadır - paralel bir sorun üzerinde çalışan en az iki işlemci (muhtemelen tek bir fiziksel paket içinde) vardır. Eşzamanlı programlama, şeyleri yazılım açısından daha fazla tanımlamaktadır - aynı anda (aynı anda) iki veya daha fazla eylem olabilir.

Buradaki sorun, insanlar gerçekten yokken net bir ayrım yapmak için iki ifadeyi kullanmaya çalışıyorlar. Gerçek şu ki, çizmeye çalıştıkları bölme çizgisi onlarca yıldır bulanık ve belirsiz ve zamanla daha belirsizleşiyor.

Tartışmaya çalıştıkları şey, bir zamanlar çoğu bilgisayarın sadece tek bir CPU'ya sahip olmasıdır. Bu tek CPU'da birden çok işlem (veya iş parçacığı) yürüttüğünüzde, CPU bir kerede bu iş parçacıklarından birinden yalnızca bir komut yürütüyordu. Eşzamanlılığın ortaya çıkması bir yanılsamaydı - CPU, farklı iş parçacıklarından talimatlar arasında hızlı bir şekilde insan algısına (100 ms'den daha az bir şey anında göründüğü gibi) çok sayıda şey yapıyormuş gibi görünüyordu.

Bunun açık karşıtlığı, birden fazla CPU'lu bir bilgisayar veya birden çok çekirdekli bir CPU'dur, bu nedenle makine aynı anda birden çok iş parçacığından ve / veya işlemden talimatlar yürütmektedir; kod yürütmenin diğerinde kod yürütmesi üzerinde herhangi bir etkisi yoktur / yoktur.

Şimdi sorun: böyle temiz bir ayrım neredeyse hiç yoktu. Eğer böyle bir disk gibi bir I / O cihazından bazı verileri okumak için gerektiğinde o (örneğin), bir aldı önce onlar uzun zaman fark böylece Bilgisayar tasarımcıları, aslında oldukça zeki uzun (CPU döngüleri açısından) zaman için bitiş. Bu gerçekleştiğinde CPU'yu boşta bırakmak yerine, bir işlem / iş parçacığının bir G / Ç isteği yapmasına ve G / Ç isteği tamamlanırken CPU üzerinde başka bir işlem / iş parçacığının kodunun yürütülmesine izin vermenin çeşitli yollarını buldular.

Bu nedenle, çok çekirdekli CPU'lar norm haline gelmeden çok önce, paralel olarak birden fazla iş parçacığından operasyonlar gerçekleştirdik.

Bu buzdağının sadece görünen kısmı. On yıllar önce bilgisayarlar başka bir paralellik düzeyi sağlamaya başladı. Yine, oldukça zeki insanlar olarak, bilgisayar tasarımcıları, birçok durumda, birbirlerini etkilemeyen talimatlara sahip olduklarını fark ettiler, bu yüzden aynı akıştan aynı anda birden fazla talimat yürütmenin mümkün olduğunu fark ettiler. Oldukça iyi bilinen ilk bir örnek, Kontrol Verileri 6600'dür. Bu, (oldukça geniş bir farkla), 1964'te piyasaya sürüldüğünde dünyadaki en hızlı bilgisayardı - ve aynı temel mimarinin çoğu bugün kullanımda. Her bir talimat tarafından kullanılan kaynakları izledi ve bağlı oldukları kaynaklar kullanılabilir hale gelir gelmez, en yeni Intel / AMD işlemcilerin tasarımına çok benzeyen talimatları yürüten bir dizi yürütme birimi vardı.

Ama (reklamların söylediği gibi) bekle - hepsi bu değil. Daha fazla karışıklık katacak başka bir tasarım öğesi daha var. Oldukça farklı isimler verildi (örneğin, "Hyperthreading", "SMT", "CMP"), ancak hepsi aynı temel fikri ifade ediyor: Aynı anda birden fazla iş parçacığı çalıştırabilen bir CPU, her bir iş parçacığı ve iş parçacıkları arasında paylaşılan bazı kaynaklar için bağımsızdır. Tipik bir durumda bu, yukarıda özetlenen talimat düzeyinde paralellik ile birleştirilir. Bunu yapmak için, iki (veya daha fazla) mimari kayıt setimiz var. Daha sonra, gerekli kaynaklar hazır olur olmaz talimatları yürütebilecek bir dizi yürütme birimimiz var.

Sonra, elbette, çok çekirdekli modern sistemlere ulaşıyoruz. Burada işler açık, değil mi? N (şu anda 2 ila 256 veya daha fazla, bir yerde) ayrı çekirdeklere sahibiz, bu da tüm talimatları aynı anda yürütebilir, bu yüzden gerçek paralelliğin net bir örneğine sahibiz - talimatları tek bir işlemde / iş parçacığında yürütmüyoruz ' t başka bir talimatın yürütülmesini etkilemez.

İyi sıralama. Burada bile bazı bağımsız kaynaklarımız (kayıtlar, yürütme birimleri, en az bir önbellek seviyesi) ve bazı paylaşılan kaynaklar (tipik olarak en az önbellek seviyesi ve kesinlikle bellek denetleyicileri ve belleğe bant genişliği) var.

Özetlemek gerekirse: insanların paylaşılan kaynaklar ile bağımsız kaynaklar arasındaki zıtlığı sevdikleri basit senaryolar gerçek hayatta hiçbir zaman gerçekleşmez. Paylaşılan tüm kaynaklarla, bir seferde yalnızca bir program çalıştırabileceğimiz MS-DOS gibi bir şeyle sonuçlanırız ve diğerini çalıştırmadan önce birini çalıştırmayı bırakmalıyız. Tamamen bağımsız kaynaklarla, aralarında hiçbir şey paylaşma yeteneği olmayan MS-DOS'u (onları bağlamak için bir ağ bile olmadan) çalıştıran N bilgisayarımız var (çünkü bir dosyayı paylaşabiliyorsak, bu paylaşılan bir kaynak, paylaşılmayan hiçbir şeyin temel önermesinin ihlali).

Her ilginç durum, bağımsız kaynakların ve paylaşılan kaynakların bir kombinasyonunu içerir. Her makul modern bilgisayar (ve hiç de modern olmayan bir çok şey) en az birkaç bağımsız işlemi aynı anda gerçekleştirme yeteneğine sahiptir ve MS-DOS'tan daha sofistike bir şey en azından bu avantajdan yararlanmıştır. bir dereceye kadar.

İnsanların çizmeyi sevdiği “eşzamanlı” ve “paralel” arasındaki hoş, temiz ayrım yoktur ve neredeyse hiç yoktur. İnsanların "eşzamanlı" olarak sınıflandırmayı sevdikleri şey genellikle en az bir ve genellikle daha farklı türde paralel yürütmeyi içerir. "Paralel" olarak sınıflandırmak istedikleri şey genellikle kaynak paylaşımını ve (örneğin) bir süreç, ikisi arasında paylaşılan bir kaynağı kullanırken başka birinin yürütülmesini engellemeyi içerir.

"Paralel" ve "eşzamanlı" arasında temiz bir ayrım yapmaya çalışan insanlar, aslında hiç var olmayan bir bilgisayar hayalinde yaşıyorlar.


6
  • Concurrent programminggenel anlamda, tanımladığımız görevlerin herhangi bir sırada olabileceği ortamlara atıfta bulunur. Bir görev diğerinden önce veya sonra gerçekleşebilir ve bazı veya tüm görevler aynı anda gerçekleştirilebilir.

  • Parallel programmingözellikle farklı işlemcilerde eşzamanlı görevlerin eşzamanlı olarak yürütülmesine atıfta bulunmaktır. Bu nedenle, tüm paralel programlama eşzamanlıdır, ancak tüm eşzamanlı programlama paralel değildir.

Kaynak: PThreads Programlama - Daha İyi Çoklu İşlem için POSIX Standardı, Buttlar, Farrell, Nichols


5

Programlamada eşzamanlılık, bağımsız olarak yürütme süreçlerinin bileşimidir; paralellik ise (muhtemelen ilişkili) hesaplamaların eşzamanlı yürütmesidir.
- Andrew Gerrand -

Ve

Eşzamanlılık, hesaplamaları bağımsız olarak yürütmenin bileşimidir. Eşzamanlılık, özellikle gerçek dünyayla iyi etkileşime giren temiz kod yazmanın bir yolu olarak yazılımı yapılandırmanın bir yoludur. Paralellik değil.

Eşzamanlılık paralellik değil, paralelliği mümkün kılar. Yalnızca bir işlemciniz varsa, programınız yine de eşzamanlı olabilir, ancak paralel olamaz. Öte yandan, iyi yazılmış bir eşzamanlı program çok işlemcili bir paralelde verimli bir şekilde çalışabilir. Bu özellik önemli olabilir ...
- Rob Pike -

Farkı anlamak için, bu Rob Pike'ın (Golang yaratıcılarından biri) videosunu izlemenizi şiddetle tavsiye ederim. Eşzamanlılık Paralellik Değildir


Vimeo bağlantı burada çalışmıyor youtube link youtube.com/watch?v=cN_DpYBzKso
Shivprasad Koirala

5

Paralel programlama, kod aynı anda yürütüldüğünde ve her yürütme diğerinden bağımsız olduğunda gerçekleşir. Bu nedenle, paylaşılan değişkenler hakkında genellikle bir endişe yoktur ve bu böyle bir şey olmayacaktır.

Bununla birlikte, eşzamanlı programlama, değişkenleri paylaşan farklı süreçler / iş parçacıkları tarafından yürütülen koddan oluşur ve bu nedenle eşzamanlı programlamada, önce hangi işlem / iş parçacığının yürütüleceğine karar vermek için bir tür kural oluşturmalıyız, bunu emin olmak için bunu istiyoruz tutarlılık olacak ve ne olacağını kesin olarak bilebiliriz. Denetim yoksa ve tüm iş parçacıkları aynı anda hesaplanır ve aynı değişkenlerde bir şeyler depolanırsa, sonunda ne bekleyeceğini nasıl bilebiliriz? Belki bir iş parçacığı diğerinden daha hızlıdır, belki iş parçacıkları ortasında bile iş parçacıkları durdu ve diğeri bozuk (henüz tam olarak hesaplanmamış) bir değişkenle farklı bir hesaplamaya devam etti, olasılıklar sonsuz. Bu durumlarda genellikle paralel yerine eşzamanlı programlama kullanırız.


5

Klasik görev zamanlaması seri , paralel veya eşzamanlı olabilir .

  • Seri : görevler, bilinen bir kandırılmış sırayla birbiri ardına yürütülmelidir, aksi takdirde çalışmaz. Yeterince kolay.

  • Paralel : görevler aynı anda yürütülmelidir, aksi takdirde çalışmaz.

    • Görevlerden herhangi birinin - işlevsel veya zamanında - başarısız olması, toplam sistem hatasına neden olacaktır.
    • Tüm görevlerin güvenilir ve ortak bir zaman anlayışı olmalıdır.

    Bundan kaçınmaya çalışın yoksa çay saati ile gözyaşı dökeceğiz.

  • Eşzamanlı : umursamıyoruz. Yine de dikkatsiz değiliz: analiz ettik ve önemli değil; bu nedenle herhangi bir görevi herhangi bir mevcut tesisi kullanarak her zaman yürütebiliriz. Mutlu günler.

Çoğu zaman, mevcut zamanlama, durum değişikliği olarak adlandırdığımız bilinen olaylarda değişir.

İnsanlar genellikle bunun yazılımla ilgili olduğunu düşünür, ancak aslında bilgisayarlardan önce gelen bir sistem tasarım konsepti; yazılım sistemleri alımda biraz yavaştı, çok az yazılım dili sorunu ele almaya bile çalıştı. Aktarıcı dilini aramayı deneyebilirsinizilgileniyorsanız occam'ı aramayı.

Kısaca, sistem tasarımı aşağıdakileri ele alır:

  • fiil - ne yapıyorsunuz (işlem veya algoritma)
  • isim - ne yaptığınızı (veri veya arayüz)
  • ne zaman - başlatma, zamanlama, durum değişiklikleri
  • nasıl - seri, paralel, eşzamanlı
  • nerede - bir şeylerin ne zaman gerçekleştiğini öğrendikten sonra, daha önce değil, nerede olabileceğini söyleyebilirsiniz.
  • neden - bunu yapmanın yolu mu? Başka yollar var ve daha da önemlisi, daha iyi bir yol var mı? Yapmazsan ne olur?

İyi şanslar.


8
Her yerde kapaklar görüyorum
Bruno Penteado

10
Bu cevap birlikte eşzamanlılık ve paralellik konularından daha karmaşıktır.
Kai Sellgren

3

Farkı anladım:

1) Eşzamanlı - paylaşılan kaynakları kullanarak birlikte çalışma 2) Paralel - farklı kaynakları kullanarak yan yana çalışma

Böylece, (2) noktalarında bir araya gelseler dahi, aynı anda iki şey olabilir ya da yürütülen operasyonlar boyunca aynı rezervleri çizen iki şey olabilir (1).


3

Paralel ve eşzamanlı terimler arasındaki ayrım konusunda tam bir mutabakat olmamasına rağmen , birçok yazar aşağıdaki ayrımları yapmaktadır:

  • Eşzamanlı hesaplamada, bir program herhangi bir anda birden fazla görevin devam edebileceği bir programdır.
  • Paralel hesaplamada, bir program, bir sorunu çözmek için birden fazla görevin yakın işbirliği içinde olduğu bir programdır.

Bu nedenle paralel programlar eşzamanlıdır, ancak çok görevli bir işletim sistemi gibi bir program da, yalnızca tek çekirdekli bir makinede çalıştırıldığında bile eşzamanlıdır, çünkü herhangi bir anda birden fazla görev devam edebilir.

Kaynak : Paralel programlamaya giriş, Peter Pacheco


1

Eşzamanlılık ve Paralellik Kaynağı

Tek bir işlemcideki çok iş parçacıklı bir işlemde, işlemci, yürütme kaynaklarını iş parçacıkları arasında değiştirerek eşzamanlı yürütme sağlar .

Paylaşılan bellek çok işlemcili ortamdaki aynı çok iş parçacıklı işlemde, işlemdeki her iş parçacığı aynı anda ayrı bir işlemci üzerinde çalışabilir ve paralel yürütme ile sonuçlanabilir .

İşlem, işlemciler kadar az veya çok sayıda iş parçacığına sahip olduğunda, iş parçacığı destek sistemi, çalışma ortamıyla birlikte, her iş parçacığının farklı bir işlemci üzerinde çalışmasını sağlar.

Örneğin, aynı sayıda iş parçacığı ve işlemciye sahip bir matris çarpımında, her iş parçacığı (ve her işlemci) sonucun bir satırını hesaplar.


Bu kaynak yalnızca uygulamanın özel bir örneğini gösterir - özel bir çoklu kullanım biçimi. Evet, çoklu iş parçacığının tüm hikayesini bile kapsamaz, örneğin M: N kullanıcı alanı diş açma modeli ve iş parçacığı zamanlamasının rolü. Diş açma, sistem mimarisi (OS, VM, HT etkin CPU, vb.) Ve / veya programlama arabirimi anlamında uygulamanın özel bir yoludur. Programlama arabirimi açığa çıkmayan ve iş parçacıklarıyla ilgisi olmayan modern bir CPU'nun uygulanmasında talimat düzeyinde paralellik gibi daha fazlası da vardır.
FrankHB

@FrankHB: İçeriğinizle ilgili herhangi bir özgün bağlantı paylaşabiliyorsanız sevinirim. Gerçekten daha fazlası olup olmadığını keşfetmek istiyorum. Mevcut anlayışım oldukça basit - Verilen iş parçacığı zamanlama mekanizması ile herhangi bir işletim sistemi mimarisi üzerinde çok iş parçacıklı bir uygulama çalıştırmak paralel mi yoksa eşzamanlı mı? M: N kullanıcı alanını vermiş olsanız bile - RUN'un paralel veya eşzamanlı olduğunu nasıl anlarsınız?
nanosoft

Farklı soyutlamalardaki sorunları tartışmak için bir cevap yazdım .
FrankHB

"Çalıştır" birçok soyutlamaya uygun genel bir eylem olduğundan, çok iş parçacıklı bir uygulamanın çalıştırılması temel soyutlamaya kıyasla oldukça karmaşıktır. Uygulamadaki iş parçacığı modeli tarafından (tipik olarak, uygulamayı programlamak için kullanılan dil spesifikasyonu ve dil çalışma zamanı uygulaması) temel soyutlamaya tamamlanmış birçok ayrıntı vardır.
FrankHB

0

Farklı insanlar, birçok farklı özel durumda farklı eşzamanlılık ve paralellikten bahseder, bu nedenle ortak doğalarını kapsayan bazı soyutlamalara ihtiyaç vardır.

Temel soyutlama, hem eşzamanlılığın hem de paralelliğin programların özelliklerine atfedildiği bilgisayar biliminde yapılır . Burada, programlar hesaplamanın resmî tanımlarıdır. Bu tür programların uygulamaya özgü herhangi bir dilde veya kodlamada olması gerekmez. API / ABI / ISA / OS'nin varlığı, böyle bir soyutlama düzeyi ile ilgisizdir. Şüphesiz, somut programlama çalışmaları yapmak için daha ayrıntılı uygulamaya özgü bilgiye (diş açma modeli gibi) ihtiyaç duyulacaktır, temel soyutlamanın arkasındaki ruh değişmez.

İkinci önemli gerçek, genel özellikler, eşzamanlılık ve paralellikin birçok farklı soyutlamada bir arada var olabilmesidir .

Genel ayrım için eşzamanlılık - paralellik hakkında temel görüş için ilgili cevaba bakınız . (Bazı ek kaynaklar içeren bazı bağlantılar da vardır.)

Eşzamanlı programlama ve paralel programlama, programlanabilirliği ortaya koyan bazı sistemlerle bu tür genel özellikleri uygulama teknikleridir. Sistemler genellikle programlama dilleri ve uygulamalarıdır.

Bir programlama dili, yerleşik semantik kurallarla amaçlanan özellikleri gösterebilir. Çoğu durumda, bu tür kurallar, hesaplamayı etkin bir şekilde eşzamanlı veya paralel hale getiren belirli dil yapılarının (örneğin ifadeler) değerlendirmelerini belirtir. (Daha spesifik olarak, değerlendirmelerin ima ettiği hesaplama etkileri bu özellikleri mükemmel bir şekilde yansıtabilir.) Bununla birlikte, eşzamanlı / paralel dil semantiği esasen karmaşıktır ve pratik çalışmalara (gerçekçi problemlerin çözümü olarak verimli eşzamanlı / paralel algoritmalar uygulamak için gerekli değildir) ). Bu nedenle, çoğu geleneksel dil daha muhafazakar ve daha basit bir yaklaşım benimser: değerlendirme anlambilimini tamamen sıralı ve seri olarak kabul etmek, ardından izin vermek için isteğe bağlı ilkeler sağlamak bazılarınahesaplamaların eşzamanlı ve paralel olması. Bu temel öğeler, dil tarafından desteklenen anahtar kelimeler veya yordamsal yapılar ("işlevler") olabilir. Barındırılan ortamlarla (OS veya "çıplak metal" donanım arayüzü), genellikle opak (dil kullanılarak portatif olarak türetilemez) dile dönüştürülür. Dolayısıyla, programcılar tarafından görülen bu tür yüksek seviyeli soyutlamalarda, bu "sihirli" ilkellerin ve bu ilkellere dayanan programların yanında hiçbir şey eşzamanlı / paralel değildir; daha sonra eşzamanlılık / paralellik özellikleri bu kadar ilgi göstermediğinde programcılar hataya daha az eğilimli programlama deneyiminin keyfini çıkarabilir.

Her ne kadar ilkeller en üst düzey soyutlamalarda kompleksi soyutlasa da, uygulamalar hala dil özelliğinin göstermediği ekstra karmaşıklığa sahiptir. Bu nedenle, bazı orta düzey soyutlamalara ihtiyaç vardır. Tipik bir örnek, diş açmadır . Threading bir veya daha fazla izin veren yürütme iş parçacığı (veya basitçe diş işlemi , dil uygulaması (çalışma zamanı) tarafından desteklenen ; bazen de bir işletim sisteminde zamanlanan bir görev kavramı olması gerekmeyen) bir işlem olarak adlandırılır . İş parçacıkları genellikle çalışma zamanı tarafından önceden planlanır, bu nedenle iş parçacığının diğer iş parçacıkları hakkında hiçbir şey bilmemesi gerekir. Dolayısıyla, iplikler, hiçbir şey paylaşmadıkları sürece paralelliği uygulamak doğaldır ( kritik kaynaklar): sadece farklı uygulamalardaki hesaplamaları ayrıştırın, temeldeki uygulama yürütme sırasında hesaplama kaynaklarının çakışmasına izin verdiğinde, çalışır. İş parçacıkları aynı zamanda paylaşılan kaynakların eşzamanlı erişimine tabidir: kaynaklara yalnızca herhangi bir sırayla erişim algoritmanın gerektirdiği minimum kısıtlamaları karşılar ve uygulama nihayetinde ne zaman erişileceğini belirler. Bu gibi durumlarda, bazı senkronizasyon işlemleri gerekli olabilir. Bazı diller, diş açma ve senkronizasyon işlemlerini üst düzey soyutlamanın bir parçası olarak görür ve ilkel olarak ortaya koyarken, bazı diller bunun yerine yalnızca nispeten daha yüksek düzeyli ilkeleri ( gelecek / vaatler gibi ) teşvik eder .

Dile özgü iş parçacıkları düzeyi altında, temel barındırma ortamının (genellikle bir işletim sistemi) çoklu görevleri vardır. İşletim sistemi düzeyinde önleyici çoklu görev (önleyici) çoklu iş parçacığını uygulamak için kullanılır. Windows NT gibi bazı ortamlarda, temel zamanlama birimleri (görevler) de "iş parçacıklarıdır". Bunları yukarıda belirtilen iş parçacıklarının kullanıcı alanı uygulamasıyla ayırt etmek için, çekirdek çekirdek olarak adlandırılırlar, burada "çekirdek" işletim sisteminin çekirdeği anlamına gelir (ancak, kesinlikle Windows NT için bu doğru değildir; "gerçek" çekirdek NT'dir yürütme) . Çekirdek iş parçacıkları her zaman kullanıcı alanı iş parçacıklarıyla 1: 1 eşlenmez, ancak 1: 1 eşleme çoğu zaman eşleme genel giderlerini azaltır. Çekirdek iş parçacıkları oluşturmak / yok etmek / iletişim kurmak için ağır olduğundan (sistem çağrılarını içerir), yeşil konuharitalama yükü pahasına genel gider sorunlarının üstesinden gelmek için kullanıcı alanında. Yüksek düzey soyutlamada beklenen programlama paradigmasına bağlı olarak harita seçimi. Örneğin, çok sayıda kullanıcı alanı iş parçacığının eşzamanlı olarak yürütülmesi bekleniyorsa ( Erlang gibi ), 1: 1 eşleme asla mümkün değildir.

OS çoklu görevinin altında yatan, işlemcinin mantıksal çekirdeği tarafından sağlanan ISA düzeyinde çoklu görevdir. Bu genellikle programcılar için en düşük seviyeli genel arayüzdür. Bu seviyenin altında SMT olabilir . Bu, genellikle yalnızca işlemci üreticisi tarafından erişilebilir olsa da, donanım tarafından uygulanan daha düşük seviyeli çok iş parçacıklı bir biçimdir, ancak tartışmalı olarak yine de biraz programlanabilir. Donanım tasarımının görünüşte paralellik yansıttığını unutmayın, ancak dahili donanım kaynaklarının verimli bir şekilde kullanılmasını sağlamak için eşzamanlı zamanlama mekanizması da vardır.

Yukarıda bahsedilen her "diş çekme" düzeyinde hem eşzamanlılık hem de paralellik söz konusudur. Programlama arayüzleri önemli ölçüde değişmekle birlikte, hepsi başlangıçta temel soyutlamanın ortaya koyduğu özelliklere tabidir.


0

Sadece farkı vurgulamaya yardımcı olacak bir örnek paylaşmak:

Paralel Programlama: Birleştirme sıralama algoritmasını uygulamak istediğinizi varsayalım . Sorunu her iki alt soruna böldüğünüzde, bunları çözen iki iş parçacığınız olabilir. Ancak, birleştirme adımını gerçekleştirmek için birleştirme her iki alt çözümü de gerektirdiğinden, bu iki iş parçacığının tamamlanmasını beklemeniz gerekir. Bu "zorunlu bekleme" bunu paralel bir program yapar.

Eşzamanlı Programı: De ki istediğiniz n metin dosyaları sıkıştırmak ve bunların her biri için bir sıkıştırılmış dosya oluşturmak. Her bir dosyanın bir alt kümesini sıkıştıran 2 (en fazla n) iş parçacığına sahip olabilirsiniz. Her iş parçacığı tamamlandığında, sadece bitti, beklemek veya başka bir şey yapmak zorunda değil. Bu nedenle, farklı görevler "herhangi bir keyfi sırada" serpiştirilmiş bir şekilde gerçekleştirildiğinden, program eşzamanlıdır ancak paralel değildir.

Başka birinin belirttiği gibi, her paralel program eşzamanlıdır (aslında olması gerekir), ancak tam tersi değildir.


0

Kendi tarzımda açıklamaya çalışacağım, bilgisayar terimleriyle olmayabilir ama size genel bir fikir veriyor.

Bir örnek alalım, Ev işlerini diyelim: bulaşıkları temizlemek, çöpü çıkarmak, çimleri biçmek vb.Ayrıca bunları yapmak için 3 kişi (diş) A, B, C var

Eşzamanlı: Üç kişi farklı görevlere bağımsız olarak başlar, yani,

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

Burada, görevlerin sırası belirsizdir ve yanıtlar iş miktarına bağlıdır

Paralel: Burada örneğin, biz tek göreve birden fazla kişi atayabilirsiniz üretilen iş geliştirmek istiyorsanız, yemekler bize A yemekleri ve B yıkama yemekleri pisletirken, iki kişi atamak temizlik olabilir kapasitesinin iyileştirilmesi.

bulaşıkların temizlenmesi:

A --> soaping the dishes
B --> washing the dishes

yakında

Umarım bu bir fikir verir! şimdi diğer cevaplarda açıklanan teknik terimlere geçin;)

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.