Sobes.tech
Junior

Ի՞նչ է deadlock-ը։

sobes.tech AI

Պատասխան AI-ից

Դեդլոկ (Deadlock) — դա այն վիճակն է, երբ երկու կամ ավելի հոսքեր կամ պրոցեսներ բլոկվում են, սպասելով միմյանց, որպեսզի շարունակեն գործարկումը։ Դա տեղի է ունենում, երբ յուրաքանչյուր հոսք ունի ռեսուրս, որը անհրաժեշտ է մյուս հոսքին, և ինքն է սպասում ռեսուրսի ազատմանը, որը պահվում է մյուս հոսքի կողմից։

Չորս պայման, որոնք անհրաժեշտ են դեդլոկի առաջացման համար (Կոֆմանի պայմաններ՝ Conditions of Coffman):

  1. Միմյանց բացառություն (Mutual Exclusion): Ռեսուրսը չի կարող միաժամանակ օգտագործվել մի քանի պրոցեսների կողմից։
  2. Հավակնություն և սպասում (Hold and Wait): Հոսք, որը արդեն ունի առնվազն մեկ ռեսուրս, սպասում է լրացուցիչ ռեսուրսների, որոնք ներկայումս զբաղված են այլ հոսքերի կողմից։
  3. Անհրաժեշտության բացակայություն (No Preemption): Ռեսուրսները չեն կարող ուժեղապես վերցվել հոսքից։ Դրանք կարող են միայն ինքնակամ ազատվել այն հոսքի կողմից, որը դրանց տիրապետում է։
  4. Շրջանաձև սպասում (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("Այս տողը երբեք չի հասնի։")
    }
}