Eşzamanlılık ve Paralellik
Çok iş parçacıklı programlarla ilişkili olarak hem eşzamanlılık hem de paralellik kullanılır, ancak aralarındaki benzerlik ve farklılık konusunda çok fazla kafa karışıklığı vardır. Bu konudaki büyük soru: eşzamanlılık paralelliği mi değil mi? Her iki terim de oldukça benzer görünse de, yukarıdaki sorunun cevabı HAYIR olsa da, eşzamanlılık ve paralellik aynı değildir. Şimdi, eğer aynı değillerse, aralarındaki temel fark nedir?
Basit bir ifadeyle, eşzamanlılık, farklı iş parçacıklarından paylaşılan duruma erişimin yönetilmesiyle ilgilenir ve diğer tarafta, paralellik, donanımın performansını artırmak için birden çok CPU'yu veya çekirdeklerini kullanma ile ilgilidir.
Ayrıntılı Olarak Eş Zamanlılık
Eşzamanlılık, iki görevin yürütülürken çakışmasıdır. Bir uygulamanın aynı anda birden fazla göreve ilerlediği bir durum olabilir. Şematik olarak anlayabiliriz; aşağıdaki gibi birden çok görev aynı anda ilerliyor -
Eş Zamanlılık Seviyeleri
Bu bölümde, programlama açısından üç önemli eşzamanlılık düzeyini tartışacağız -
Düşük Seviye Eş Zamanlılık
Bu eşzamanlılık düzeyinde, atomik işlemlerin açık kullanımı vardır. Hataya çok açık olduğu ve hata ayıklaması zor olduğu için uygulama oluşturmak için bu tür bir eşzamanlılık kullanamayız. Python bile bu tür eşzamanlılığı desteklemez.
Orta Seviye Eş Zamanlılık
Bu eşzamanlılıkta, açık atomik işlemlerin kullanımı yoktur. Açık kilitleri kullanır. Python ve diğer programlama dilleri bu tür eşzamanlılığı destekler. Çoğunlukla uygulama programcıları bu eşzamanlılığı kullanır.
Yüksek Düzey Eşzamanlılık
Bu eşzamanlılıkta, ne açık atomik işlemler ne de açık kilitler kullanılır. Python'daconcurrent.futures Bu tür eşzamanlılığı desteklemek için modül.
Eşzamanlı Sistemlerin Özellikleri
Bir programın veya eşzamanlı sistemin doğru olması için bazı özelliklerin onun tarafından karşılanması gerekir. Sistemin sonlandırılmasına ilişkin özellikler aşağıdaki gibidir -
Doğruluk özelliği
Doğruluk özelliği, programın veya sistemin istenen doğru yanıtı vermesi gerektiği anlamına gelir. Basit tutmak için, sistemin başlangıç program durumunu son duruma doğru bir şekilde eşlemesi gerektiğini söyleyebiliriz.
Güvenlik özelliği
Güvenlik özelliği, programın veya sistemin bir “good” veya “safe” devlet ve asla hiçbir şey yapmaz “bad”.
Canlılık özelliği
Bu özellik, bir programın veya sistemin “make progress” ve arzu edilen bir duruma ulaşacaktır.
Eşzamanlı sistemlerin aktörleri
Bu, kendi görevlerinde ilerleme kaydetmek için aynı anda çalışan birden çok işlemin ve iş parçacığının olabileceği eşzamanlı sistemin ortak bir özelliğidir. Bu süreçler ve iş parçacıkları eşzamanlı sistemin aktörleri olarak adlandırılır.
Eşzamanlı Sistemlerin Kaynakları
Oyuncular görevlerini yerine getirebilmek için bellek, disk, yazıcı vb. Kaynakları kullanmalıdır.
Belirli kurallar seti
Her eşzamanlı sistem, aktörler tarafından gerçekleştirilecek görev türlerini ve her birinin zamanlamasını tanımlayan bir dizi kurala sahip olmalıdır. Görevler kilit alma, bellek paylaşımı, durumu değiştirme vb. Olabilir.
Eşzamanlı Sistemlerin Engelleri
Eşzamanlı sistemleri uygularken, programcı eşzamanlı sistemlerin engelleri olabilecek aşağıdaki iki önemli konuyu dikkate almalıdır -Verilerin paylaşılması
Eşzamanlı sistemleri uygularken önemli bir konu, verilerin birden çok iş parçacığı veya süreç arasında paylaşılmasıdır. Aslında, programcı kilitlerin paylaşılan verileri koruduğundan emin olmalıdır, böylece ona tüm erişimlerin serileştirilmesi ve bir seferde yalnızca bir iş parçacığı veya işlem paylaşılan verilere erişebilir. Birden fazla iş parçacığı veya işlemin tümü aynı paylaşılan verilere erişmeye çalıştığında, hepsi değil, en az biri engellenecek ve boşta kalacaktır. Başka bir deyişle, kilit yürürlükte iken bir seferde yalnızca bir işlem veya iş parçacığı kullanabileceğimizi söyleyebiliriz. Yukarıda belirtilen engelleri kaldırmak için bazı basit çözümler olabilir -
Veri Paylaşımı Kısıtlaması
En basit çözüm, değiştirilebilir herhangi bir veriyi paylaşmamaktır. Bu durumda, açık kilitleme kullanmamıza gerek kalmaz ve karşılıklı verilerden kaynaklanan eşzamanlılık engeli çözülür.
Veri Yapısı Yardımı
Çoğu zaman eşzamanlı işlemlerin aynı verilere aynı anda erişmesi gerekir. Açık kilit kullanmaktan başka bir çözüm, eşzamanlı erişimi destekleyen bir veri yapısı kullanmaktır. Örneğin, kullanabilirizqueuemodül, iş parçacığı açısından güvenli kuyruklar sağlar. Ayrıca kullanabilirizmultiprocessing.JoinableQueue çoklu işlem tabanlı eşzamanlılık sınıfları.
Değişmez Veri Transferi
Bazen kullandığımız veri yapısı, örneğin eşzamanlılık kuyruğu uygun değildir, o zaman değişmez verileri kilitlemeden geçirebiliriz.
Değişken Veri Aktarımı
Yukarıdaki çözümün devamında, eğer değişmez verilerden ziyade yalnızca değiştirilebilir verilerin aktarılması gerekiyorsa, o zaman salt okunur olan değişken verileri geçirebileceğimizi varsayalım.
G / Ç Kaynaklarının Paylaşımı
Eşzamanlı sistemlerin uygulanmasında bir başka önemli konu, iş parçacıkları veya süreçler tarafından G / Ç kaynaklarının kullanılmasıdır. Sorun, bir iş parçacığı veya işlem G / Ç'yi bu kadar uzun süre kullandığında ve diğeri boşta kaldığında ortaya çıkar. I / O ağır bir uygulama ile çalışırken bu tür bir engel görebiliriz. Web tarayıcısından sayfaların istenmesi bir örnek yardımı ile anlaşılabilir. Ağır bir uygulamadır. Burada, verinin talep edildiği hız, tüketildiği hızdan daha yavaşsa, eşzamanlı sistemimizde I / O bariyerimiz vardır.
Aşağıdaki Python betiği, bir web sayfası istemek ve ağımızın istenen sayfayı almak için harcadığı zamanı almak içindir -
import urllib.request
import time
ts = time.time()
req = urllib.request.urlopen('http://www.tutorialspoint.com')
pageHtml = req.read()
te = time.time()
print("Page Fetching Time : {} Seconds".format (te-ts))
Yukarıdaki komut dosyasını çalıştırdıktan sonra, sayfa getirme zamanını aşağıda gösterildiği gibi alabiliriz.
Çıktı
Page Fetching Time: 1.0991398811340332 Seconds
Sayfayı getirme süresinin bir saniyeden fazla olduğunu görebiliriz. Şimdi ya binlerce farklı web sayfasını getirmek istersek, ağımızın ne kadar zaman alacağını anlayabilirsiniz.
Paralellik nedir?
Paralellik, görevleri eşzamanlı olarak işlenebilen alt görevlere bölme sanatı olarak tanımlanabilir. Yukarıda tartışıldığı gibi, aynı anda iki veya daha fazla olayın meydana geldiği eşzamanlılığın tam tersidir. Şematik olarak anlayabiliriz; bir görev, aşağıdaki gibi paralel olarak işlenebilen birkaç alt göreve bölünür -
Eşzamanlılık ve paralellik arasındaki ayrım hakkında daha fazla fikir edinmek için aşağıdaki noktaları göz önünde bulundurun:
Eşzamanlı ama paralel değil
Bir uygulama eşzamanlı olabilir ancak paralel olmayabilir, aynı anda birden fazla görevi işlediği, ancak görevlerin alt görevlere ayrılmadığı anlamına gelir.
Paralel ama eşzamanlı değil
Bir uygulama paralel olabilir ancak eşzamanlı olmayabilir, bir seferde yalnızca bir görev üzerinde çalıştığı ve alt görevlere bölünmüş görevlerin paralel olarak işlenebileceği anlamına gelir.
Ne paralel ne de eşzamanlı
Bir uygulama ne paralel ne de eşzamanlı olabilir. Bu, aynı anda yalnızca bir görev üzerinde çalıştığı ve görevin asla alt görevlere ayrılmadığı anlamına gelir.
Hem paralel hem de eşzamanlı
Bir uygulama hem paralel hem de eşzamanlı olabilir, yani aynı anda birden çok görev üzerinde çalışır ve görev, bunları paralel olarak yürütmek için alt görevlere bölünür.
Paralelliğin Gerekliliği
Alt görevleri tek CPU'nun farklı çekirdekleri arasında veya bir ağa bağlı birden fazla bilgisayar arasında dağıtarak paralellik sağlayabiliriz.
Paralelliğe ulaşmak için neden gerekli olduğunu anlamak için aşağıdaki önemli noktaları göz önünde bulundurun -
Verimli kod yürütme
Paralellik yardımı ile kodumuzu verimli bir şekilde çalıştırabiliriz. Aynı kod parçalar halinde paralel olarak çalıştığı için zamandan tasarruf edecek.
Sıralı hesaplamadan daha hızlı
Sıralı hesaplama, daha hızlı hesaplama sonuçları elde etmenin mümkün olmadığı fiziksel ve pratik faktörlerle sınırlıdır. Öte yandan, bu sorun paralel hesaplamayla çözülür ve bize sıralı hesaplamadan daha hızlı hesaplama sonuçları verir.
Daha az uygulama süresi
Paralel işleme, program kodunun yürütme süresini azaltır.
Gerçek hayattaki paralellik örneğinden bahsedecek olursak, bilgisayarımızın grafik kartı paralel işlemenin gerçek gücünü vurgulayan örnektir çünkü bağımsız olarak çalışan ve aynı anda yürütmeyi yapabilen yüzlerce ayrı işlemci çekirdeğine sahiptir. Bu nedenle, üst düzey uygulamaları ve oyunları da çalıştırabiliyoruz.
Uygulama için işlemcilerin anlaşılması
Eşzamanlılık, paralellik ve aralarındaki farkı biliyoruz ama uygulanacağı sistem ne olacak? Uygulayacağımız sistem anlayışına sahip olmak çok gerekli çünkü yazılımı tasarlarken bilinçli karar almamız bize fayda sağlıyor. Aşağıdaki iki tür işlemciye sahibiz -
Tek çekirdekli işlemciler
Tek çekirdekli işlemciler, herhangi bir zamanda bir iş parçacığını yürütebilir. Bu işlemciler şunları kullanır:context switchingbir iş parçacığı için gerekli tüm bilgileri belirli bir zamanda depolamak ve daha sonra bilgileri daha sonra geri yüklemek için. Bağlam değiştirme mekanizması, belirli bir saniye içinde birkaç iş parçacığı üzerinde ilerleme kaydetmemize yardımcı olur ve sistem birden çok şey üzerinde çalışıyormuş gibi görünür.
Tek çekirdekli işlemcilerin birçok avantajı vardır. Bu işlemciler daha az güç gerektirir ve birden çok çekirdek arasında karmaşık bir iletişim protokolü yoktur. Öte yandan, tek çekirdekli işlemcilerin hızı sınırlıdır ve daha büyük uygulamalar için uygun değildir.
Çok çekirdekli işlemciler
Çok çekirdekli işlemcilerin birden çok bağımsız işlem birimi vardır. cores.
Bu tür işlemciler bağlam değiştirme mekanizmasına ihtiyaç duymaz, çünkü her çekirdek bir dizi depolanan talimatı yürütmek için ihtiyaç duyduğu her şeyi içerir.
Getirme-Kod Çözme-Yürütme Döngüsü
Çok çekirdekli işlemcilerin çekirdekleri, yürütme için bir döngü izler. Bu döngü denirFetch-Decode-Executedöngü. Aşağıdaki adımları içerir -
Getir
Bu, program belleğinden komutların alınmasını içeren çevrimin ilk adımıdır.
Kod çözme
Yakın zamanda alınan talimatlar, CPU'nun diğer bölümlerini tetikleyecek bir dizi sinyale dönüştürülecektir.
Yürüt
Alınan ve kodu çözülen talimatların yürütüleceği son adımdır. Yürütmenin sonucu bir CPU kaydında saklanacaktır.
Buradaki avantajlardan biri, çok çekirdekli işlemcilerdeki yürütmenin tek çekirdekli işlemcilerden daha hızlı olmasıdır. Daha büyük uygulamalar için uygundur. Öte yandan, birden çok çekirdek arasındaki karmaşık iletişim protokolü bir sorundur. Birden çok çekirdek, tek çekirdekli işlemcilerden daha fazla güç gerektirir.