Senkron & Asenkron ve MultiThread Programlama -1 — Thread kavramı

Thread kavramı
- Threadler, aynı metotlar gibi belirli bir işi yapmakla yükümlü iş parçacıklarıdır.
- Bu iş -veya program- parçacıkları, aynı metotlar gibi belirli bir görevi yerine getirdikten sonra işini bitirebilir veya program çalıştığı sürece çalışmaya devam da edebilir.
- Bir yazılımın işletim sisteminde ayağa kaldırılması yani çalışması için kullanıcı iradesi olmaksızın ilk iş olarak bir thread oluşturulur.
- Bu thread’e main -ana- thread diyoruz.
- Ana thread kendi akışını yani programın akışını kontrol ederken, aynı zamanda diğer küçük iş parçacıklarının yani diğer threadlerin de çalışmasını ve akışını kontrol eder.
- Bu diğer kullanıcının kendi iradesiyle oluşturduğu, belli başlı işleri aynı anda yapılmasını veya eş zamanlı çalıştırılmasını sağlayan yardımcı threadlere genellikle worker thread denir.
- Diğer küçük threadlerin sonlanması programın akışına bir etki etmez fakat ana threadin sonlanması programın da sonlanması demektir.
- Örnek olarak windows form projesi form kapatılmasını aklımıza getirebiliriz.
Asenkron — Senkron Programlama Kavramları
- Asenkron çalışma, bir işlemin çalışmasında yani görevini getirmesinde başka herhangi bir işin başlamasına veya sonlanmasına bağımlı olmama veya bu bağımlılığın zayıf olması durumudur.
- Yani asenkron çalışma, bir işlem sürerken diğer işlemlerinde bekletilmeksizin devam etmesini olanak tanımaktadır.
- Asenkron çalışmaya karşıdaki birisi ile mailleşme örneği verebiliriz.Birisine mail gönderen bir kişi, karşısındakinden mail bekleme anında, başka birilerine de mail atabilir, veya başka işlerle ilgilenebilir.
- Senkron çalışma, bir işlemin başlamasının başka bir işlemin bitmesine bağlı olması durumunu ifade eder.
- Bir T zamanında aynı anda birden fazla iş Senkron çalışmada yürütülemez bu T zamanında sadece tek bir iş yürütülebilir.
- Senkron çalışmaya ise bir kişinin karşısındaki ile telefonla konuşmasını örnek verebiliriz. İkili konuşma sırasında, telefon konuşması bitmeden başka birisi ile telefonla konuşamayız.
- Yani özetle, bir işi, işlemi, kodu, Senkron olarak çalıştırırsak başka bir işin çalışabilmesi için bu işin bitmesini beklemeliyiz. fakat Asenkron olarak çalıştırırsak bu işi beklemeye gerek kalmaksızın başka bir işi de çalıştırabiliriz.
Senkron ve Asenkron çalışmayı istersek tek bir thread ile, istersek de birden fazla thread ile gerçekleştirebiliriz.
Senkron — Single Thread

Senkron — Multi Thread

Asenkron — Single Thread

Asenkron — Multi Thread

Asenkron — Senkron Programlama ve MultiThread Programlama Arasındaki Farklar
- Esasında, asenkron & senkron programlama da, Multithread programlama da aynı amaca hizmet eder. Bu amaç, yazılan kodda gereksiz şekilde birbirini engelleme veya bekletme durumu olmaksızın, farklı işlemleri paralel bir şekilde yürütebilmektir.
- Fakat amaç aynı olsa da her iki kavram ve çalışma şekilleri birbirinden farklıdır.
- Bu farklar en temel ve yalın haliyle şu şekilde bahsedilebilir:
Senkron Asenkron Programlama’da
- Asenkron Programlama, kod akış sürecinde işlemlerin birbirinden bağımsız olarak çalıştığı bir modeldir. Bir işlemin başlaması için farklı bir işlemin bitmesini beklemeye lüzum yoktur.
- Yukarıda da bahsedildiği gibi, bir veya birden fazla threadle asenkron kod yazılabilir. Ana odak, kodun çalıştığı threadi bloklamadan çalışabilmesini sağlamaktır.
- Bellek kullanımı açısından düşük bellek kullanımı söz konusudur.
MultiThread Programlama’da
- MultiThread programlama ise bir kod akışının birden fazla thread üzerinde seyrettiği bir modeldir.
- Doğrudan thread bazlı bir yaklaşım mevcuttur.
- Her bir thread belirli bir bellek alanına ihtiyaç duyacağı için, bellek kullanımı açısından daha maliyetlidir.
Bir örnek üzerinden konuyu özetleyecek olursak, tek bir şefin olduğu bir restoranda verilen siparişler birbirlerini beklemeksizin pişirilirken her bir müşterinin birbirinden bağımsız olması Asenkron programlamaya örnekken, restoranda birden fazla şefin olduğu durumda her bir şefin farklı siparişlerle ilgilenmesi de Multithread programlamaya örnektir. Ve her şef kendi aralarında aynı mutfak ekipmanlarını paylaşabilmektedirler. Burada her iki örnekte de aşçılar thread’lere karşılık gelmektedir.
Ne zaman Asenkron, Ne zaman MultiThread ?
Asenkron ve Multithread programlamanın her ikisi de aynı amaca hizmet etse de, ihtiyaca göre bazen ikisi arasında tercih yapmak gerekmektedir.
Bekleme Zamanlarının İyileşmesi Açısından
- Asenkron Programlama, uygulamanızda uzun süren dosya okuma/yazma, ağ çağrıları vs. gibi I/O operasyonları varsa, asenkron programlama bu bekleme sürelerini etkin bir şekilde yönetmenize yardımcı olabilir.
- Multithreading, uygulamanızda CPU açısından yoğun işlemler varsa ve bu işlemlerin paralel olarak çalıştırılması performansı artırıyorsa, multithread programlama kullanılabilir.
Eşzamanlılık Gereksinimi Açısından
- Asenkron Programlama, uygulamanız birçok eşzamanlı görev barındıran web uygulaması gibi bir yazılımsa asenkron programlama bu görevleri etkili bir şekilde yönetmenizi sağlayabilir.
- Multithreading, uygulamanız eşzamanlı olarak çalışacak çok sayıda iş parçacığı gerektiriyorsa multithread programlama işinize yarayacaktır.
Güvenlik ve Senkronizasyon Açısından
- Asenkron Programlama ile senkronizasyon sorunlarına dikkat etmek istemiyorsanız ve daha basit bir model istiyorsanız asenkron programlama davranışını sergileyebilirsiniz.
- Multithreading’de Eğer paralel çalışan thread’ler arasında senkronizasyon ve paylaşılan kaynaklara güvenli erişim sorunlarına dikkat etmek zorunda kalmayı da göze alıyorsak, multithread programlama davranışı sergileyebilirsiniz.
Task ve Thread Kavramları
TASK
- Task sınıfı, Task Paralell Library içerisinde yer alan (TPL), paralel programlama ve Asenkron operasyonları yürütmeyi sağlayan C# sınıfıdır.
- Task sınıfı, threadleri .Net tarafından yönetilen bir thread pool’da çalıştırabilmektedir. ve .Net’deki garbage collector gibi mekanizmaların avantajlarından yararlanabilir.
- Task sınıfı, TPL aracılığıyla eş zamanlılık ve paralellik sağlamaktadır. Birden fazla işlemi eş zamanlı olarak yönetir ve paralel olarak çalıştırabilir.
- Task sınıfında, async ve await keword’leri sayesinde oldukça kolaydır. WhenAll ve WhenAny vs. gibi metotlar sayesinde de birden fazla görevin tamamlanmasını beklemek ve bunları yönetmekte süreci pek kolay kılmaktadır.
THREAD
- Thread sınıfı, Task’a nazaran daha düşük seviyede bir abstraction sağlamakta ve doğrudan threadin kendisini oluşturmayı ve yönetmeyi amaçlar. MultiThread programlamanın doğrudan uygulanmasını sağlamaktadır. Projelerde ve uygulamada, Task’a nazaran daha fazla sorumluluk ve dikkat gerektirmektedir.
- Thread sınıfı, thread’i doğrudan işletim sistemi tarafından oluşturulan bir iş parçacığında çalıştırır. Bu, .net dışındaki yönetilmeyen kaynaklara daha fazla maruz kalmayı içerebilmekte ve daha fazla sistem kaynağı tüketme durumu söz konusu olabilmektedir. Bir önceki maddedeki daha fazla sorumluluk ve dikkat gerektirme ifadesinin kastettiği noktalardan bir tanesi budur.
- Thread sınıfı, genellikle doğrudan iş parçacığı oluşturarak paralel işlemleri gerçekleştirmeyi amaçlar.
- Thread sınıfı, thread’in tamamlanmasını beklemek için genellikle daha düşük seviyeli bir bekleme mekanizması olan join metodunu kullanır.
Özetle, Task sınıfı Thread’e nazaran daha modern’dir ve kullanım açısından da daha kolay bir yaklaşım sağlamaktadır. Ancak Thread sınıfı her ne kadar kullanım açısından daha sorumluluk ve dikkat gerektiren bir yapıya sahip olsa da Task sınıfına göre daha fazla kontrol edilebilir ve esnektir. Senaryo ve ihtiyaca göre her iki sınıf ve yaklaşımdan da istifade etmek gerekir.
C# programlama dili doğası senkrondur. Yani yazılan, çağrılan kod bloklarını sırasıyla çalıştıracaktır.