Sobes.tech
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:

  1. Uma goroutine (G) é criada e colocada numa fila global ou local P.
  2. Um M livre solicita um P. Se P estiver disponível, M liga-se a ele.
  3. M pega uma goroutine da fila local P e começa a sua execução.
  4. 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.
  5. Quando a goroutine bloqueada estiver pronta para retomar, ela é colocada de novo na fila P ou na fila global.
  6. 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.