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
newvõ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 |