Sobes.tech
Middle+

Jak są zbudowane goroutines i ile pamięci zajmują na stosie?

sobes.tech AI

Odpowiedź od AI

Gorutyna to lekkie wątki wykonawcze zarządzane przez środowisko uruchomieniowe Go. W przeciwieństwie do wątków systemu operacyjnego, gorutyny multiplexują się na mniejszą liczbę wątków systemu operacyjnego. Zapewnia to lepszą skalowalność.

Kluczowe aspekty:

  • Menadżer planowania (Scheduler): Środowisko uruchomieniowe Go ma własny planista (scheduler M:N), który zarządza gorutynami (M) na ograniczonej liczbie wątków systemu operacyjnego (N).
  • Menadżer pamięci (Memory Manager): Zarządza stosami gorutyn i ich wzrostem/mniejszeniem.
  • Komunikacja: Gorutyny komunikują się przez kanały, zapewniając bezpieczną wymianę danych bez blokad/mutexów w większości przypadków.

Stos gorutyny:

  • Początkowo stosy gorutyn są małe, zazwyczaj 2 KB (przed Go 1.4 było to 4 KB).
  • Stos jest dynamiczny, rośnie i kurczy się. Gdy dojdzie do przepełnienia, automatycznie się powiększa, a przy zwolnieniu pamięci — kurczy.
  • Ta dynamiczna zarządzanie stosem zmniejsza koszty w porównaniu do dużych, stałych stosów systemu operacyjnego.

Zużycie pamięci na stosie:

  • W momencie tworzenia gorutyna zazwyczaj zajmuje 2 KB pamięci na swój stos.
  • Zużycie pamięci może się dynamicznie zwiększać przy wywołaniach funkcji i zmniejszać przy ich powrocie.
  • Maksymalny rozmiar stosu jest ograniczony, ale jest wystarczająco duży dla większości zadań (zwykle kilka MB).
package main

import (
	"fmt"
	"runtime"
	"time"
)

func sayHello() {
	fmt.Println("Cześć z gorutyny!")
}

func main() {
	// Demonstracja tworzenia gorutyny
	go sayHello()

	// Aby obserwować działanie gorutyny
	time.Sleep(100 * time.Millisecond)

	fmt.Printf("Liczba gorutyn: %d\n", runtime.NumGoroutine())
}

W tym przykładzie sayHello jest wykonywana jako oddzielna gorutyna. runtime.NumGoroutine() pokazuje liczbę aktywnych gorutyn (w tym główną).