Middle+
Чӣ гуна ҷамъоварии партовҳо дар забони Go кор мекунад?
sobes.tech AI
Ҷавоб аз AI
Загрозирасоби дар Go иҷро мекунад усули параллелӣ, номуайян (non-generational) асосёфта ба алгоритми Mark-and-Sweep бо триггер дар асоси ҳаҷми кӯчӣ.
Принсипҳои асосии кор:
- Триггер барои фаъолсозӣ: Загрозирасоб вақте оғоз меёбад, ки ҳаҷми ёдгирии дарозмуддат аз ҳадди муайян гузарад. Ин ҳаддида ба таври динамикӣ танзим мешавад.
- Фазаи нишондод (Mark Phase):
- Загрозирасоб иҷрои қисмати муҳимтарини Фазаи нишондодро (Stop-the-World, STW) бозмедорад, аммо ин вақти хеле кӯтоҳро мегирад.
- Дар ҳамзамон бо барномае, ки дар ҳоли кор аст (mutator), загрозирасоб графи объектҳоро тавассути нишондиҳандаҳои асосӣ (регистрон, тағйирёбандаҳои глобалӣ, стекҳои горутин) мегузарад.
- Объектҳои зинда (дастрас) ҳамчун истифодашаванда нишондод мешаванд.
- Фазаи тоза (Sweep Phase):
- Пас аз анҷоми Фазаи нишондод, загрозирасоб ба рӯйхати ёдгирии иҷорагирифта (spans) мегузарад.
- Объектҳои ношенасозишаванда ҳамчун партов ҳисобида мешаванд ва ёдгирии онҳоро озод мекунад.
- Ин фаза низ ҳамзамон бо кори барнома иҷро мешавад.
- Write Barrier: Go барои пайгирии тағйирот дар графи объектҳо дар вақти фазаи параллелии нишондод истифодаи write barrier мекунад. Ин кафолат медиҳад, ки кории загрозирасоб дуруст аст, новобаста аз тағйирот дар ёдгирӣ аз ҷониби mutator.
- Бе наслҳо: Баръакс ба баъзе забонҳои дигар, Go объектҳоро ба наслҳо тақсим намекунад. Загрозирасоб тамоми кӯчиро ба таври комил коркард мекунад.
- Ҳадафи паст кардани таъхир: Дар тарҳрезии GC-и Go, вазифа гузошта шуд, ки таъхирҳоро, ки аз ҷамъоварии партов (пайзиши STW) ба вуҷуд меоянд, кам кунад, ки онро барои барномаҳои серверӣ мувофиқ месозад.
Параллелизм ва истифодаи write barrier имкон медиҳад, ки загрозирасоб вақти боздошти барномаиро кам кунад ва иҷроишро баланд бардорад.
Масалан, идоракунии осонкардашудаи ёдгирӣ (на мустақиман GC, балки нишон медиҳад, ки чӣ гуна захираҳоро озод мекунад):
package main
import (
"fmt"
"os"
)
func main() {
// Мисол барои эҷоди захираи муваққатӣ, ки баъдан озод мешавад
file, err := os.Create("temp.txt")
if err != nil {
fmt.Println("Хатогӣ дар эҷоди файл:", err)
return
}
// Баста шудани файл бо таъхир.
// Гарчанде ки ин мустақиман GC нест, нишон медиҳад, ки чӣ гуна захираҳо озод мешаванд.
defer file.Close()
fmt.Println("Файл 'temp.txt' эҷод шуд.")
// Баъдан барнома метавонад бо файл кор кунад...
// GC автоматӣ дар пасзамина барои ҷамъоварии объектҳои нолозим дар кӯчӣ кор мекунад.
// Масалан, агар мо слайс ё харита эҷод кунем:
data := make([]int, 1000000) // Заделка дар кӯчӣ
_ = data // Истифода
// Вақте ки data дастрасӣ намешавад (масалан, дар баромад аз функсия),
// ҷамъоварии партов вақт мегирад ва ёдгирии озод мекунад.
}