Sobes.tech
Middle+

Ako sú gorutiny usporiadané a koľko pamäte zaberajú na zásobníku?

sobes.tech AI

Odpoveď od AI

Gorutina je ľahký vlákno, ktoré spravuje prostredie behu jazyka Go. Na rozdiel od vlákien operačného systému, gorutiny multiplexujú na menší počet vlákien OS. To zabezpečuje lepšiu škálovateľnosť.

Kľúčové aspekty:

  • Plánovač (Scheduler): Prostredie behu jazyka Go má vlastného plánovača (scheduler M:N), ktorý spravuje gorutiny (M) na obmedzenom počte vlákien OS (N).
  • Správca pamäte (Memory Manager): Riadi zásobníky gorutín a ich rast/zmiznutie.
  • Komunikácia: Gorutiny komunikujú cez kanály, zabezpečujúc bezpečnú výmenu dát bez blokovaní/mutexov vo väčšine prípadov.

Zásobník gorutiny:

  • Počiatočne sú zásobníky gorutín malé, zvyčajne 2 KB (pred Go 1.4 to bolo 4 KB).
  • Zásobník je dynamický, rastie a znižuje sa. Pri pretečení sa automaticky rozšíri, a pri uvoľnení pamäti sa zmenší.
  • Táto dynamická správa zásobníka znižuje náklady v porovnaní s veľkými pevnými zásobníkmi OS.

Využitie pamäti na zásobníku:

  • Pri vytvorení gorutiny zaberá zvyčajne 2 KB pamäti pre jej zásobník.
  • Spotreba pamäti sa môže dynamicky zvyšovať pri volaní funkcií a znižovať pri návrate.
  • Maximálna veľkosť zásobníka je obmedzená, ale je dostatočne veľká pre väčšinu úloh (zvyčajne niekoľko MB).
package main

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

func sayHello() {
	fmt.Println("Ahoj z gorutiny!")
}

func main() {
	// Demonstrácia vytvorenia gorutiny
	go sayHello()

	// Na sledovanie práce gorutiny
	time.Sleep(100 * time.Millisecond)

	fmt.Printf("Počet gorutín: %d\n", runtime.NumGoroutine())
}

V tomto príklade sa sayHello spúšťa ako samostatná gorutina. runtime.NumGoroutine() ukazuje počet aktívnych gorutín (vrátane hlavnej).