Sobes.tech
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 new vai 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