Sobes.tech
Middle+

¿Cómo están estructuradas las goroutines y cuánta memoria ocupan en la pila?

sobes.tech AI

Respuesta de la IA

Una goroutine es un hilo de ejecución ligero gestionado por el entorno de ejecución de Go. A diferencia de los hilos del sistema operativo, las goroutines se multiplexan en un menor número de hilos del sistema operativo. Esto proporciona una mejor escalabilidad.

Aspectos clave:

  • Gestor de planificador (Scheduler): El entorno de ejecución de Go tiene su propio planificador (planificador M:N), que gestiona las goroutines (M) en un número limitado de hilos del sistema operativo (N).
  • Gestor de memoria (Memory Manager): Gestiona las pilas de las goroutines y su crecimiento/disminución.
  • Comunicación: Las goroutines interactúan a través de canales, asegurando un intercambio de datos seguro sin bloqueos/mutexes en la mayoría de los casos.

Pila de la goroutine:

  • Inicialmente, las pilas de las goroutines son pequeñas, generalmente 2 KB (antes de Go 1.4 eran 4 KB).
  • La pila crece y disminuye dinámicamente. Cuando se desborda, se expande automáticamente, y cuando se libera memoria, se comprime.
  • Esta gestión dinámica de la pila reduce los costos en comparación con pilas fijas grandes del sistema operativo.

Memoria ocupada en la pila:

  • En el momento de crear una goroutine, generalmente ocupa 2 KB de memoria para su pila.
  • El consumo de memoria puede aumentar dinámicamente con llamadas a funciones y disminuir al retornar.
  • El tamaño máximo de la pila está limitado, pero es lo suficientemente grande para la mayoría de las tareas (generalmente varios MB).
package main

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

func sayHello() {
	fmt.Println("¡Hola desde la goroutine!")
}

func main() {
	// Demostración de creación de una goroutine
	go sayHello()

	// Para observar el funcionamiento de la goroutine
	time.Sleep(100 * time.Millisecond)

	fmt.Printf("Número de goroutines: %d\n", runtime.NumGoroutine())
}

En este ejemplo, sayHello se ejecuta como una goroutine separada. runtime.NumGoroutine() muestra la cantidad de goroutines activas (incluida la principal).