Sobes.tech
Middle+

Kaip yra sukonstruotas Go kalbos krūva?

sobes.tech AI

Atsakymas iš AI

Golango kalboje, heap yra atminties sritis, kurioje yra išdėstyti dinamiškai paskirti objektai. Šios atminties valdymas yra automatinis naudojant šiukšlių surinkėją:

Pagrindiniai aspektai:

  • Dinaminis paskirstymas: Mažo dydžio ir trumpalaikiai objektai, kurių gyvavimo laikas negali būti įrodytas kaip apribotas funkcijos ar steko ribų, arba kurie paskiriami naudojant new arba adresą (&), paprastai yra išdėstyti heap'e.
  • Šiukšlių surinkėjas (GC): Go naudoja paralelinį, trijų spalvų, Mark-and-Sweep šiukšlių surinkėją. Jis veikia kartu su programos vykdymu, minimalizuodamas pauzes.
    • Mark (Žymėjimas): GC pereina prieinamus objektus iš šakninių rodyklių (vietinių kintamųjų steke, globalių kintamųjų) ir juos pažymi kaip "gyvus".
    • Sweep (Valymas): GC pereina visą prieinamą heap ir atlaisvina atmintį, užimtą objektais, kurie nebuvo pažymėti kaip "gyvi".
    • Paralelinis: GC veikia atskirose gorutinuose, sumažindamas vėlavimus pagrindinėje programoje.
  • Escape Analysis: Golango kompiliatorius atlieka analizę (escape analysis), kad nustatytų, kur nurodo kintamasis ar reikšmė — į steką ar į heap'ą. Jei kintamasis ar struktūrinis laukas gali būti pasiekiamas po dabartinės gorutinos grįžimo, jis tikriausiai bus paskirtas heap'e. Kitaip, steke.
    // Escape analysis pavyzdys:
    // Šis objektas tikriausiai bus paskirtas heap'e,
    // nes grąžinamas rodyklė:
    func createPoint() *Point {
        p := Point{X: 1, Y: 2}
        return &p // Rodyklė "bėga" iš funkcijos
    }
    
    // Šis objektas tikriausiai bus paskirtas steke,
    // nes jis nėra pasiekiamas po funkcijos pabaigos:
    func processValue() {
        val := 10
        println(val)
    }
    
    type Point struct {
        X, Y int
    }
    
  • Arenų skaidymas: Golango heap gali būti padalintas į kelias arenas, tai padeda šiukšlių surinkėjui veikti efektyviau, ypač daugiašaliuose sistemose.
  • Naudojant mmap: Golang naudoja sisteminį iškvietimą mmap (Memory Map) dideliems virtualios atminties blokams paskirstyti heap'ui.
  • Nuoseklumas: Skirtingai nuo kai kurių kalbų, Go garantuoja fizinį objektų nuoseklumą heap'e. Atmintis gali būti fragmentuota.
  • Rankinis atminties valdymo nebuvimas: Programuotojas neturi aiškiai paskirti ar atlaisvinti atmintį heap'e. GC tai daro automatiškai.

Stekas ir heap Golangoje atlieka skirtingas funkcijas:

Atminties sritis Paskirtis Valdymas Gyvenimo trukmė
Stekas Vietinės kintamosios, funkcijų parametrai, grąžinimo adresai Automatinis (įėjimo/išeigos metu) Apribotas funkcijos vykdymo laiku
Heap Dinamiškai paskirti objektai, kurie "bėga" iš steko, didelės struktūros Šiukšlių surinkėjas (GC) Nustatoma pasiekiamumo iš šaknų