Sobes.tech
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() ցույց է տալիս ակտիվ գորուտինաների քանակը (ներառյալ հիմնականը):