Middle+
Чӣ гуна сохтори гулӯ дар забони Go аст?
sobes.tech AI
Ҷавоб аз AI
Дар Golang, куча (heap) — ин минтақаи хотира аст, ки объектҳои динамикӣ тақсимшуда ҷойгир мешаванд. Идораи ин хотира автоматӣ тавассути ҷамъкунандаи партовҳо анҷом дода мешавад.
Мушаххасоти асосӣ:
- Тақсимоти динамикӣ: Объектҳои хурд ва кӯтоҳмуддат, ки компилятор наметавонад исбот кунад, ки вақти зиндагии онҳо маҳдуд аст аз ҳадди функсия ё стек, ё ки онҳо бо
newё гирифтани суроға (&) тақсим мешаванд, одатан дар куча ҷойгир мешаванд. - Ҷамъкунандаи партовҳо (GC): Go истифода мекунад ҷамъкунандаи партовҳои параллелӣ, се рангӣ, Mark-and-Sweep. Он ҳамзамон бо иҷрои барнома кор мекунад, то дамо паузаҳоро кам кунад.
- Mark (Нишонгузорӣ): GC объектҳои дастрасро аз нишондиҳандаҳои реша (вариаблҳои маҳаллӣ дар стекҳо, тағйирёбҳои глобалӣ) мегузарад ва онҳоро ҳамчун "зинда" нишон медиҳад.
- Sweep (Тоза кардан): GC тамоми кучаро мегузарад ва хотираро, ки объектҳои нишондашуда истифода мебаранд, озод мекунад.
- Параллелӣ: GC дар goroutines алоҳида кор мекунад, то таъхирҳоро кам кунад.
- Таҳлили фирор (Escape Analysis): Компилятори Golang таҳлил мекунад (escape analysis), ки муайян кунад, ки тағйирёбанда ё арзиш ба куҷо ишора мекунад — ба стек ё ба куча. Агар тағйирёбанда ё майдони сохторӣ пас аз баргашти аз goroutine-и ҳозира дастрас бошад, эҳтимолан дар куча ҷойгир мешавад. Дар акси ҳол, дар стек ҷойгир мешавад.
// Намунаи таҳлили фирор. // Ин объект эҳтимолан дар куча ҷойгир мешавад, // зеро ишорагари баргаштааст. func createPoint() *Point { p := Point{X: 1, Y: 2} return &p // Ишорагари "мегурезад" аз функсия } // Ин объект эҳтимолан дар стек ҷойгир мешавад, // зеро пас аз анҷоми функсия дастрас нест. func processValue() { val := 10 println(val) } type Point struct { X, Y int } - Тақсим кардан ба аренаҳо (Arenas): Куча дар Golang метавонад ба чанд арена тақсим шавад, ки кӯмак мекунад ҷамъкунандаи партовҳо самараноктар кор кунад, махсусан дар системаҳое, ки бисёркорпусӣ мебошанд.
- Истифодаи mmap: Golang истифода мекунад фармони системӣ
mmap(Memory Map) барои тақсим кардани блокҳои калонтар аз хотираи виртуалӣ барои куча. - Намояндагӣ: Баръакс ба баъзе забонҳо, Go кафолат намедиҳад, ки объектҳо дар куча физикӣ пайваст бошанд. Хотира метавонад парчам шавад.
- Норасогии идоракунии дастӣ: Тарафдор бояд манually хотираро тақсим кунад ё озод кунад, ки GC инро автоматӣ мекунад.
Стек ва куча дар Golang вазифаҳои гуногун доранд:
| Минтақаи хотира | Мақсад | Идоракунӣ | Вақти зиндагӣ |
|---|---|---|---|
| Стек | Вариаблҳои маҳаллӣ, параметрҳои функсия, суроғаҳои баргашт | Автоматӣ (дар дохил ва хориҷ шудан аз функсия) | Маҳдуд ба вақти иҷрои функсия |
| Куча | Объектҳои динамикӣ, ки "мегурезанд" аз стек, структураҳои калон | Ҷамъкунандаи партовҳо (GC) | Дастрасӣ аз ҷониби манбаъҳо |