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) | Հասանելիությունից կախված |