Sobes.tech
Middle+

Kuidas on Go keeles virn üles ehitatud?

sobes.tech AI

Vastus AI-lt

Golangis, virkne (heap) on mäeala mälu piirkond, kus paiknevad dünaamiliselt eraldatud objektid. Selle mälu haldamist teostab automaatselt prügikoristaja.

Peamised aspektid:

  • Dünaamiline eraldamine: Väikese suuruse ja lühiajalise elueaga objektid, mille puhul kompilaator ei saa tõestada, et nende eluaeg on piiratud funktsiooni või virna piiridega, või mis eraldatakse new või aadressi võtmise (&) abil, paiknevad tavaliselt virnas.
  • Prügikoristaja (GC): Go kasutab paralleelset, kolorkihti, Mark-and-Sweep prügikoristajat. See töötab samaaegselt programmi täitmisega, minimeerides pauside aega.
    • Mark (Märkimine): GC läbikäib saavutatavad objektid juur-rõõmudest (lokalsetest muutujatest virnas, globaalsetest muutujatest) ja märgistab need "elus".
    • Sweep (Puhastamine): GC läbib kogu saadaval oleva virna ja vabastab mälu, mida hõivavad objektid, mida ei märgitud "elus".
    • Paralleelne: GC töötab eraldi gorutüünides, vähendades peamise programmi viivitusi.
  • Escape analüüs: Golangi kompilaator teostab analüüsi (escape analysis), et määrata, kuhu viitab muutuja või väärtus — virnale või virnale. Kui muutuja või struktuuri väli võib olla kättesaadav pärast praeguse gorutüüni tagasipöördumist, siis tõenäoliselt eraldatakse see virnale. Vastasel juhul võib see olla virnas.
    // Escape analüüsi näide.
    // See objekt tõenäoliselt eraldatakse virnale,
    // kuna tagastatakse viitaja.
    func createPoint() *Point {
        p := Point{X: 1, Y: 2}
        return &p // Viitaja "põgeneb" funktsioonist
    }
    
    // See objekt tõenäoliselt eraldatakse virnale,
    // kuna see ei ole saadaval pärast funktsiooni lõppu.
    func processValue() {
        val := 10
        println(val)
    }
    
    type Point struct {
        X, Y int
    }
    
  • Arenade jagunemine: Golangis võib kaust olla jagatud mitmeks arenaks, mis aitab prügikoristajal tõhusamalt töötada, eriti mitme protsessoriga süsteemides.
  • mmap kasutamine: Golang kasutab süsteemikutsungit mmap (Memory Map), et eraldada suuremaid virtuaalse mälu plokke kaustale.
  • Järjepidevus: Erinevalt mõnest keelest ei taga Go füüsilist objekti järjepidevust kaustas. Mälu võib olla fragmenteeritud.
  • Käsitsi mälu haldamise puudumine: Arendajal ei ole vaja mälu otseselt eraldada ega vabastada kaustas. GC teeb selle automaatselt.

Virn ja kaud on Golangis erinevad rollid:

Mälu piirkond Otstarve Päringud Eluaeg
Virn Kohalikud muutujad, funktsioonide parameetrid, tagastatud aadressid Automaatne (funktsiooni sisenemisel/väljumisel) Piiratud funktsiooni täitmise ajaga
Kaud Dünaamiliselt eraldatud objektid, mis "põgenevad" virnast, suured struktuurid Prügikoristaja (GC) Määratud objekti saavutatavuse järgi juurtest