Middle+
Kā ir uzbūvēta kaudze Go valodā?
sobes.tech AI
Atbilde no AI
Golang, heap ir atmiņas apgabals, kur izvietoti dinamiski piešķirtie objekti. Šīs atmiņas pārvaldību automātiski veic atkritumu savācējs.
Galvenie aspekti:
- Dinamiska piešķiršana: Mazāka izmēra un īsa mūža objekti, kurus kompilators nevar pierādīt, ka to dzīves laiks ir ierobežots ar funkcijas vai steka robežām, vai kuri tiek piešķirti ar
newvai adreses ņemšanu (&), parasti izvietojas kaudzē. - Atkritumu savācējs (GC): Go izmanto paralēlu, trīskāršu, Mark-and-Sweep atkritumu savācēju. Tas darbojas vienlaikus ar programmas izpildi, samazinot pārtraukšanas laiku.
- Mark (Atzīmēšana): GC apiet sasniedzamos objektus no saknes rādītājiem (lokālās mainīgās stekos, globālās mainīgās) un atzīmē tos kā "dzīvus".
- Sweep (Tīrīšana): GC pārstaigā visu pieejamo kaudzi un atbrīvo atmiņu, kas aizņemta ar objektiem, kuri nav atzīmēti kā "dzīvi".
- Paralēla: GC darbojas atsevišķās gorutīnās, samazinot galvenās programmas aizkaves.
- Escape analīze: Golang kompilators veic analīzi (escape analysis), lai noteiktu, uz kurieni norāda mainīgais vai vērtība — uz steku vai kaudzi. Ja mainīgais vai struktūras lauks var būt pieejams pēc pašreizējās gorutīnas atgriešanās, tas, visticamāk, tiks izvietots kaudzē. Pretējā gadījumā, tas var tikt izvietots uz steka.
// Escape analīzes piemērs. // Šis objekts, visticamāk, tiks izvietots kaudzē, // jo tiek atgriezts rādītājs. func createPoint() *Point { p := Point{X: 1, Y: 2} return &p // Rādītājs "bēg" no funkcijas } // Šis objekts, visticamāk, tiks izvietots uz steka, // jo tas nav pieejams pēc funkcijas pabeigšanas. func processValue() { val := 10 println(val) } type Point struct { X, Y int } - Arenu sadalījums: Golang kaudze var tikt sadalīta vairākās arenās, kas palīdz atkritumu savācējam darboties efektīvāk, īpaši daudzprocesoru sistēmās.
- mmap izmantošana: Golang izmanto sistēmas izsaukumu
mmap(Memory Map), lai piešķirtu lielus virtuālās atmiņas blokus kaudzē. - Nepārtrauktība: Atšķirībā no dažām valodām, Go garantē fizisku objektu nepārtrauktību kaudzē. Atmiņa var būt fragmentēta.
- Rokas pārvaldības neesamība: Izstrādātājam nav jāpiešķir vai jāatbrīvo atmiņa kaudzē. GC to dara automātiski.
Steks un kaudze Golang veic dažādas funkcijas:
| Atmiņas apgabals | Mērķis | Pārvaldība | Dzīves laiks |
|---|---|---|---|
| Steks | Lokālas mainīgās, funkciju parametri, atgrieztie adreses | Automātiska (ieejot/izejot no funkcijas) | Ierobežots ar funkcijas izpildes laiku |
| Kaudze | Dinamiski piešķirti objekti, kas "bēg" no steka, lielas struktūras | Atkritumu savācējs (GC) | Noteikts ar objekta sasniedzamību no saknēm |