TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 30. marraskuuta 2009
Sisällys lmä
Sisällys lmä
Seuraava deadline Vaihe E tiistai 1.12. klo 10 koodigenerointi (ilman rekisteriallokaatiota) Vaihe F maanantai 14.12. klo 12 rekisteriallokaatio
Sisällys lmä
Miksi muistinsiivous kääntäjäkurssilla? ja kääntäjä ovat lähes aina toisiinsa kiinteästi kytkettyjä: Kääntäjä joutuu ripottelemaan kohdeohjelmaan muistinsiivouksen tarvitsemaa tietoa ja koodia. Muistinsiivouksen tulee ymmärtää kääntäjän käyttämää oliorakennemallia. Siksi kääntäjänkirjoittaja joutuu yleensä toteuttamaan myös muistinsiivouksen, jos kieli sitä ylipäätään tarvitsee.
Muistinsiivouksen abstraktio illuusio rajattomasta muistista olion synnyttyä se elää loputtomiin ohjelma kuitenkin käyttää useimpia olioita vain rajatun ajan tämän jälkeen oliota ei enää tarvitse esittää muistissa
Terminologiaa Muutin (engl. mutator) on kääntäjän tuottama kohdekielinen ohjelma. Muistinhallinta koostuu varaimesta (engl. allocator), jota muutin kutsuu lisää muistia tarvitesssaa, ja siivoimesta eli roskienkeruusta (engl. garbage collector), joka vapauttaa loppuun käytetyn muistin uudelleen varattavaksi muuntimen selän takana. Muisti eli keko (engl. heap) jaetaan vapaaseen ja varattuun muistiin.
Varatun muistin taksonomia Varattu muisti koostuu tietueista. Tietueet ovat toisistaan riippumattomia ja koostuvat alkioista. Alkio voi olla osoitin tai atomi. Osoitin on joko tyhjä tai sitten viittaus johonkin tietueeseen. Atomi ei viittaa mihinkään tietueeseen; se sisältää dataa (esim. kokonaisluku).
Nimigraafi Muisti voidaan mallittaa suunnattuna graafina, jossa solmuja ovat kaikki joskus varatut tietueet (myös ne, jotka muistinsiivous on myöhemmin vapauttanut) ja kaaria ovat osoittimet. Solmuilla on väri: se on valkoinen, jos sen tarkoittaman tietueen muisti ei ole vapautettu, ja musta, jos sen tarkoittama tietueen muisti on vapautettu uudelleen käytettäväksi. Muistinsiivouksen invariantti: Valkoisesta solmusta ei ole kaarta mustaan.
Juurijoukko Tietty (a priori tiedossa oleva) joukko tietueita muodostaa juurijoukon (engl. root set). Juurijoukko on nimigraafissa aina valkoiseksi värjätty. Tyypillisesti juurijoukon muodostavat ne tietueet, joihin on osoitin staattisesti allokoidusta muistista, rekisteristä tai kutsupinossa olevasta aktivaatiotietueesta. Toisin sanoen, juurijoukon muodostavat globaalit ja lokaalit muuttujat sekä kääntäjän generoimat apumuuttujat.
Muistinsiivouksen ongelmanasettelu On pidettävä huoli, että juurijoukon transitiivinen sulkeuma on valkoiseksi värjätty ja sen komplementti mustaksi värjätty. Jos juurijoukon transitiivinen sulkeuma sisältää mustia solmuja, on vaarana, että muutin ryhtyy käyttämään vapautettua muistia. Tämä on ns. roikkuvan osoittimen (engl. dangling pointer) ongelma. Jos juurijoukon transitiivisen sulkeuman komplementti sisältää valkoisia solmuja, on kyseessä muistivuoto (eng. memory leak). Roikkuva osoitin -ongelma on vakava, sen sijaan muistivuoto on hyvin siedetty, jos se pysyy rajallisena.
Sisällys lmä
engl. mark and sweep John McCarthy: Recursive functions of symbolic expressions and their computation by machine, Part I, Communications of the ACM, huhtikuu 1960. Varataan jokaisesta tietueesta yksi bitti, ns. merkkibitti, siivoimen käyttöön. Merkkaa: Käydään graafi juurijoukosta alkaen läpi syvyys- tai leveyshaulla ja merkitään saavutetut tietueet. Lakaise: Ne tietueet, jotka eivät tulleet merkatuksi, voidaan vapauttaa.
Kompleksisuus Oletetaan, että siivous alkaa, kun muisti on täynnä. Olkoon h keon koko. Olkoon r juurijoukon transitiivisen sulkeuman koko. Olkoot c 1,..., c 4 vakioita. -algoritmin suhteellinen vaativuus on c 1 r + c 3 h + c 2 + c 4 h r aikayksikköä per vapautettu muistiyksikkö. Siivous on sitä halvempaa mitä pienempi r on! Siivoimen on hyvä pyytää käyttöjärjestelmältä lisää muistia, kun r/h ylittää kiinnitetyn raja-arvon (esim. 0.5).
Variantteja Koko juurijoukon transitiivinen sulkeuma voi periaatteessa olla yksi lineaarinen lista. Tällöin syvyyshaun pino kasvaa koko keon kokoiseksi! Kutsupino ei kestä tällaista, parempi käyttää eksplisiittistä pinoa tai jonoa. Toinen vaihtoehto on kääntää osoittimien suunta väliaikaisesti.
Vapautetun muistin hallinta Vapaa muisti tavallisesti kootaan vapaalistaksi (engl. free list). koko keko on vapaalistassa. Lakaisuvaihe lisää kunkin vapautettavan tietueen muistialueen vapaalistaan. Muistinvaraus etsii vapaalistasta sopivan muistialueen ja poistaa sen listasta. Täydennyksiä: vain kahden potenssin kokoisten muistialueiden käsittely erilliset vapaalistat erikokoisille muistialueille muistialueiden yhdistäminen ja jakaminen
Sisällys lmä
engl. reference counting George E. Collins: A method for overlapping and erasure of lists. Communications of the ACM, joulukuu 1960. Piilotetaan jokaiseen tietueeseen laskuri Alustetaan se 1:ksi. Aina kun osoite kopioidaan, kasvatetaan sen osoittaman tietueen laskuria yhdellä. Aina kun osoitteesta luovutaan, vähennetään sen osoittaman tietueen laskuria yhdellä...... ja jos laskuri menee nollaan, tuhotaan tietue...... mikä puolestaan rekursiivisesti vähentää tietueen osoittamien tieuteiden laskureita yhdellä.
Pro ja contra + yksinkertainen toteuttaa + ei (yleensä) pysäytä ohjelmaa pitkäksi aikaa kuten merkkaa ja lakaise viittaussykli johtaa muistivuotoon laskurin ylläpitämistä joutuu tekemään jatkuvasti, mikä johtaa huomattavaan lisätyömäärään
Sisällys lmä
lmä engl. two-space garbage collection, copying collection Robert R. Fenichel & Jerome C. Yochelson: A LISP garbage-collector for virtual-memory computer systems, Communications of the ACM, marraskuu 1969. C. J. Cheney: A nonrecursive list compacting algorithm, Communications of the ACM, marraskuu 1970.
Idea Jaetaan keko kahteen yhtenäiseen alueeseen, fromspace ja tospace. Fromspace on jaettu kahteen yhtenäiseen osaan: varattu muisti ja vapaa muisti. Muistinvaraus tapahtuu fromspacesta siirtämällä osien rajaa. Kun fromspace tulee täyteen, tehdään muistinsiivousajo: Kopioidaan juurijoukon tansitiiviseen sulkeumaan kuuluvat tietueet tospaceen. Kopiointi voi tapahtua syvyyshaulla (Fenichel-Yochelson) tai leveyshaulla (Cheney). Tietueen vanhaan paikkaan laitetaan edelleenohjaus. Kopioinnin jälkeen vaihdetaan tospace fromspaceksi ja fromspace tospaceksi. Edelleenohjauksia ei tarvita kopioinnin valmistuttua.
Cheneyn temppu Leveyshakua tehtäessä ei tarvita lainkaan aputietorakenteita! Kopioidaan aluksi juurijoukko. Sen jälkeen skannataan tospace alusta alkaen kunnes kaikki kopioitu tieto on käyty läpi. Jos skannaus löytää osoittimen fromspaceen: Jos fromspacessa on edelleenohjaus, päivitetään osoite. Muutoin kopioidaan tietue fromspacesta tospaceen, päivitetään osoite ja lisätään fromspaceen edelleenohjaus.
Pro ja contra + Muistinvaraus on erittäin nopeaa. + Siivous käsittelee vain juurijoukon transitiivista sulkeumaa. Jos se on pieni suhteessa puoliavaruuden kokoon, yksi ajo on nopea. + Muisti ei fragmentoidu. Vaatii runsaasti muistia. Cheneyn temppu (ja leveyshaku ylipäätään) hajauttaa tietorakenteiden osat kauaksi toisistaan.
Sisällys lmä
Sukupolvisiivous Taustalla väite, että mitä pidempään tietue on ollut elossa, sen todennäköisempää on, että sitä tarvitaan jatkossakin. Jaetaan muisti kahteen sukupolveen (engl. generation). Ensimmäinen sukupolvi on taimitarha (engl. nursery). Kaikki muistinvaraus tapahtuu taimitarhasta. Kun taimitarha täyttyy, vain se siivotaan. Jos tietue on selvinnyt hengissä n:stä siivouksesta, se ylennetään toiseen sukupolveen. Muutaman taimitarhan siivouksen välein tehdään molempien sukupuolien yhteinen siivous. Sukupolvia voi olla toki enemmänkin kuin kaksi.
Kolmivärisiivous E. W. Dijkstra ym: On-the-fly garbage collection: an exercise in cooperation, Communications of the ACM, marraskuu 1978. Ideana jakaa siivouksen työ useampaan osaan eli inkrementtiin niin, ettei siivousta varten tarvitse pysäyttää ohjelmaa pitkäksi aikaa. Toimii niin merkkaus- kuin kopiointitekniikalla.
Idea Väritetään jokainen tietue jollakin kolmesta väristä: Valkoinen tarkoittaa, että tietuetta ei ole merkattu/kopioitu. Harmaa tarkoittaa, että tietue on merkattu/kopioitu, mutta sen osoittimia ei ole seurattu. Musta tarkoittaa, että tietue on merkattu/kopioitu ja sen osoittimet on myös käsitelty. Invariantit: Jos harmaita tietueita ei ole, kaikki valkoiset tietueet voidaan kierrättää. Mustasta tietueesta ei ole osoitinta valkoiseen tietueeseen. Jokainen harmaa tietue on siivoimen työlistalla. Muuttaja saa koskea muistiin myös siivouksen ollessa käynnissä, kunhan se säilyttää väri-invariantit.
Sisällys lmä
Seuraava deadline Vaihe E tiistai 1.12. klo 10 koodigenerointi (ilman rekisteriallokaatiota) Vaihe F maanantai 14.12. klo 12 rekisteriallokaatio