Prática de otimização de desempenho do Linux - contexto da CPU

interruptor de contexto da CPU

O Linux é um sistema operacional multitarefa, que suporta a operação simultânea de tarefas muito maiores que o número de CPUs. Essas tarefas não são executadas em paralelo no verdadeiro sentido, mas o sistema aloca CPUs para elas em um curto período de tempo, criando a ilusão de que as tarefas estão sendo executadas ao mesmo tempo.
A UCP precisa saber de onde a tarefa é carregada, e por onde começar a execução é feito através dos registradores da UCP configurados e do contador de programa (Program Counter, PC).

  • Registros da CPU: memória interna da CPU com pequena capacidade, mas velocidade extremamente rápida;
  • Contador de programa: usado para armazenar a posição da instrução que está sendo executada pela CPU, ou a posição da próxima instrução a ser executada. Todos eles são ambientes dependentes que a CPU deve executar antes de executar qualquer tarefa, por isso também são chamados de contextos da CPU.
    insira a descrição da imagem aqui
    A troca de contexto da CPU é salvar primeiro o contexto da CPU (registro da CPU e contador de programa) da tarefa anterior, depois carregar o contexto da nova tarefa para esses registros e contador de programa e, finalmente, pular para o novo local apontado pelo contador de programa. executar nova tarefa.
    Processos e threads são as tarefas mais comuns.Além disso, existem sinais de hardware que fazem com que os manipuladores de interrupção sejam chamados, o que também é uma tarefa comum.
    De acordo com diferentes tarefas, a troca de contexto da CPU pode ser dividida em vários cenários diferentes, a saber, troca de contexto de processo, troca de contexto de thread e troca de contexto de interrupção.

Troca de contexto do processo.

De acordo com o nível de privilégio, o Linux divide o espaço de execução do processo em espaço do kernel e espaço do usuário, e o nível de privilégio da CPU é Anel 0 e Anel 3.

  • O espaço do kernel (Ring 0) tem a autoridade mais alta e pode acessar diretamente todos os recursos;
  • O espaço do usuário (Ring 3) só pode acessar recursos restritos e não pode acessar diretamente dispositivos de hardware, como memória. Ele deve estar preso no kernel por meio de chamadas do sistema para acessar esses recursos privilegiados.
    insira a descrição da imagem aqui
    Os processos podem ser executados tanto no espaço do usuário quanto no espaço do kernel. Quando um processo é executado no espaço do usuário, ele é chamado de modo de usuário do processo e, quando cai no espaço do kernel, é chamado de modo de kernel do processo.

A transição do modo de usuário para o modo kernel precisa ser feita por meio de chamadas do sistema. Por exemplo, quando visualizamos o conteúdo de um arquivo, precisamos de várias chamadas de sistema para concluir: primeiro chame open() para abrir o arquivo, depois chame read() para ler o conteúdo do arquivo e chame write() para gravar o conteúdo para a saída padrão e, finalmente, chame close() para fechar o arquivo.

  1. Houve uma troca de contexto da CPU no processo da chamada do sistema?

A resposta é, claro, sim.

A posição original da instrução do modo de usuário no registrador da CPU precisa ser salva primeiro. Em seguida, para executar o código do modo kernel, os registradores da CPU precisam ser atualizados com os novos locais das instruções do modo kernel. A última coisa é pular para o modo kernel para executar a tarefa do kernel. Depois que a chamada do sistema termina, os registros da CPU precisam restaurar o estado original do usuário salvo e, em seguida, alternar para o espaço do usuário para continuar executando o processo. Portanto, no processo de uma chamada do sistema, existem na verdade duas trocas de contexto da CPU.

Durante o processo de chamada do sistema, ele não envolve recursos de estado do usuário do processo, como memória virtual, nem alterna processos. Isso é diferente do que costumamos chamar de troca de contexto de processo:

  • A troca de contexto do processo refere-se à mudança de um processo para outro processo.
  • O mesmo processo está sempre em execução durante a chamada do sistema
    . Portanto, o processo de chamada do sistema é geralmente chamado de chave de modo privilegiado, não uma chave de contexto . Mas, na verdade, durante o processo de chamada do sistema, a troca de contexto da CPU ainda é inevitável.
  1. Então, qual é a diferença entre uma troca de contexto de processo e uma chamada de sistema?

Em primeiro lugar, os processos são gerenciados e agendados pelo kernel, e a alternância de processos só pode ocorrer no estado do kernel. Portanto, o contexto de um processo inclui não apenas recursos do espaço do usuário, como memória virtual, pilhas e variáveis ​​globais, mas também o estado do espaço do kernel, como pilhas e registradores do kernel.

Portanto, a troca de contexto do processo é uma etapa a mais do que a chamada do sistema: antes de salvar o estado do kernel e os registradores da CPU do processo atual, a memória virtual, a pilha, etc. do processo precisam ser salvas; e o estado do kernel do próximo processo é carregado Depois disso, a memória virtual e a pilha do usuário do processo precisam ser atualizadas.

Conforme mostrado na figura abaixo, o processo de salvar e restaurar o contexto não é "gratuito" e requer que o kernel seja executado na CPU para ser concluído.
insira a descrição da imagem aqui
Cada troca de contexto requer dezenas de nanossegundos a vários microssegundos de tempo de CPU. Esse tempo ainda é bastante considerável, principalmente no caso de um grande número de trocas de contexto de processo, é fácil fazer com que a CPU gaste muito tempo salvando e restaurando recursos como registradores, pilhas de kernel e memória virtual, o que reduz muito o tempo real de execução.O tempo do processo. Isso é exatamente o que dissemos na seção anterior, um fator importante que leva a um aumento da carga média.

O Linux usa TLB (Translation Lookaside Buffer) para gerenciar o relacionamento de mapeamento entre a memória virtual e a memória física. Quando a memória virtual é atualizada, o TLB também precisa ser atualizado e o acesso à memória também fica mais lento. Especialmente em um sistema com vários processadores, o cache é compartilhado por vários processadores. Atualizar o cache não afetará apenas o processo do processador atual, mas também afetará os processos de outros processadores que compartilham o cache.

  1. Quando o contexto do processo será alterado?

O contexto precisa ser trocado apenas quando o processo é trocado, ou seja, o contexto precisa ser trocado apenas quando o processo é escalonado. O Linux mantém uma fila de prontos para cada CPU, classifica os processos ativos (isto é, processos que estão rodando e aguardando a CPU) de acordo com a prioridade e o tempo de espera da CPU e, em seguida, seleciona o processo que precisa de mais CPU, ou seja, o processo com a prioridade mais alta e aguarde a execução do processo com o tempo de CPU mais longo.

  1. Quando o processo será agendado para execução na CPU?

Ou seja, o processo é finalizado após a execução, e a CPU que ele utilizava antes será liberada, neste momento, um novo processo será retirado da fila de prontos para rodar. Na verdade, existem muitos outros cenários que também acionarão o escalonamento de processos, aqui vou separá-los um a um para você.

Primeiro, para garantir que todos os processos possam ser escalonados de forma justa, o tempo da CPU é dividido em fatias de tempo, e essas fatias de tempo são alocadas para cada processo por vez. Desta forma, quando a fatia de tempo de um determinado processo se esgotar, ele será suspenso pelo sistema e comutado para execução por outros processos que aguardam a UCP.

Em segundo lugar, quando os recursos do sistema são insuficientes (como memória insuficiente), o processo não pode ser executado até que os recursos sejam satisfeitos. Nesse momento, o processo também será suspenso e o sistema agendará a execução de outros processos.

Em terceiro lugar, quando um processo se suspende ativamente por meio de métodos como a função de suspensão, ele será reprogramado naturalmente.

Quarto, quando um processo com maior prioridade estiver em execução, para garantir a execução do processo de alta prioridade, o processo atual será suspenso e executado pelo processo de alta prioridade.

Quinto, quando ocorre uma interrupção de hardware, o processo na CPU será suspenso pela interrupção e, em seguida, executará o programa de serviço de interrupção no kernel.

troca de contexto de thread

A maior diferença entre um thread e um processo é que um thread é a unidade básica de agendamento, enquanto um processo é a unidade básica de propriedade de recursos .

O chamado agendamento de tarefas no kernel na verdade agenda threads; o processo fornece apenas recursos como memória virtual e variáveis ​​globais para threads. Threads e processos podem ser entendidos desta forma:

Quando um processo possui apenas uma thread, pode-se considerar que o processo é igual à thread.

Quando um processo possui vários threads, esses threads compartilham os mesmos recursos, como memória virtual e variáveis ​​globais. Esses recursos não precisam ser modificados durante as trocas de contexto.

Além disso, as threads também possuem seus próprios dados privados, como pilhas e registradores, que também precisam ser salvos durante a troca de contexto

A troca de contexto de thread pode, na verdade, ser dividida em duas situações:

Primeiro, os dois threads antes e depois pertencem a processos diferentes. Neste momento, como os recursos não são compartilhados, o processo de alternância é o mesmo que a alternância de contexto do processo.

Segundo, os dois threads antes e depois pertencem ao mesmo processo. Neste momento, como a memória virtual é compartilhada, recursos como a memória virtual permanecem inalterados durante a comutação e apenas os dados que não são compartilhados, como dados privados e registros de threads, precisam ser comutados

A troca de encadeamento dentro do mesmo processo consome menos recursos do que a troca entre vários processos, e isso também é uma vantagem do multiencadeamento em vez do multiprocesso.

interrupção mudança de contexto

Para responder rapidamente aos eventos de hardware, o processamento de interrupção interromperá o agendamento e a execução normais do processo e, em vez disso, chamará o manipulador de interrupção para responder aos eventos do dispositivo. Ao interromper outros processos, é necessário salvar o estado atual do processo, para que, após o término da interrupção, o processo ainda possa ser retomado do estado original.

Ao contrário do contexto do processo, a troca de contexto de interrupção não envolve o modo de usuário do processo. Portanto, mesmo que o processo de interrupção interrompa um processo no modo usuário, não há necessidade de salvar e restaurar recursos do modo usuário, como memória virtual e variáveis ​​globais desse processo.

O contexto de interrupção na verdade inclui apenas o estado necessário para a execução do programa de serviço de interrupção do modo kernel, incluindo registradores de CPU, pilha de kernel, parâmetros de interrupção de hardware, etc. Para a mesma CPU, o processamento de interrupção tem uma prioridade mais alta que process , portanto, a troca de contexto de interrupção não ocorre ao mesmo tempo que a troca de contexto de processo. Da mesma forma, como as interrupções interrompem o agendamento e a execução de processos normais, a maioria dos manipuladores de interrupção são curtos e concisos, para que a execução possa terminar o mais rápido possível. Além disso, como a alternância de contexto de processo, a alternância de contexto de interrupção também consome CPU, e muitas vezes de comutação consomem muita CPU e até reduzem seriamente o desempenho geral do sistema. Portanto, quando você descobrir que há muitas interrupções, é necessário prestar atenção se isso causará sérios problemas de desempenho ao seu sistema.

Como verificar o status de troca de contexto do sistema

Use vmstat (o comando vmstat é a ferramenta de monitoramento Linux/Unix mais comum, que pode exibir o valor do status do servidor em um determinado intervalo de tempo, incluindo o uso da CPU do servidor, uso de memória, troca de memória virtual, leitura e gravação de E/S) esta ferramenta , Para consultar a situação de troca de contexto do sistema,

Instalação do vmstat
Como instalar o apt-get
Instalando manualmente o coletor vmstat no Mac OS

vmstat 5O comando indica a saída de um conjunto de dados a cada 5 segundos, e os significados dos itens de parâmetro de dados são os seguintes:

  • r (Running ou Runnable): O comprimento da fila de prontos, ou seja, o número de processos rodando e esperando pela UCP;
  • b (Block): o número de processos no estado de hibernação ininterrupta;
  • swpd (swap daemon): o número de trocas do disco para a memória por segundo, usando o tamanho da memória virtual;
  • livre: o tamanho da memória física livre;
  • buffer: o tamanho do buffer entre o dispositivo e o dispositivo;
  • cache: tamanho do buffer entre cpu e memória;
  • si (swap input): O tamanho da memória virtual lida do disco por segundo. Se este valor for maior que 0, significa que a memória física não é suficiente ou a memória está vazando. É necessário encontrar a memória consumindo processo e resolvê-lo;
  • so (swap output): O tamanho da memória virtual gravada no disco por segundo.Se esse valor for maior que 0, significa que a memória virtual não é suficiente ou há vazamentos de memória;
  • bi (entrada de bloco): O número de blocos recebidos pelo dispositivo de bloco por segundo. O dispositivo de bloco aqui se refere a todos os discos e outros dispositivos de bloco no sistema. O tamanho padrão do bloco é 1024 bytes. Se não houver operação IO, será sempre 0.
  • bo (saída do bloco): O número de blocos enviados pelo dispositivo de bloco por segundo. Por exemplo, quando lemos um arquivo, bo deve ser maior que 0. bi e bo são geralmente próximos de 0, caso contrário, o IO é muito frequente e precisa ser ajustado.
  • in (interrupção): o número de interrupções por segundo;
  • cs (troca de contexto): o número de trocas de contexto por segundo;
  • us (tempo do usuário): tempo de CPU do usuário;
  • sy (tempo do sistema): tempo de CPU do sistema, se for muito alto, significa que o tempo de chamada do sistema é longo, como operações de IO frequentes;
  • id (tempo ocioso): tempo ocioso da CPU, em geral, id + us + sy = 100, id é o uso da CPU ociosa, us é o uso da CPU do usuário, sy é o uso da CPU do sistema;
  • wa (tempo de espera): aguardando o tempo de CPU do IO;
  • st (steal time): o tempo que a UCP virtual espera pela UCP física;

vmstat fornece a situação geral de troca de contexto do sistema.Se você quiser visualizar os detalhes de cada processo, precisará usar o pidstat.
Insira o comando pidstat -w 5para visualizar a alternância de contexto de cada processo.

  • cswch: Indica o número de trocas de contexto voluntárias por segundo;
  • nvcswch: Indica o número de trocas de contexto não voluntárias por segundo;

A chamada troca voluntária de contexto refere-se à troca de contexto causada pela incapacidade do processo de obter os recursos necessários . Por exemplo, a troca voluntária de contexto ocorre quando os recursos do sistema, como E/S e memória, são insuficientes. A troca involuntária de contexto refere-se à troca de contexto que ocorre porque o processo é forçado a ser agendado pelo sistema devido a motivos como a expiração do intervalo de tempo . Por exemplo, quando um grande número de processos está competindo pela CPU, é provável que ocorram trocas de contexto involuntárias.

continua

Link de referência:
1. https://zhuanlan.zhihu.com/p/406497025

Acho que você gosta

Origin blog.csdn.net/zkkzpp258/article/details/131621204
Recomendado
Clasificación