Middle+
Kako su strukturirane goroutine i koliko memorije zauzimaju u steku?
sobes.tech АИ
Одговор од АИ
Горутинa 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 gorutinas 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 (scheduler M:N), que gestiona las gorutinas (M) en un número limitado de hilos del sistema operativo (N).
- Gestor de memoria (Memory Manager): Gestiona las pilas de las gorutinas y su crecimiento/disminución.
- Comunicación: Las gorutinas interactúan a través de canales, asegurando un intercambio de datos seguro sin bloqueos/mutex en la mayoría de los casos.
Pila de la gorutina:
- Inicialmente, las pilas de las gorutinas 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 gorutina, 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 una 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 (incluyendo la principal).