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.
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.
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.
- 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.
- 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.
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.
- 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.
- 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 5
O 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 5
para 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