Rakinimo aklavietė

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.
Peršokti į: navigaciją, paiešką
 NoFonti.svg  Šiam straipsniui ar jo daliai trūksta šaltinių ar nuorodų į juos.
Jūs galite padėti Vikipedijai įrašydami tinkamas išnašas ar nuorodas į šaltinius.
 Noia 64 apps xeyes.png  Šį straipsnį gali būti gana sunku suprasti be papildomų informacijos šaltinių.
Galite perrašyti dėstomus teiginius plačiau ir suteikiant daugiau konteksto.

Rakinimo aklavietė (angl. deadlock) – padėtis, kuomet dvi gijos abi laukia viena kitos atliekant kokį nors veiksmą. Kadangi abi gijos yra laukimo režime, jokie laukiami veiksmai neatliekami ir ši padėtis gali trukti neribotą laiką.

Tai panašu į du piešėjus, kurie piešia vienu pieštuku ant vieno popieriaus lapo ir gali perduoti piešimo įrankius tik nupiešę savo dalį[reikalingas šaltinis]. Jei atsitinka taip, jog vienas žaidėjas turi tik pieštuką, o kitas tik popierių, nė vienas iš jų negali atlikti piešimo veiksmo ir atiduoti turimo piešimo įrankio. Taigi, nekeičiant žaidimo taisyklių, tokia padėtis gali trukti amžinai.

Rakinimo aklavietei pasireikšti būtinos šios sąlygos

  • Rakinamas resursas visada priklauso tik vienai gijai.
  • Gija, jau turinti rakinamų resursų, gali prašyti jų daugiau (turėti tik vieną resursą ir su juo apsieiti yra saugu).
  • Negalima resurso iš gijos atimti „jėga“ – resursą atlaisvinti kitiems gali tik jo dabartinis savininkas.
  • Dvi gijos gali tuo pat metu laukti resursų, kurios abiem atvejais turi antroji pusė.

Šias sąlygas 1971 m. suformulavo E. G. Coffman.

Programa, kurioje pasireiškia ši klaida, gali netikėtai apskritai sustoti. Kas ir kodėl atsitiko, paprastai nustatyti būna labai sunku. Kai kurios vykdymo sistemos tokiu atveju į sutartą klaviatūros klavišų kombinaciją (java sistemoje ctrl - break) atsako išvardindamos visas tuo metu kažko laukiančias gijas.

Vengimo būdai[taisyti | redaguoti kodą]

  • Panaikinti išimtinės resurso nuosavybės būtinybę ir kurti jį tokį, jog skirtingos gijos galėtų juo dalintis. Tai paprastas ir akivaizdus sprendimas, deja, ne visada įmanomas.
  • Reikalauti, jog gija galėtų gauti reikalingų resursų rinkinį tik tada, jei ji šiuo metu nekontroliuoja jokių rakinamų resursų. Jei vėliau reikalingi kiti ar daugiau resursų, prieš to prašant turi būti grąžinti visi turimieji.
  • Sukurti gijų hierarchiją, jog „aukštesnės kastos“ gija visada galėtų „jėga atimti“ jai reikalingą resursą. Tai irgi dažnai sunku įvykdyti, nes ne visada aišku kokie tokiu atveju turėtų būti vėlesni „žemesniosios“ gijos atliekami veiksmai. Be to, klaidų gali būti ir „aukštesniosios gijos“ vykdomame algoritme. Jei gijų hierarchiją visgi mėginama kurti, kai kada tie hierarchiniai lygmenys priskiriami tiesiog atsitiktine tvarka.

Gyvoji aklavietė[taisyti | redaguoti kodą]

Gyvoji aklavietė (angl live deadlock) susidaro kuomet dvi gijos bando imtis kokių nors veiksmų problemai spręsti, tačiau šie veiksmai pakartotinai ir vėl sukuria aklavietę, nes abiejų pusių atliekami vienu metu. Tai analogiška gyvenimo situacijai, kuomet, siaurame koridoriuje susitikę žmonės gali abu vienu metu pasitraukti kairėn, po to abu vienu metu dešinėn ir vėliau abu vienu metu sustoti vietoje, laukdami kitos pusės pasitraukiant. Gyvosios aklavietės vengiama programuojant, kur reikia, atsitiktinius vengimo veiksmus (nagrinėjamame pavyzdyje, kaip ir realioje visuomenėje, abiejų pusių pasitraukimo kryptis turi būti atsitiktinė).