Thread’lerde Bellek Erişimini Kontrol Etmek: TLS(Thread Locale Storage), Thread Safety, Dead lock, Live lock, Starvation ve Resource Exhaustion

Abdullah IŞIK
3 min readFeb 2, 2024

--

Thread’ler, aynı anda birçok görevi eşzamanlı olarak yürütmemizi sağlayan bir programlama tekniğidir. Bu sayede, görevleri sıralı bir şekilde yerine getirmek yerine, hepsini aynı anda işleyerek performansı artırabiliriz. Ancak, thread’lerde bellek erişimini kontrol etmek oldukça önemlidir. Aksi takdirde, çeşitli sorunlarla karşılaşabiliriz.

TLS (Thread Local Storage)

TLS, her iş parçacığı için ayrı bir bellek alanı oluşturmamızı sağlar. Bu sayede, bir iş parçacığında yapılan değişiklikler diğer iş parçacıklarını etkilemez. TLS, özellikle çok iş parçacıklı uygulamalarda oldukça önemlidir. Aşağıdaki kod örneğinde, TLS kullanarak her iş parçacığı için ayrı bir sayaç tutuyoruz:

ThreadLocal kullanma sebeplerimizden birkaçı Race condition ve deadlock gibi senaryoları engellememize olanak sağlar aynı zaman da performansa da önemli ölçüde katkı sağlar.

Thread Safety

Thread safety, bir iş parçacığının diğer iş parçacıklarının bellek erişimini etkilememesini sağlar. Bu sayede, çok iş parçacıklı uygulamalarda veri tutarlılığını koruyabiliriz. Aşağıdaki kod örneğinde, bir banka hesabını thread safe hale getiriyoruz:

Deadlock

Deadlock, iki veya daha fazla iş parçacığının birbirini bekleyerek sonsuza dek beklediği bir durumdur. Bu durum genellikle, iş parçacıkları birbiriyle kaynaklar için rekabet ettiğinde oluşur. Aşağıdaki kod örneğinde, iki iş parçacığı aynı kaynağı (bir dosya) kullanmaya çalıştığı için deadlock oluşmaktadır:

Örnekte bir IO işlemi gerçekleştiriyoruz ve eğer thread safe yazılmış olmasaydı kod aynı anda dosya okumaya çalışacak ve muhtemelen OS tarafından dosya erişimi engellenmesine izin verilmeyecekti.

Livelock

Livelock, iki veya daha fazla iş parçacığının birbirini sürekli olarak engellediği bir durumdur. Bu durum genellikle, iş parçacıkları birbiriyle kaynaklar için rekabet ettiğinde oluşur. Aşağıdaki kod örneğinde, iki iş parçacığı aynı kaynağı (bir yazıcı) kullanmaya çalıştığı için livelock oluşmaktadır:

Starvation

Starvation, bir iş parçacığının diğer iş parçacıkları tarafından sürekli olarak engellendiği bir durumdur. Bu durum genellikle, bir iş parçacığı diğer iş parçacıklarından daha düşük önceliğe sahip olduğunda oluşur. Aşağıdaki kod örneğinde, iş parçacığı 1, iş parçacığı 2'den daha düşük önceliğe sahip olduğu için starvation oluşmaktadır:

Resource Exhaustion

Resource exhaustion, bir iş parçacığının kaynakları (bellek, işlemci, ağ vb.) tüketmesi ve diğer iş parçacıklarının kaynaklara erişmesini engellemesi durumudur. Aşağıdaki kod örneğinde, iş parçacığı 1 sürekli olarak bellek ayırıyor ve diğer iş parçacıklarının bellek kullanmasını engelliyor:

Umarım Thread safety konusunda yararlı bir içerik olmuştur yorum ve önerilerinizi bekliyorum.

source :

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.native.concurrent/-thread-local/

Google AI studio, 2 February 2024. Source question “<Thread’lerde Bellek Erişimini Kontrol Etmek: TLS(Thrad Locale Storage), Thread Safety, Dead lock, Live lock, Starvation ve Resource Exhaustion)>.” https://makersuite.google.com/app/prompts/

--

--