Herhangi bir çoklu hesaplama biçimi nedeniyle bir hız artışı olduğunu varsaymak için, birden çok CPU tabanlı görevin aynı anda birden çok bilgi işlem kaynağı (genellikle işlemci çekirdeği) üzerinde yürütüldüğünü ya da tüm görevlerin eşzamanlı kullanımına bağlı olmadığını varsaymalısınız. aynı kaynak - yani, bazı görevler bir sistem alt bileşenine (örneğin disk depolama) bağlı olabilirken, bazı görevler diğerine bağlıdır (bir çevresel aygıttan iletişim alma) ve yine de diğerleri işlemci çekirdeklerinin kullanımını gerektirebilir.
İlk senaryoya genellikle "paralel" programlama adı verilir. İkinci senaryo genellikle "eşzamanlı" veya "eşzamansız" programlama olarak adlandırılır, ancak "eşzamanlı" da bazen yalnızca bir işletim sisteminin birden fazla görevin yürütülmesi gerekip gerekmediğinden bağımsız olarak birden fazla görevin yürütülmesine izin verme durumuna atıfta bulunmak için kullanılır. seri olarak yerleştirin veya paralel yürütmeyi gerçekleştirmek için birden fazla kaynak kullanılabiliyorsa. Bu ikinci durumda, "eşzamanlı" genellikle görev yürütmenin gerçek eşzamanlılığı perspektifinden ziyade, yürütmenin programda yazılma şeklini ifade eder.
Bütün bunlar hakkında üstü kapalı varsayımlarla konuşmak çok kolay. Örneğin, bazıları "Eşzamansız G / Ç, çok iş parçacıklı G / Ç'den daha hızlı olacak" gibi bir iddiada bulunmakta hızlıdır. Bu iddia birkaç nedenden dolayı şüphelidir. Birincisi, verilen bazı eşzamansız G / Ç çerçevesinin tam olarak çoklu iş parçacığı ile uygulanması söz konusu olabilir, bu durumda bunlar aynıdır ve bir kavramın diğerinden "daha hızlı" olduğunu söylemek mantıklı değildir. .
İkinci olarak, eşzamansız bir çerçevenin tek iş parçacıklı bir uygulaması olduğu durumda bile (tek iş parçacıklı bir olay döngüsü gibi), yine de bu döngünün ne yaptığı hakkında bir varsayımda bulunmalısınız. Örneğin, tek iş parçacıklı bir olay döngüsüyle yapabileceğiniz aptalca bir şey, eşzamansız olarak iki farklı tamamen CPU'ya bağlı görevi tamamlama isteğidir. Bunu yalnızca idealleştirilmiş tek işlemci çekirdeği olan bir makinede yaptıysanız (modern donanım optimizasyonlarını göz ardı ederek), bu görevi "eşzamansız olarak" gerçekleştirmek, onu iki bağımsız olarak yönetilen iş parçacığı veya yalnızca tek bir işlemle gerçekleştirmekten gerçekten farklı bir performans göstermez - - fark, iş parçacığı bağlamı değiştirme veya işletim sistemi çizelgesi optimizasyonlarından kaynaklanabilir, ancak her iki görev de CPU'ya gidiyorsa, her iki durumda da benzer olacaktır.
Karşılaşabileceğiniz pek çok olağandışı veya aptalca köşe vakasını hayal etmek yararlıdır.
"Eşzamansız" eşzamanlı olmak zorunda değildir, örneğin yukarıdaki gibi: tam olarak bir işlemci çekirdeğine sahip bir makinede iki CPU'ya bağlı görevi "eşzamansız olarak" yürütürsünüz.
Çok iş parçacıklı yürütme eşzamanlı olmak zorunda değildir: tek bir işlemci çekirdeği olan bir makinede iki iş parçacığı oluşturur veya iki iş parçacığının diğer türden kıt kaynakları elde etmesini istersiniz (örneğin, yalnızca birini kurabilen bir ağ veritabanı hayal edin) bir seferde bağlantı). İş parçacığının yürütülmesi aralıklı olabilir, ancak işletim sistemi zamanlayıcısı uygun görür, ancak toplam çalışma süreleri tek bir çekirdekte azaltılamaz (ve iş parçacığı bağlamı değiştirmesinden artırılacaktır) (veya daha genel olarak, eğer mevcut olandan daha fazla iş parçacığı oluşturursanız) onları çalıştırmak için çekirdekler veya kaynağın sürdürebileceğinden daha fazla kaynak isteyen iş parçacığı var). Aynı şey çoklu işleme için de geçerlidir.
Bu nedenle, ne asenkron G / Ç ne de çoklu iş parçacığı çalışma süresi açısından herhangi bir performans kazancı sunmak zorunda değildir. Hatta işleri yavaşlatabilirler.
Bununla birlikte, hem uzak bir veritabanı gibi ağa bağlı bir kaynaktan veri almak için bir ağ çağrısı yapan hem de bazı yerel CPU'ya bağlı hesaplamalar yapan belirli bir program gibi belirli bir kullanım durumu tanımlarsanız, donanım hakkında belirli bir varsayım verildiğinde iki yöntem arasındaki performans farklılıkları.
Sorulacak sorular: Kaç tane hesaplama adımını gerçekleştirmem gerekiyor ve bunları gerçekleştirmek için kaç bağımsız kaynak sistemi var? Bağımsız sistem alt bileşenlerinin kullanılmasını gerektiren ve bunu aynı anda yapmaktan yararlanabilecek hesaplama adımlarının alt kümeleri var mı? Kaç işlemci çekirdeğim var ve görevleri ayrı çekirdeklerde tamamlamak için birden fazla işlemci veya iş parçacığı kullanmanın ek yükü nedir?
Görevleriniz büyük ölçüde bağımsız alt sistemlere dayanıyorsa, zaman uyumsuz bir çözüm iyi olabilir. İşlenmesi gereken iş parçacığı sayısı büyükse, böylece bağlam değiştirme işletim sistemi için önemsiz hale gelirse, tek iş parçacıklı eşzamansız bir çözüm daha iyi olabilir.
Görevler aynı kaynakla bağlandığında (örneğin, aynı ağa veya yerel kaynağa eşzamanlı olarak erişmek için birden fazla ihtiyaç), o zaman çoklu iş parçacığı muhtemelen tatmin edici olmayan ek yük getirecektir ve tek iş parçacıklı eşzamansızlık böyle bir kaynakta daha az ek yük getirebilir. sınırlı durum da bir hızlanma üretemez. Böyle bir durumda, tek seçenek (hızlandırma istiyorsanız) o kaynağın birden çok kopyasını kullanılabilir hale getirmektir (örneğin, kıt kaynak CPU ise birden fazla işlemci çekirdeği; kıt kaynak varsa daha fazla eşzamanlı bağlantıları destekleyen daha iyi bir veritabanı) bağlantısı sınırlı bir veritabanıdır, vb.).
Koymak için başka bir yoludur: işletim sistemi iki görevler için tek kaynak kullanımını serpiştirmek için izin olamaz hızlı sadece bir görev kullanımını diğer bekler, daha sonra seri ikinci görev bitirmek izin verirken kaynak icar daha olacak. Ayrıca, serpiştirmenin programlayıcı maliyeti, herhangi bir gerçek durumda aslında bir yavaşlama yarattığı anlamına gelir. Aralıklı kullanımın CPU, bir ağ kaynağı, bir bellek kaynağı, bir çevresel aygıt veya herhangi bir başka sistem kaynağından meydana gelmesi önemli değildir.