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.