Alguém poderia me dizer o que exatamente é feito nas duas situações? Qual é o principal custo de cada um deles?
128
Alguém poderia me dizer o que exatamente é feito nas duas situações? Qual é o principal custo de cada um deles?
Respostas:
A principal distinção entre uma opção de encadeamento e uma opção de processo é que, durante uma opção de encadeamento, o espaço de memória virtual permanece o mesmo, enquanto não ocorre durante uma opção de processo. Ambos os tipos envolvem entregar o controle ao kernel do sistema operacional para executar a alternância de contexto. O processo de entrada e saída do kernel do SO, juntamente com o custo da saída dos registradores, é o maior custo fixo da realização de uma troca de contexto.
Um custo mais confuso é que uma troca de contexto interfere nos mecanismos de cache dos processadores. Basicamente, quando você alterna o contexto, todos os endereços de memória que o processador "lembra" em seu cache se tornam efetivamente inúteis. A única grande diferença aqui é que, quando você altera os espaços de memória virtual, o Translation Lookaside Buffer (TLB) ou equivalente do processador é liberado, tornando os acessos à memória muito mais caros por um tempo. Isso não acontece durante uma troca de thread.
fonte
A alternância de contexto do processo envolve alternar o espaço de endereço da memória. Isso inclui endereços de memória, mapeamentos, tabelas de páginas e recursos do kernel - uma operação relativamente cara. Em algumas arquiteturas, isso significa liberar vários caches de processador que não são compartilháveis nos espaços de endereço. Por exemplo, o x86 precisa liberar o TLB e alguns processadores ARM precisam liberar a totalidade do cache L1!
A troca de encadeamento é a alternância de contexto de um encadeamento para outro no mesmo processo (alternar de encadeamento para encadeamento nos processos é apenas uma troca de processo). O estado do processador de comutação (como o contador do programa e o conteúdo do registro) geralmente é muito eficiente.
fonte
Primeiro de tudo, o sistema operacional traz o thread de saída no modo kernel, se ainda não estiver lá, porque a troca de thread pode ser realizada apenas entre os threads, que é executado no modo kernel. Em seguida, o planejador é chamado para tomar uma decisão sobre o encadeamento no qual será executada a alternância. Após a tomada de decisão, o kernel salva parte do contexto do encadeamento localizado na CPU (registradores de CPU) no local dedicado na memória (frequentemente na parte superior da pilha do kernel do encadeamento de saída). Em seguida, o kernel executa a troca da pilha do kernel do thread de saída para a pilha do kernel do thread de entrada. Depois disso, o kernel carrega o contexto armazenado anteriormente do thread de entrada da memória nos registros da CPU. E, finalmente, retorna o controle de volta ao modo de usuário, mas no modo de usuário do novo thread. No caso em que o SO tenha determinado que o encadeamento recebido é executado emEm outro processo, o kernel executa uma etapa adicional: define o novo espaço de endereço virtual ativo.
O principal custo em ambos os cenários está relacionado à poluição do cache. Na maioria dos casos, o conjunto de trabalho usado pelo encadeamento de saída será significativamente diferente do conjunto de trabalho usado pelo encadeamento de entrada. Como resultado, o encadeamento de entrada começará sua vida com uma avalanche de falhas de cache, liberando assim dados antigos e inúteis dos caches e carregando os novos dados da memória. O mesmo vale para TLB (Translation Look Aside Buffer, que está na CPU). No caso de redefinição do espaço de endereço virtual (threads executados em processos diferentes), a penalidade é ainda pior, porque a redefinição do espaço de endereço virtual leva à liberação de todo o TLB, mesmose o novo encadeamento realmente precisar carregar apenas algumas novas entradas. Como resultado, o novo encadeamento iniciará seu quantum de tempo com muitas falhas de TLB e percursos de página frequentes. O custo direto da troca de threads também não é desprezível (de ~ 250 e até ~ 1500-2000 ciclos) e depende da complexidade da CPU, estados de threads e conjuntos de registros que eles realmente usam.
PS: Bom post sobre sobrecarga de mudança de contexto: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
fonte
fonte
Na Alternância de Contexto de Encadeamento, o espaço de memória virtual permanece o mesmo enquanto não estiver no caso da Alternância de Contexto de Processo. Além disso, o Process Context Switch é mais caro que o Thread Context Switch.
fonte
Eu acho que a principal diferença é quando chamamos
switch_mm()
que lida com descritores de memória de tarefas antigas e novas. No caso de encadeamentos, o espaço de endereço da memória virtual permanece inalterado (os encadeamentos compartilham memória virtual); portanto, muito pouco precisa ser feito e, portanto, menos dispendioso.fonte
Embora a troca de contexto de encadeamento precise alterar o contexto de execução (registradores, ponteiros de pilha, contadores de programas), eles não precisam alterar o espaço de endereço, como fazem as alternâncias de contexto de processos. Há um custo adicional quando você alterna o espaço de endereço, mais acesso à memória (paginação, segmentação etc.) e precisa liberar o TLB ao entrar ou sair de um novo processo ...
fonte
Em resumo, a opção de contexto do encadeamento não atribui um novo conjunto de memória e pid, ela usa o mesmo que o pai, pois está sendo executada no mesmo processo. Um processo gera um novo processo e, assim, atribui novos mem e pid.
Há muito mais do que isso. Eles escreveram livros sobre isso.
Quanto ao custo, um contexto de processo alterna >>>> thread, pois é necessário redefinir todos os contadores de pilha, etc.
fonte
Supondo que a CPU executada pelo SO tenha alguns dispositivos de alta latência conectados,
Faz sentido executar outro encadeamento do espaço de endereço do processo, enquanto o dispositivo de alta latência responde de volta.
Porém, se o dispositivo de alta latência estiver respondendo mais rapidamente do que o tempo necessário, é necessário configurar a tabela + converter as memórias virtuais em físicas para um NOVO processo, então é questionável se uma chave é essencial.
Além disso, o cache HOT (dados necessários para a execução do processo / encadeamento é alcançável em menos tempo) é a melhor opção.
fonte