Sobes.tech
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) Дастрасӣ аз ҷониби манбаъҳо