Middle+
Ինչպես են կառուցված գորուտինները և որքան հիշողություն են զբաղեցնում ստեկում?
sobes.tech AI
Պատասխան AI-ից
Գորուտինա — դա թեթև քաշով գործարկման գիծ է, որը կառավարում է Go-ի գործարկման միջավայրը։ Բացառությամբ օպերացիոն համակարգի գծերի, գորուտինաները մուլտիպլեքսավորվում են ավելի փոքր թվով օպերացիոն համակարգի գծերի վրա։ Սա ապահովում է ավելի լավ մասշտաբայնություն:
Հիմնական կողմնորոշիչներ՝
- Համակարգավար (Scheduler): Go-ի գործարկման միջավայրը ունի իր սեփական համակարգավար (M:N scheduler), որը կառավարում է գորուտինաները (M) սահմանափակ թվով օպերացիոն համակարգի գծերի վրա (N):
- Հիշողության կառավարիչ (Memory Manager): Կառավարում է գորուտինաների ստակները և նրանց աճը/կրճատումը:
- Հաղորդակցություն: Գորուտինաները փոխազդում են ալիքների միջոցով, ապահովելով անվտանգ տվյալների փոխանակում առանց բլոկավորումների/մյուտեքսների մեծ մասում դեպքերի:
Գորուտինայի ստակ:
- Սկզբում, գորուտինաների ստակները փոքր են, սովորաբար 2 ԿԲ (Go 1.4-ից առաջ 4 ԿԲ):
- Ստակն աճում և կրճատվում է դինամիկ։ Երբ այն լցվում է, այն ավտոմատ կերպով ընդլայնվում է, իսկ երբ հիշողությունը ազատվում է, այն սեղմվում է:
- Այս դինամիկ ստակ կառավարման մեթոդը նվազեցնում է ծախսերը, համեմատած օպերացիոն համակարգի մեծ կայուն ստակների:
Հիշողության օգտագործում ստակում:
- Ստեղծման ժամանակ, գորուտինան սովորաբար զբաղեցնում է 2 ԿԲ հիշողություն իր ստակով:
- Հիշողության սպառումը կարող է դինամիկորեն աճել ֆունկցիաների կանչերով և նվազել վերադարձի ժամանակ:
- Մակսիմալ ստակ չափը սահմանափակ է, բայց բավականին մեծ է մեծ մասի առաջադրանքների համար (սովորաբար մի քանի ՄԲ):
package main
import (
"fmt"
"runtime"
"time"
)
func sayHello() {
fmt.Println("Բարև ձեզ, գորուտինայից!")
}
func main() {
// Գորուտինայի ստեղծման ցուցադրություն
go sayHello()
// Գորուտինայի աշխատանքի դիտարկման համար
time.Sleep(100 * time.Millisecond)
fmt.Printf("Գորուտինաների թիվը: %d\n", runtime.NumGoroutine())
}
Այս օրինակով, sayHello գործարկվում է որպես առանձին գորուտինա։ runtime.NumGoroutine() ցույց է տալիս ակտիվ գորուտինաների քանակը (ներառյալ հիմնականը):