Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Pereiti prie turinio

Rietuvė

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.
Rietuvės veikimo iliustracija

Rietuvė arba dėklas (angl. stack) – duomenų struktūra, veikianti pagal LIFO principą: „paskutinis į maišą, pirmas iš maišo“ (angl. last in first out).[1] Kitaip tariant, iš rietuvės visada paimamas paskutinis į jį padėtas elementas, po to – priešpaskutinis ir t. t. Tai primena plytas, kraunamas vienas ant kitų stulpu.

Rietuvė paremia dvi pagrindines operacijas – push (padėti) ir pop (pasiimti).

Aparatinė realizacija

[redaguoti | redaguoti vikitekstą]

Daugelis procesorių (ypač – CISC architektūros) paremia rietuvės veikimą aparatiškai. Tokiuose procesoriuose būna vienas ar keli už rietuvę atsakingi registrai (Intel 8080 – SP, Intel x86 – SP ir ESP), rodantys į rietuvės pabaigą. Procesoriaus vykdoma Pop operacija automatiškai perkelia į nurodytą registrą paskutinį rietuvės elementą ir sumažina rietuvės registro reikšmę. Push operacija rietuvės registro reikšmę padidina, bei nurodyto registro reikšmę perkelia į rietuvę. Asembleriu tokia operacijų seka gali būti aprašyta maždaug taip:

 PUSH AX ; ; Atitiktų žemiau komentaruose esančią seką:
         ; ADD SP, 2 ; (Keičiama rietuvės rodyklė, AX dydis baitais)
         ; MOV WORD PTR [SP], AX ; Registro reikšmė perkeliama į rietuvę
 POP AX  ; ; Atitiktų žemiau komentaruose esančią seką:
         ; MOV AX, WORD PTR [SP] ; Rietuvės viršūnė perkeliama į registrą
         ; SUB SP, 2 ; (Keičiama reituvės rodyklė, AX dydis baitais)

Sukompiliuotame Intel x86 procesoriui skirtos programos kode yra rietuvės segmentas, kuriame ir laikomi į rietuvę dedami elementai.

Jei kodas generuojamas kompiliatoriaus, kviečiamų funkcijų argumentai programiniame kode dažniausiai perduodami per rietuvę (asembleriu programuojantis žmogus parametrus dažniausiai perduoda registruose).

Lokalūs kintamieji taip pat dažnai saugomi rietuvėje.

Pirmieji masiškai gaminti mikroprocesoriai turėjo vidinę rietuvinę atmintį. Pavyzdžiui, Intel 4004 turėjo trijų lygių paprogramių rietuvę grįžimo adresui atsiminti, kuri Intel 4040 buvo padidinta iki aštuonių lygių. Vidinė rietuvė patogi itin paprastuose kompiuteriuose, kur išorinės operatyvinės atmintinės gali ir nebūti. Intel 8080 vis dar turėjo retai naudotą galimybę prijungti net iki 64 Kb talpos atskirai adresuojamą rietuvės atmintį. Daugelyje šiuolaikinių kompiuterių rietuvė yra pagrindinės atmintinės dalis.

Programinė realizacija

[redaguoti | redaguoti vikitekstą]

Rietuvę gali būti realizuojama tiesinio sąrašo pagrindu arba panaudojant masyvus. Masyvo pagalba realizuota rietuvė veikia sparčiau ir nereikalauja papildomos atminties sąrašo duomenims laikyti. Ji imituoja aparatinę realizaciją, turėdama rietuvės rodyklę atitinkantį sveikojo tipo kintamąjį, rodantį į pirmą laisvą elementą virš rietuvės viršūnes. Reikšmės padėjimo operacija užrašoma kaip

 rietuvė[sp] = reikšmė
 sp = sp + 1

Reikšmės paėmimo operacija užrašoma kaip

 sp = sp - 1
 reikšmė = rietuvė[sp]

čia rietuvė – rietuvės turinį saugantis masyvas, sp – rietuvės rodyklės kintamais (pradinė vetrė lygi nuliui).

Tokia rietuvė paprastai turi ribotą iš anksto žinomą talpą (masyvo ilgį), nebent jį viršijus visas turinys būtų automatiškai kopijuojamas į kitą (didesnį) masyvą.

Nuorodas naudojančio tiesinio sąrašo pagrindu galima sukurti tik kompiuterio atminties ribojamą dinamiškai augančią rietuvę, tačiau duomenų laikymas joje mažiau efektyvus.

Rietuvės naudojimo sritys

[redaguoti | redaguoti vikitekstą]

Rietuvė ir paprogramiai

[redaguoti | redaguoti vikitekstą]

Kviečiant įvairių programos vietų bendrai naudojamą paskirties kodo fragmentą (pavyzdžiui, simbolio išvedimo į ekraną paprogramį), taip pat aptarnaujant pertraukimus, svarbu neužmiršti šiuo metu vykdomos komandų sekos adreso, kad užbaigus paprogramį būtų galima grįžti atgal. Grįžimo adresas beveik visada išsaugomas rietuvėje. Dažnai pasitaiko, jog vykdomas paprogramis savo ruožtu kviečia kitas paprogramius. Tuomet įsiminimo operacija kartojama. Baigiant paprogramį, rietuvės viršūnėje visada bus reikalingas grįžimo adresas, nes jis buvo ten padėtas paskutinis.

Rietuvė ir būsenos išsaugojimas

[redaguoti | redaguoti vikitekstą]

Rietuvėje gali būti išsaugomas ne tik ankstesnis vykdymo adresas, bet ir įvairi kita su ankstensniu vykdymu susijusi informacija (registrų bei vėliavėlių reikšmės, kai kada ir informacija apie įvedimo ar išvedimo įrenginių būseną). Kviečiant vieną paprogramį iš kito, būsena gali būti išsaugota daugelį kartų. Rietuvė tinka, nes paskutinė išsaugota būsena turi būti atstatyta pirmoji.

Rietuvė ir lokalūs kintamieji

[redaguoti | redaguoti vikitekstą]

Jei paprogramiui reikia atminties lokaliems kintamiesiems saugoti, jai taip pat patogu išskirti rietuvę, pradedant nuo dabartinės rietuvės rodyklės reikšmės (rodyklė pastumiama tiek, jog rodytų į laisvą sritį greta užimtos atminties ribos). Rietuvė tam patogi todėl, jog paskutinis pradėtas vykdyti paprogramis pirmasis ir pabaigiamas (taigi paskutinė išskirta lokialių kintamųjų sritis pirmoji ir atlaisvinama). Rietuvėje išskirtai atminties sričiai naudoti daugelis procesorių turi komandas ne tik rietuvės viršūnei, bet ir žinomu atstumu žemiau jos esantiems duomenims pasiekti.

  1. dėklasV. Dagienė, G. Grigas, T. Jevsikova. Enciklopedinis kompiuterijos žodynas. 4-as leidimas. Vilnius: VU MII, 2014 // EKŽ, 2021, nuolat atnaujinamas. ISBN 978-9986-680-52-9.