linguagem Go modelo de programação MPG

Antes de olhar para o tempo programador Go, precisamos entender porque você precisa dele, porque nós poderia pensar, kernel do sistema operacional não é já um agendador segmento Bem?
POSIX API pessoas familiarizadas sabe, programas POSIX em grande parte uma abordagem modelo de processo Unix é uma descrição lógica e extensão, ambos têm muitas semelhanças. Thread tem sua própria máscara de sinal, a afinidade de CPU e assim por diante. Mas muitas características do programa Go tanto complicado. demorada troca de contexto contexto particular. Outra razão é que necessidade de coleta de lixo de Go todos goroutine parou para que a memória em um estado consistente. ponto de coleta de lixo no tempo é incerto, se o sistema operacional depende de seu próprio programador a programação, em seguida, haverá um grande número de threads precisam parar de trabalhar.
GO era um programador de desenvolvimento separado pode saber quando seu estado de memória é o mesmo, ou seja, quando começamos a coleta de lixo, correndo apenas tem que esperar por esse segmento a ser executado no nuclear estava em CPU, ao invés de esperar para todas as threads. Uma relao de mapeamento entre o espaço do utilizador e linha espaço de núcleo tem rosca: N: 1,1: 1 e H: N. N: 1 é que os tópicos de usuários múltiplos (N) sempre executados em um thread do kernel, o contexto de contexto mudar muito rápido, mas não a vantagem real de multicore. 1: 1 é que uma thread do usuário para ser executado apenas em um segmento kernel, então você pode tirar vantagem de multi-core, mas mudança de contexto muito lento. H: N é para dizer, goroutine vários segmentos para executar em múltiplos núcleos, isto parece ser uma montagem do acima vantagens de ambos, mas irá aumentar a dificuldade de agendamento.
Aqui Insert Picture Descrição
Vá para dentro do programador tem três importantes estrutural: M, P, G
M: representa os tópicos reais do kernel do sistema operacional, e linha POSIX nas pessoas quase real de trabalho
G: representa um goroutine, ele tem sua própria pilha, instrução ponteiro e outras informações (a aguardar canal, etc), para a programação.
P: agendamento em nome do contexto, pode ser visto como um programador local, de modo ir para executar o código sobre um fio, o que é conseguido a partir do N: mapeamento de teclas M: 1 para N.
Aqui Insert Picture Descrição

FIG visto, existem dois fios de H físicos, cada m tem um contexto (P), cada um também tem um goroutine funcionamento.
O número de P pode ser definido por GOMAXPROCS (), que, de facto, que representa um grau real de simultaneidade, isto é, quantas goroutine podem ser executados simultaneamente. figura cinzenta goroutine que não correr, mas pronto para o estado de pronto, estamos esperando a ser agendada. P mantém a fila (chamada fila de execução), a linguagem Go, iniciar um goroutine é fácil: função ir na linha, para ter um ir cada comando é executado, fila de execução se juntou a um goroutine fila no final do seu próximo ponto de agendamento, removê-lo (como decidir qual a tomar goroutine?) da fila de execução em uma execução goroutine.
Por que manter vários contextos P? Porque o sistema operacional quando um segmento está bloqueado, P pode, em alternativa desertou para outro segmento OS! Nós vemos a figura, quando um fio de OS estão obstruindo M0, P vez executado no segmento OS M1. O programador garantir que há tópicos suficientes para executar todo o contexto P.

Aqui Insert Picture Descrição
M1 figura pode ter sido criado, ou removido do cache de threads. Quando os MO retorna, ele deve tentar obter um goroutine contexto P para correr, em circunstâncias normais, seria de outros tópicos OS onde roubar roubar um contexto aqui, se eu não roubá-lo, colocá-lo em uma fila de execução global em goroutine e depois foi para si mesmo um grande sono (para o cache de threads) cama. Contextos são também verificar periodicamente a fila de execução global, caso contrário goroutine na fila de execução global, não executado.
Aqui Insert Picture Descrição
Outro caso é atribuída a tarefa P L terminado rapidamente realizada (distribuição irregular), o que leva a um sistema secura P contexto marcha lenta bem, mas qualquer curso ocupado. Mas se não houver nenhuma tarefa fila de execução global de G, então P teria que pegar algum outro contexto G de P para apresentar lá. Em geral, se o contexto de outro contexto P P lá para roubar uma tarefa, então, em geral, 'roubar' run metade da fila, que assegura que cada segmento OS pode utilizar plenamente.

Publicado 158 artigos originais · Louvor obteve 119 · vista 810 000 +

Acho que você gosta

Origin blog.csdn.net/u013474436/article/details/103746178
Recomendado
Clasificación