Junior
Deadlock nima?
sobes.tech AI
AIdan javob
Deadlock (Oʻzaro boʻlish) — bu holat bo‘lib, unda ikki yoki undan ortiq oqimlar yoki jarayonlar bir-birini kutib, bloklanadi. Bu, har bir oqim boshqa oqimga kerak bo‘lgan resursga egalik qilgan va bu resursni bo‘shatishni kutayotgan paytda yuzaga keladi.
Deadlock (Coffman shartlari) yuzaga kelishi uchun to‘rt shart:
- O‘zaro chiqarish (Mutual Exclusion): Resurs bir vaqtning o‘zida bir nechta jarayon tomonidan ishlatilmasligi kerak.
- Ushlab turish va kutish (Hold and Wait): Allaqachon kamida bitta resursga ega bo‘lgan oqim, boshqa oqimlar tomonidan egallangan qo‘shimcha resurslarni olish uchun kutadi.
- Preemption yo‘q (No Preemption): Resurslar majburlab olib tashlanishi mumkin emas. Ular faqat resursni egallagan oqim tomonidan ixtiyoriy ravishda bo‘shatilishi mumkin.
- Aylana kutish (Circular Wait): Ikki yoki undan ortiq oqimlar o‘rtasida siklik kutish mavjud. Masalan, A oqimi B tomonidan egallangan resursni kutadi, B esa C tomonidan egallangan resursni kutadi, C esa A tomonidan egallangan resursni kutadi.
iOS dasturlashda deadlocklar ko‘pincha, GCD (Grand Central Dispatch) yoki Operation Queues bilan noto‘g‘ri ishlash natijasida yuzaga keladi:
- Hozirda mavjud bo‘lgan oqimda kod blokini sinxron tarzda bajarishga urinish (masalan,
syncchaqiruvimainnavbatida asosiy oqimdan). - Ikki oqim, ikki turli lock yoki semaforni turli tartibda egallashga harakat qiladi.
GCD yordamida oddiy deadlock misoli:
func deadlockExample() {
// Asosiy navbat
let mainQueue = DispatchQueue.main
// Asosiy oqimdan, asosiy navbatda sinxron blokni bajarish
// Asosiy oqim, blok tugashini kutadi,
// va blok, chunki asosiy oqim band, bajarilmaydi.
mainQueue.sync {
print("Bu satr hech qachon bajarilmaydi.")
}
}