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:
- Əks-əks istisna (Mutual Exclusion): Resurs eyni zamanda bir neçə proses tərəfindən istifadə oluna bilməz.
- 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.
- 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.
- 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ımainnö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.")
}
}