Sobes.tech
Middle+

Ինչպես է կառուցված գդակը Go լեզվում?

sobes.tech AI

Պատասխան AI-ից

Go լեզվում, heap-ը հիշողության տարածք է, որտեղ տեղադրվում են դինամիկորեն հատկացված օբյեկտները: Այս հիշողության կառավարումը ավտոմատ կերպով իրականացնում է մաքրման հավաքիչը:

Հիմնական ասպեկտներ՝

  • Դինամիկ հատկացում: Փոքր չափի և կարճ կյանքի օբյեկտները, որոնց կյանքի ժամկետը չի կարող ապացուցել, որ սահմանափակված է ֆունկցիայի կամ ստեկի սահմաններով, կամ որոնք հատկացվում են new կամ հասցե վերցնելու (&) միջոցով, սովորաբար տեղադրվում են heap-ում:
  • Ձեռքբերում մաքրման հավաքիչ (GC): Go-ն օգտագործում է համաժամանակյա, երեքգույն, Mark-and-Sweep մաքրման հավաքիչ: Այն աշխատում է ծրագրի կատարման ժամանակ, նվազեցնելով ընդհատումները:
    • Mark (Նշում): GC-ն անցնում է հասանելի օբյեկտների միջով՝ ռուչային ցուցիչներից (տեղական փոփոխականներ ստեկում, գլոբալ փոփոխականներ) և նշում է նրանց որպես "կենդանի":
    • Sweep (Մաքառում): GC-ն անցնում է ամբողջ հասանելի heap-ը և ազատում է հիշողությունը՝ զբաղեցրած օբյեկտներից, որոնք չեն նշվել որպես "կենդանի":
    • Համաժամանակյա: GC-ն աշխատում է առանձին goroutines-ներում՝ նվազեցնելով հիմնական ծրագրի ուշացումներն:
  • Escape Analysis: Golang- ի կոմպիլատորը կատարում է վերլուծություն (escape analysis), որպեսզի որոշի՝ դեպի ուր է ցույց տալիս փոփոխականը կամ արժեքը՝ ստեկ կամ heap: Եթե փոփոխականը կամ կառուցվածքային դաշտը կարող է հասանելի լինել ներկայիս goroutine- ի վերադարձից հետո, ապա այն հավանական է, որ տեղադրվի heap-ում: Այլապես՝ ստեկում:
    // Escape analysis օրինակ:
    // Այս օբյեկտը հավանական է, որ տեղադրվի heap-ում,
    // քանի որ վերադարձվում է ցուցիչ:
    func createPoint() *Point {
        p := Point{X: 1, Y: 2}
        return &p // Ցուցիչ "փախչում" է ֆունկցիայից
    }
    
    // Այս օբյեկտը հավանական է, որ տեղադրվի ստեկում,
    // քանի որ այն հասանելի չէ ֆունկցիայի ավարտից հետո:
    func processValue() {
        val := 10
        println(val)
    }
    
    type Point struct {
        X, Y int
    }
    
  • Արենների բաժանում (Arenas): Go-ի heap-ը կարող է բաժանվել մի քանի արենաների, ինչը օգնում է մաքրման հավաքչին ավելի արդյունավետ աշխատել՝ հատկապես բազմամշակութային համակարգերում:
  • mmap օգտագործում: Golang-ը օգտագործում է համակարգային mmap հրամանը՝ մեծ բլոկների վիրտուալ հիշողության համար հատկացնելու համար:
  • Անընդհատություն: Բացառիկ լեզուների հակառակ, Go-ն չի երաշխավորում ֆիզիկական անընդհատություն օբյեկտների միջև heap-ում: Հիշողությունը կարող է լինել մասնատված:
  • Համակարգային կառավարման բացակայություն: Ծրագրավորողը պետք է ձեռքով հատկացնի կամ ազատի հիշողությունը heap-ում՝ GC-ն անում է դա ավտոմատ:

Stack-ը և heap-ը Golang-ում կատարում են տարբեր դերեր:

Հիշողության տարածք Նպատակը Կառավարում Ժամկետային կյանքը
Stack Տեղական փոփոխականներ, ֆունկցիայի պարամետրեր, վերադարձի հասցեներ Ավտոմատ (ֆունկցիային մուտք գործելիս/արտադրվելու ժամանակ) Սահմանափակ է ֆունկցիայի կատարման ժամանակով
Heap Դինամիկորեն հատկացված օբյեկտներ, որոնք "փախչում" են ստեկից, մեծ կառուցվածքներ Մաքրման հավաքիչ (GC) Հասանելիությունից կախված