Sobes.tech
Junior

Deadlock nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Deadlock (Ölümlü kilitlenme) durumu, iki veya daha fazla akışın veya işlemin birbirlerini bekleyerek engellendiği bir durumdur. Her akışın diğerinin ihtiyacı olan bir kaynağa sahip olduğu ve bu kaydın serbest bırakılmasını beklediği zaman oluşur.

Bir deadlock'un (Coffman koşulları) oluşması için gereken dört koşul:

  1. Karşılıklı dışlama (Mutual Exclusion): Kaynak, aynı anda birden fazla işlem tarafından kullanılamaz.
  2. Tutma ve bekleme (Hold and Wait): Zaten en az bir kaynağa sahip olan bir akış, diğer akışlar tarafından tutulmakta olan ek kaynakları almak için bekler.
  3. Preemption yok (No Preemption): Kaynaklar, zorla bir akıştan alınamaz. Sadece, kaynağı elinde tutan akış tarafından gönüllü olarak serbest bırakılabilir.
  4. Dairesel bekleme (Circular Wait): İki veya daha fazla akış arasında döngüsel bir bekleme durumu vardır. Örneğin, A akışı, B tarafından tutulan bir kaynağı bekler, B ise C tarafından tutulan bir kaynağı, C ise A tarafından tutulan bir kaynağı bekler.

iOS geliştirmede, deadlock'lar genellikle eşzamanlılık ile çalışırken ortaya çıkar, örneğin GCD (Grand Central Dispatch) veya İşlem Kuyrukları yanlış kullanıldığında:

  • Aynı anda çalışan ana akışta, zaten mevcut olan bir kuyrukta senkron blok çalıştırmaya çalışmak (örneğin, ana akıştan sync çağrısı yapmak).
  • İki akış, farklı sıralarda iki kilidi veya semaforu almaya çalışır.

GCD kullanılarak yapılan basit bir deadlock örneği:

func deadlockExample() {
    // Ana kuyruk
    let mainQueue = DispatchQueue.main

    // Ana akıştan, ana kuyrukta senkron bir blok çalıştırma
    // Ana akış, bloğun tamamlanmasını bekler,
    // ve blok, ana akış meşgul olduğu için çalışamaz.
    mainQueue.sync {
        print("Bu satır asla ulaşmaz.")
    }
}