Sobes.tech
Middle+

Πώς είναι δομημένες οι goroutines και πόση μνήμη καταλαμβάνουν στη στοίβα;

sobes.tech AI

Απάντηση από AI

Μια goroutine είναι ένα ελαφρύ νήμα εκτέλεσης που διαχειρίζεται το περιβάλλον εκτέλεσης του Go. Σε αντίθεση με τα νήματα του λειτουργικού συστήματος, οι goroutines πολλαπλασιάζονται σε μικρότερο αριθμό νήματα του OS. Αυτό εξασφαλίζει καλύτερη κλιμάκωση.

Βασικά σημεία:

  • Διαχειριστής προγραμματισμού (Scheduler): Το περιβάλλον εκτέλεσης του Go έχει το δικό του scheduler (M:N scheduler), που διαχειρίζεται τις goroutines (M) σε έναν περιορισμένο αριθμό νήματα OS (N).
  • Διαχειριστής μνήμης (Memory Manager): Διαχειρίζεται τις στοίβες των goroutines και την ανάπτυξη/μείωσή τους.
  • Επικοινωνία: Οι goroutines επικοινωνούν μέσω καναλιών, διασφαλίζοντας ασφαλή ανταλλαγή δεδομένων χωρίς μπλοκαρίσματα/mutex στις περισσότερες περιπτώσεις.

Στοίβα goroutine:

  • Αρχικά, οι στοίβες των goroutines είναι μικρές, συνήθως 2 KB (πριν από το Go 1.4 ήταν 4 KB).
  • Η στοίβα αυξάνεται και μειώνεται δυναμικά. Όταν γεμίζει, επεκτείνεται αυτόματα, και όταν απελευθερώνεται μνήμη, συμπιέζεται.
  • Αυτή η δυναμική διαχείριση στοίβας μειώνει το κόστος σε σύγκριση με τις μεγάλες σταθερές στοίβες του λειτουργικού συστήματος.

Κατανάλωση μνήμης στη στοίβα:

  • Κατά τη δημιουργία, μια goroutine καταλαμβάνει συνήθως 2 KB μνήμης για τη στοίβα της.
  • Η κατανάλωση μνήμης μπορεί να αυξηθεί δυναμικά με τις κλήσεις συναρτήσεων και να μειωθεί κατά την επιστροφή.
  • Το μέγιστο μέγεθος της στοίβας είναι περιορισμένο, αλλά αρκετά μεγάλο για τις περισσότερες εργασίες (συνήθως μερικά MB).
package main

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

func sayHello() {
	fmt.Println("Γειά από μια goroutine!")
}

func main() {
	// Επίδειξη δημιουργίας goroutine
	go sayHello()

	// Για παρατήρηση της λειτουργίας της goroutine
	time.Sleep(100 * time.Millisecond)

	fmt.Printf("Αριθμός goroutines: %d\n", runtime.NumGoroutine())
}

Σε αυτό το παράδειγμα, η sayHello εκτελείται ως ξεχωριστή goroutine. Το runtime.NumGoroutine() δείχνει τον αριθμό των ενεργών goroutines (συμπεριλαμβανομένης της κύριας).