Sobes.tech
Junior

Deadlock nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Deadlock (Ölümlü kilitlenme) vəziyyəti odur ki, iki və ya daha çox axın və ya proses bir-birini bloklayır və davam etmək üçün bir-birini gözləyir. Bu, hər bir axının digərinin ehtiyacı olan resursa sahib olduğu və həmin resursun azad olunmasını gözlədiyi zaman baş verir.

Deadlock-un (Coffman şərtləri) yaranması üçün lazım olan dörd şərt:

  1. Əks-əks istisna (Mutual Exclusion): Resurs eyni zamanda bir neçə proses tərəfindən istifadə oluna bilməz.
  2. Qoruma və gözləmə (Hold and Wait): Artıq ən azı bir resursa sahib olan axın, digər axınlar tərəfindən tutulmuş əlavə resursları almağı gözləyir.
  3. Preemption yox (No Preemption): Resurslar zorla bir axımdan alına bilməz. Yalnız, onları tutan axın tərəfindən könüllü olaraq azad edilə bilər.
  4. Dairəvi gözləmə (Circular Wait): İki və ya daha çox axın arasında dövr edən gözləmə mövcuddur. Məsələn, A axını B tərəfindən tutulmuş resursu gözləyir, B isə C tərəfindən tutulmuş resursu, C isə A tərəfindən tutulmuş resursu gözləyir.

iOS inkişafında, deadlock-lar tez-tez GCD (Grand Central Dispatch) və ya Operation Queues ilə düzgün istifadə edilmədikdə baş verir:

  • Mövcud olan bir axımda, artıq mövcud olan bir növbədə sinxron kod blokunu icra etməyə cəhd etmək (məsələn, sync çağırışını main növbəsində əsas axımdan etmək).
  • İki axın, iki lock və ya semaforu fərqli ardıcıllıqla əldə etməyə çalışır.

GCD istifadə edilərək sadə deadlock nümunəsi:

func deadlockExample() {
    // Əsas növbə
    let mainQueue = DispatchQueue.main

    // Əsas axımdan, əsas növbədə sinxron blok icra etmək
    // Əsas axın, blokun tamamlanmasını gözləyir,
    // və blok, çünki əsas axın məşğul olduğu üçün icra edilə bilməz.
    mainQueue.sync {
        print("Bu sətir heç vaxt çatmayacaq.")
    }
}