Deadlock nədir?
Deadlock (çıxılmaz vəziyyət, qarşılıqlı bloklanma) — iki və ya daha çox prosesin (və ya tranzaksiyanın) bir-birinin tutduğu resursu gözlədiyi və nəticədə heç birinin işini davam etdirə bilmədiyi vəziyyətdir. Sistem sanki “donur”: hər proses digərinin resursu azad etməsini gözləyir, amma heç biri bunu etmir.
Deadlock əməliyyat sistemlərində, çox axınlı (multi-threaded) proqramlarda və verilənlər bazalarında baş verə bilər.
Gündəlik həyatdan nümunə
Təsəvvür edin ki, dar bir körpüdə iki maşın qarşı-qarşıya gəlib. Körpü yalnız bir maşının keçməsinə imkan verir. Hər sürücü digərinin geri çəkilməsini gözləyir, amma heç biri geri çəkilmir. Nəticədə hər iki maşın sonsuza qədər yerində qalır. Bu, deadlock-dur.
Deadlock-un dörd şərti (Coffman şərtləri)
Deadlock-un yaranması üçün dörd şərt eyni anda ödənməlidir:
- Qarşılıqlı istisna (Mutual Exclusion): Resursdan eyni anda yalnız bir proses istifadə edə bilər. Körpü nümunəsində — körpüdən yalnız bir maşın keçə bilir.
- Tutmaq və gözləmək (Hold and Wait): Proses artıq əldə etdiyi resursu saxlayır və eyni zamanda başqa bir resursu gözləyir.
- Zorla geri alınmama (No Preemption): Resursu prosesdən zorla almaq olmaz — proses onu yalnız özü azad edə bilər.
- Dairəvi gözləmə (Circular Wait): Proseslər qapalı bir zəncir yaradır: hər biri növbətinin tutduğu resursu gözləyir.
Bu şərtlərdən ən azı biri pozularsa, deadlock baş verə bilməz. Deadlock-un qarşısını alma üsullarının hamısı da məhz bu prinsipə əsaslanır.
Sadə nümunə
- Proses A — Resurs 1-i tutub və Resurs 2-ni gözləyir.
- Proses B — Resurs 2-ni tutub və Resurs 1-i gözləyir.
Nə A, nə də B irəliləyə bilər, çünki hər biri digərini gözləyir.
Verilənlər bazasında deadlock
Bank sistemində iki köçürmə eyni vaxtda baş verir:
- Tranzaksiya 1: Əlinin hesabını bloklayır, sonra Aytənin hesabına yazmaq istəyir.
- Tranzaksiya 2: Aytənin hesabını bloklayır, sonra Əlinin hesabına yazmaq istəyir.
Hər tranzaksiya digərinin blokladığı sətri gözləyir. MySQL, PostgreSQL kimi müasir verilənlər bazaları belə vəziyyəti avtomatik aşkarlayır və tranzaksiyalardan birini ləğv edir (“deadlock qurbanı” seçir). Digər tranzaksiya isə işini davam etdirir. Ləğv olunan tranzaksiya ACID prinsiplərinə uyğun olaraq tam geri qaytarılır, ona görə məlumatlar zədələnmir. Proqram isə həmin əməliyyatı sadəcə yenidən icra etməlidir.
Klassik məsələ: “Filosofların naharı”
Deadlock-u izah edən ən məşhur nümunəni hollandiyalı alim Edsger Dijkstra təklif edib. Beş filosof dəyirmi masa arxasında oturur, hər ikisinin arasında bir çəngəl var. Yemək üçün hər filosofa iki çəngəl lazımdır. Əgər hamı eyni anda sol çəngəlini götürsə, hər kəs sağ çəngəli gözləyəcək və heç kim yemək yeyə bilməyəcək.
Deadlock-la mübarizə üsulları
1. Qarşısını almaq (Prevention) — dörd şərtdən birini pozmaq:
- Resurslara sabit ardıcıllıqla müraciət: Bütün proseslər resursları eyni sırayla tələb edərsə, dairəvi gözləmə yaranmır. Bank nümunəsində: tranzaksiyalar hesabları həmişə, məsələn, hesab nömrəsinin artma sırası ilə bloklasa, deadlock baş verməz.
- Bütün resursları birdən tələb etmək: Proses ya lazım olan bütün resursları birdən alır, ya da heç birini almır.
2. Yan keçmək (Avoidance) — sistem hər resurs tələbindən əvvəl bu tələbin təhlükəsiz olub-olmadığını yoxlayır. Bunun ən məşhur nümunəsi Dijkstra-nın “Bankir alqoritmi”dir.
3. Aşkarlamaq və bərpa etmək (Detection and Recovery) — sistem mütəmadi olaraq proseslər arasındakı gözləmə zəncirlərini yoxlayır. Deadlock aşkarlanarsa, proseslərdən birini dayandırır və ya onun resurslarını geri alır. Verilənlər bazaları məhz bu üsuldan istifadə edir.
4. Vaxt limiti (Timeout) — proses resursu müəyyən müddət ərzində əldə edə bilmirsə, cəhddən imtina edir və tutduğu resursları azad edir.
Nəticə
Deadlock çox axınlı və paralel sistemlərdə ciddi problemlərə səbəb ola bilən vəziyyətdir. Belə xətalar çox vaxt yalnız müəyyən şəraitdə, nadir hallarda baş verdiyi üçün onları tapmaq ən çətin bug-lardan biridir. Ona görə proqramlar və SQL sorğuları layihələndirilərkən deadlock riski əvvəlcədən nəzərə alınmalıdır.
İstəyirsiniz ki, bu biliyi praktikaya keçirib real nəticələr əldə edəsiniz? IT və Kompüter Mühəndisliyi kursumuzla addım-addım öyrənməyə başlayın. Ətraflı məlumat üçün linkə keçid edin: IT və Kompüter Mühəndisliyi kursu
