Concurrency Modelleri: Process-based Concurrency vs. Thread-based Concurrency

Böyle bir görselle yazıya girmek istemezdim ama düzgün bir çizim ya da grafik bulamadım. Siz dua edin Victoria’s Secret modelleri koymadım buraya.
Concurrent programlama yaparken, bazı önemli yaklaşımlar kullanılır. Bu yazıda adı geçmeyenlerden fazlası da vardır elbette. Bunları avantaj ve dezavantaj başlıklarıyla farklı yazılarda vermeye çalışacağım.
Concurrent Modeller Nelerdir?
Birçok model olmasına rağmen şu başlıklar altında inceleyebiliriz
- Process-based concurrency
- Thread-based concurrency
- Event-based concurrency
- Dataflow concurrency
- Actor model
- Transactional memory
- Fork-join model
Daha fazlasını da internet üzerinden bulabiliriz. Şimdi ana başlıklarımızı oluşturalım.
Not: İngilizce terimler kullanmaya özen gösterdim. “Dağıtık Çalıştırma, Yürütme” gibi kavramlar garip geliyor.
Process-based Concurrency Nedir?
Process-based concurrency yaklaşımında processler eşzamanlı şekilde çalışırken, birbirleri arasında da iletişim kurulur. Bu yaklaşımın avantajları ve dezavantajları ise şöyledir;
Avantajları
**Isolation(İzolasyon)😗* Her process, kendi bellek alanına sahip olduğu için birbirinden bağımsız çalışabilir. Bu, her process için ayrı bir environment sağlayarak, bir process’teki problemin diğer process’leri etkilemesini engeller. Bu nedenle izolasyon anlamında bir faydayı burada gösterebiliriz.
**Distributed Execution(Dağıtık Yürütme)😗* Processler farklı işlemcilerde veya farklı bilgisayarlarda çalıştırılabilir. Bu, yüksek performanslı sistemler oluşturmayı ve iş yükünün dağıtılabilir olmasını sağlar.
**Parallelism(Paralellik)😗* Process’ler concurrent olarak çalıştırıldığında, paralel processing yapılabilir. Bu, tasklarin hızlı bir şekilde tamamlanmasını sağlar ve performansı artırır. Eğer her şey doğru tasarlanır ve process’ler, işlemci kaynaklarına eşit olarak dağıtılabilir ise, paralelizm maksimum seviyeye ulaşabilir.
Dezavantajları / Zorlukları
- **Resource Sharing(Kaynak Paylaşımı)😗* Processler arasında resource sharing ve iletişim karmaşık ve zaman alıcı olabilir. Bu sanırım en büyük sorunlardan birisi.
- Yüksek Bellek Kullanımı: Her process, kendi bellek alanı ve birbirinden bağımsız bir kaynak ile çalışır. Bu izolasyon açısından bir avantaj olabilirken, kaynak tüketimi konusunda ise yüksek maliyetlere sebebiyet verebilir. (Bunu kim ister ya 😛)
- Process Oluşturma Maliyetleri: Process oluşturma ve sonlandırma işlemi, işlemci ve sistem kaynaklarını kullanır, bu da performans üzerinde olumsuz bir etkiye sahip olabilir.
- **Process Blocking 😗* Processler arası veri paylaşımı ve senkronizasyon ihtiyacı duyulduğunda, process’lerin birbirlerini beklemesi ve senkronize olması gerekebilir. Bu durumda, process-based concurrency’nin performans avantajını ortadan kaldıran “process blocking” sorunu ortaya çıkabilir. Yani bir işin, başka bir iş nedeniyle bekliyor olması belki kısa süreli işlemlerde sorun olmazken, gerçekten ağır sayılabilecek işlemlerde ciddi sorun olabilir.
Thread-based Concurrency Nedir?
Thread-based concurrency, birden fazla işlemi concurrent olarak çalıştırmak için kullanılan bir yaklaşımdır. Bu yaklaşımda, processler farklı thread’ler tarafından kendi lifetime’ları içerisinde çalıştırılır.
Avantajları
- Concurrent Process’ler: Thread-based concurrency, birden fazla işlemin aynı anda gerçekleştirilmesine olanak tanır. Bu sayede, zaman kazanmak ve işlemleri daha hızlı tamamlamak mümkün olur. Tabii her gülün bir de dikeni vardır 😛 (Söz böyle miydi?)
- Resource Sharing: Thread’ler, bir program içindeki farklı kod bloklarını concurrent olarak çalıştırabilir. Sallıyorum fatura oluşturma, mail gönderme, sms gönderme vs. Bu tarz işlemler nedeniyle, programın ilgili noktasında gecikmeler yaşanabilir. Ancak threadler sayesinde bu gecikmeler yazılımdaki diğer önemli bölümlerde hissedilmez. Thread’ler aynı zamanda, aynı kaynaklara erişen birden fazla process’i koordine etmek için de kullanılabilir.
- Kaynak Kullanım Optimizasyonu: Thread’ler, işlemcinin farklı çekirdeklerinde eşzamanlı olarak çalıştırılabilir, bu sayede işlemci kaynakları daha optimize bir şekilde kullanılabilir.
Dezavantajları / Zorlukları
- Senkronizasyon Sorunları: Thread’ler arasındaki senkronizasyon ve veri bütünlüğü problemleri gibi konular, doğru bir şekilde ele alınmazsa hatalara neden olabilir. Bu nedenle, thread’lerin kullanımı geliştirme aşamasında zorluk yaratabilir. Ama korkmayın. Bu tarz sorunlar hep oluyordur 😛
- Performans Problemleri: Çok sayıda thread’in bir programda kullanılması, sistem kaynaklarının tükenmesine ve performans sorunlarına yol açabilir. Bu nedenle, thread sayısının doğru bir şekilde ayarlanması önemlidir. (Bu tarz bir sorun geçmişte başıma geldi 😕 Cahiliye dönemi işte 😛).
- Yüksek Bellek Tüketimi: Bir üst maddenin devamı niteliğinde ancak, her bir thread, ekstra bellek kullanımına neden olur. Bu nedenle, çok sayıda thread kullanımı, sistem kaynaklarına daha fazla yük bindirebilir.
- Deadlock İhtimali: Birden fazla thread’in aynı kaynaklara erişmesi ve bu kaynaklarda hala aktif şekilde çalışması nedeniyle sistemde deadlock oluşabilir. Bu nedenle, thread’ler arasındaki kaynak paylaşımı dikkatli bir şekilde yönetilmelidir. Eğer deadlock yaşarsanız, aslında yazılımınızda aşağıdaki gibi bir şey olur

- Debugging Konusunda Yaşanan Zorluklar: Thread-based concurrency yaklaşımında debugging süreçleri bir tık acılı olabilir. Çünkü birden fazla thread’in aynı anda çalışması nedeniyle, programdaki hataların tespit edilmesi ve çözülmesi daha zor olabilir. Tabii bu çalışan thread’lerin de karmaşıklığına göre değişkenlik gösterebilir
- Karmaşık Sistemlerin Ortaya Çıkması: Thread-based concurrency yaklaşımında, çok sayıda thread’in birbirleriyle iletişim halinde olmasından kaynaklı sistem içerisinde bir hayli karmaşa ortaya çıkabilir.
- Güvenlik Problemleri: Aslında yukarıdaki sorunlar bu maddeyi açıklıyor ama yine de tekrar yazayım dedim. Birden fazla thread’in aynı anda çalışması, güvenlik sorunlarının ortaya çıkmasına neden olabilir. Mesela, bir thread’in çalışması sırasında bir diğer thread, aynı bellek alanına erişerek veri okuyabilir veya değiştirebilir. Bir race-condition problemi ortaya çıkabilir.
Okuduğunuz için teşekkür ederim 😛 Hatalı, eksik bir noktaya sahipsem lütfen belirtin ❤