Sobes.tech
Middle+

Cuéntame sobre el patrón de gestión de goroutines (GMP) en Go.

sobes.tech AI

Respuesta de la IA

El planificador de Go gestiona las goroutines, los hilos del sistema operativo y los procesadores lógicos utilizando el modelo GMP:

  • G (Goroutine): Unidad de ejecución ligera e independiente. Contiene una pila, un puntero a la instrucción y otra información de estado. Muchas goroutines pueden ejecutarse en un solo hilo del sistema operativo.
  • M (Machine): Hilo del sistema operativo. Actúa como ejecutor que inicia el código de la goroutine. Un conjunto de M puede estar disponible para el planificador.
  • P (Processor): Procesador lógico. Proporciona un contexto para la ejecución de la goroutine. Contiene una cola local de goroutines listas para ejecutarse en ese M. La cantidad de P por defecto es igual a runtime.NumCPU().

Interacción:

  1. Se crea una goroutine (G) y se coloca en una cola global o local P.
  2. Un M libre solicita un P. Si P está disponible, M se vincula a él.
  3. M toma una goroutine de la cola local P y comienza su ejecución.
  4. Si la goroutine se bloquea (por ejemplo, esperando I/O), M se desacopla de P ("hand off"). P permanece disponible para otro M o planifica otra goroutine de su cola.
  5. Cuando la goroutine bloqueada está lista para reanudarse, se vuelve a colocar en la cola P o en la cola global.
  6. M puede ser creado por el planificador si es necesario (por ejemplo, si todos los M existentes están bloqueados) o eliminado cuando está inactivo.

Preemption (conmutación forzada): El planificador puede interrumpir la ejecución de una goroutine después de un período de tiempo determinado (time slice) para garantizar una distribución justa del tiempo de CPU entre otras goroutines.

Work Stealing (robo de trabajo): Si P agota sus goroutines en su cola local, puede intentar "robar" goroutines de la cola global o de las colas de otros P.