Junior
Ի՞նչ է deadlock-ը։
sobes.tech AI
Պատասխան AI-ից
Դեդլոկ (Deadlock) — դա այն վիճակն է, երբ երկու կամ ավելի հոսքեր կամ պրոցեսներ բլոկվում են, սպասելով միմյանց, որպեսզի շարունակեն գործարկումը։ Դա տեղի է ունենում, երբ յուրաքանչյուր հոսք ունի ռեսուրս, որը անհրաժեշտ է մյուս հոսքին, և ինքն է սպասում ռեսուրսի ազատմանը, որը պահվում է մյուս հոսքի կողմից։
Չորս պայման, որոնք անհրաժեշտ են դեդլոկի առաջացման համար (Կոֆմանի պայմաններ՝ Conditions of Coffman):
- Միմյանց բացառություն (Mutual Exclusion): Ռեսուրսը չի կարող միաժամանակ օգտագործվել մի քանի պրոցեսների կողմից։
- Հավակնություն և սպասում (Hold and Wait): Հոսք, որը արդեն ունի առնվազն մեկ ռեսուրս, սպասում է լրացուցիչ ռեսուրսների, որոնք ներկայումս զբաղված են այլ հոսքերի կողմից։
- Անհրաժեշտության բացակայություն (No Preemption): Ռեսուրսները չեն կարող ուժեղապես վերցվել հոսքից։ Դրանք կարող են միայն ինքնակամ ազատվել այն հոսքի կողմից, որը դրանց տիրապետում է։
- Շրջանաձև սպասում (Circular Wait): Կան ցիկլային սպասումներ երկու կամ ավելի հոսքերի միջև։ Օրինակ, Հոսք A սպասում է ռեսուրսի, որը պահվում է Հոսք B-ի կողմից, որը սպասում է ռեսուրսի, որը պահվում է Հոսք C-ի կողմից, որը սպասում է ռեսուրսի, որը պահվում է Հոսք A-ի կողմից։
iOS մշակման ժամանակ դեդլոկները հաճախ առաջանում ենConcurrency (մշակող հոսքերի) հետ աշխատելիս, օրինակ՝ սխալ օգտագործման դեպքում GCD (Grand Central Dispatch) կամ Operation Queues:
- Փորձը սինխրոն կերպով կատարել կոդի բլոկը այն հերթում, որտեղ արդեն գտնվում է ընթացիկ հոսքը (օրինակ,
syncկանչըmainհերթում գլխավոր հոսքից): - Երկու հոսքեր փորձում են բռնել երկու տարբեր մուտքեր կամ սեմաֆորներ տարբեր կարգով:
Նմուշ՝ պարզ դեդլոկ GCD-ի օգտագործմամբ:
func deadlockExample() {
// Գլխավոր հերթ
let mainQueue = DispatchQueue.main
// Սինխրոն կերպով իրականացնել բլոկը գլխավոր հերթում գլխավոր հոսքից
// Գլխավոր հոսքը սպասում է բլոկի ավարտին,
// իսկ բլոկը չի կարող սկսվել, քանի որ գլխավոր հոսքը զբաղված է սպասելով:
mainQueue.sync {
print("Այս տողը երբեք չի հասնի։")
}
}