Middle+
Fale sobre o padrão de gestão de goroutines (GMP) em Go.
sobes.tech IA
Resposta da IA
O agendador do Go gere as goroutines, os threads do sistema operativo e os processadores lógicos usando o modelo GMP:
- G (Goroutine): Unidade de execução leve e independente. Contém uma pilha, um ponteiro para a instrução e outras informações de estado. Muitas goroutines podem trabalhar num único thread do sistema operativo.
- M (Machine): Thread do sistema operativo. Atua como executor que inicia o código da goroutine. Um conjunto de M pode estar disponível para o agendador.
- P (Processor): Processador lógico. Fornece um contexto para a execução da goroutine. Contém uma fila local de goroutines prontas a serem executadas neste M. O número de P por defeito é igual a
runtime.NumCPU().
Interação:
- Uma goroutine (G) é criada e colocada numa fila global ou local P.
- Um M livre solicita um P. Se P estiver disponível, M liga-se a ele.
- M pega uma goroutine da fila local P e começa a sua execução.
- Se a goroutine ficar bloqueada (por exemplo, à espera de I/O), M desliga-se de P ("hand off"). P permanece disponível para outro M ou planeia outra goroutine da sua fila.
- Quando a goroutine bloqueada estiver pronta para retomar, ela é colocada de novo na fila P ou na fila global.
- M pode ser criado pelo agendador se necessário (por exemplo, se todos os M existentes estiverem bloqueados) ou eliminado quando estiver inativo.
Preemption (troca forçada): O agendador pode interromper a execução de uma goroutine após um período de tempo definido (time slice) para garantir uma distribuição justa do tempo de CPU entre outras goroutines.
Work Stealing (roubo de trabalho): Se P esgotar as suas goroutines na sua fila local, pode tentar "roubar" goroutines da fila global ou de filas de outros P.