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).