Mudança de contexto - Context switch

Na computação , uma troca de contexto é o processo de armazenar o estado de um processo ou thread , para que possa ser restaurado e retomar a execução em um ponto posterior. Isso permite que vários processos compartilhem uma única unidade de processamento central (CPU) e é um recurso essencial de um sistema operacional multitarefa .

O significado preciso da frase “mudança de contexto” varia. Em um contexto multitarefa, refere-se ao processo de armazenamento do estado do sistema para uma tarefa, de forma que a tarefa possa ser pausada e outra retomada. Uma troca de contexto também pode ocorrer como resultado de uma interrupção , como quando uma tarefa precisa acessar o armazenamento em disco , liberando tempo da CPU para outras tarefas. Alguns sistemas operacionais também exigem uma alternância de contexto para alternar entre o modo de usuário e as tarefas do modo kernel . O processo de troca de contexto pode ter um impacto negativo no desempenho do sistema.

Custo

As alternâncias de contexto geralmente são computacionalmente intensivas e grande parte do projeto de sistemas operacionais é para otimizar o uso de alternâncias de contexto. Mudar de um processo para outro requer uma certa quantidade de tempo para fazer a administração - salvar e carregar registros e mapas de memória, atualizar várias tabelas e listas, etc. O que está realmente envolvido em uma mudança de contexto depende das arquiteturas, sistemas operacionais e o número de recursos compartilhados (threads que pertencem ao mesmo processo compartilham muitos recursos em comparação com processos não cooperantes não relacionados). Por exemplo, no kernel do Linux , a troca de contexto envolve a troca de registros, ponteiro de pilha (é um registro ponteiro de pilha típico ), contador de programa , esvaziando o buffer lookaside de tradução (TLB) e carregando a tabela de página do próximo processo a ser executado (a menos que o processo antigo compartilha a memória com o novo). Além disso, a troca de contexto análoga ocorre entre os threads do usuário , notadamente os threads verdes , e geralmente é muito leve, salvando e restaurando o contexto mínimo. Em casos extremos, como alternar entre goroutines em Go , uma alternância de contexto é equivalente a um rendimento de co - rotina , que é apenas um pouco mais caro do que uma chamada de sub - rotina .

Trocando casos

Existem três gatilhos potenciais para uma mudança de contexto:

Multitarefa

Mais comumente, em algum esquema de agendamento , um processo deve ser desligado da CPU para que outro processo possa ser executado. Essa troca de contexto pode ser acionada pelo processo que se torna impossível de executar, por exemplo, ao esperar a conclusão de uma operação de E / S ou sincronização . Em um sistema multitarefa preventivo , o planejador também pode alternar processos que ainda podem ser executados. Para evitar que outros processos fiquem sem tempo de CPU, os agendadores preventivos geralmente configuram uma interrupção do cronômetro para disparar quando um processo excede sua fatia de tempo . Essa interrupção garante que o planejador obterá o controle para realizar uma troca de contexto.

Manuseio de interrupção

As arquiteturas modernas são conduzidas por interrupções . Isso significa que se a CPU solicitar dados de um disco, por exemplo, ela não precisa esperar ocupado até que a leitura termine; ele pode emitir a solicitação (para o dispositivo de E / S) e continuar com alguma outra tarefa. Quando a leitura termina, a CPU pode ser interrompida (por um hardware, neste caso, que envia a solicitação de interrupção ao PIC ) e apresentada com a leitura. Para interrupções, um programa chamado manipulador de interrupções é instalado e é o manipulador de interrupções que controla a interrupção do disco.

Quando ocorre uma interrupção, o hardware muda automaticamente uma parte do contexto (pelo menos o suficiente para permitir que o manipulador retorne ao código interrompido). O manipulador pode salvar contexto adicional, dependendo dos detalhes dos designs de hardware e software específicos. Freqüentemente, apenas uma parte mínima do contexto é alterada para minimizar a quantidade de tempo gasto no tratamento da interrupção. O kernel não gera ou agenda um processo especial para lidar com interrupções, mas em vez disso, o manipulador é executado no contexto (geralmente parcial) estabelecido no início do tratamento de interrupção. Assim que o serviço de interrupção for concluído, o contexto em vigor antes da interrupção ocorrer é restaurado para que o processo interrompido possa retomar a execução em seu estado adequado.

Troca de modo de usuário e kernel

Quando o sistema faz a transição entre o modo de usuário e o modo kernel , uma troca de contexto não é necessária; uma transição de modo não é por si só uma troca de contexto. No entanto, dependendo do sistema operacional, uma troca de contexto também pode ocorrer neste momento.

Passos

Em um switch, o estado do processo atualmente em execução deve ser salvo de alguma forma, para que quando for reprogramado, esse estado possa ser restaurado.

O estado do processo inclui todos os registros que o processo pode estar usando, especialmente o contador do programa , além de quaisquer outros dados específicos do sistema operacional que possam ser necessários. Isso geralmente é armazenado em uma estrutura de dados chamada bloco de controle de processo (PCB) ou switchframe .

O PCB pode ser armazenado em uma pilha por processo na memória do kernel (em oposição à pilha de chamadas do modo de usuário ) ou pode haver alguma estrutura de dados definida pelo sistema operacional específico para essas informações. Um identificador para o PCB é adicionado a uma fila de processos que estão prontos para serem executados, geralmente chamada de fila pronta .

Como o sistema operacional suspendeu efetivamente a execução de um processo, ele pode alternar o contexto escolhendo um processo na fila de espera e restaurando seu PCB. Ao fazer isso, o contador do programa do PCB é carregado e, portanto, a execução pode continuar no processo escolhido. A prioridade do processo e da thread pode influenciar qual processo é escolhido na fila pronta (ou seja, pode ser uma fila prioritária ).

Exemplo

Considerando uma operação de adição aritmética geral A = B + 1. A instrução é armazenada no registro de instrução e o contador do programa é incrementado. A e B são lidos da memória e armazenados nos registros R1 e R2, respectivamente. Nesse caso, B + 1 é calculado e escrito em R1 como a resposta final. Esta operação, pois há leituras e gravações sequenciais e não há esperas pelas chamadas de função usadas, portanto, nenhuma troca / espera de contexto ocorre neste caso.

No entanto, certas instruções especiais requerem chamadas de sistema que requerem mudança de contexto para processos de espera / suspensão. Um manipulador de chamadas do sistema é usado para alternar o contexto para o modo kernel . Uma função display (data x) pode requerer dados x do disco e um driver de dispositivo no modo kernel, portanto, a função display () entra em hibernação e aguarda a operação READ para obter o valor de x do disco , fazendo com que o programa para esperar e uma espera pela chamada de função para a configuração liberada a instrução atual para entrar em suspensão e esperar que o syscall o ative. Para manter a simultaneidade, no entanto, o programa precisa reexecutar o novo valor e o processo de hibernação juntos novamente.

atuação

A troca de contexto em si tem um custo de desempenho, devido à execução do agendador de tarefas , liberações de TLB e indiretamente devido ao compartilhamento do cache da CPU entre várias tarefas. Alternar entre threads de um único processo pode ser mais rápido do que entre dois processos separados, porque os threads compartilham os mesmos mapas de memória virtual , portanto, uma liberação de TLB não é necessária.

O tempo para alternar entre dois processos separados é chamado de latência de alternância de processo . O tempo para alternar entre dois encadeamentos do mesmo processo é chamado de latência de troca de encadeamento . O tempo desde quando uma interrupção de hardware é gerada até quando a interrupção é atendida é chamado de latência de interrupção .

Alternar entre dois processos em um único sistema operacional de espaço de endereço pode ser mais rápido do que alternar entre dois processos em um sistema operacional com espaços de endereço privados por processo.

Hardware vs. software

A comutação de contexto pode ser realizada principalmente por software ou hardware. Alguns processadores, como o Intel 80386 e seus sucessores, têm suporte de hardware para mudanças de contexto, fazendo uso de um segmento de dados especial designado por segmento de estado de tarefa (TSS). Uma troca de tarefa pode ser disparada explicitamente com uma instrução CALL ou JMP direcionada a um descritor TSS na tabela de descritor global . Pode ocorrer implicitamente quando uma interrupção ou exceção é disparada se houver uma porta de tarefa na tabela do descritor de interrupção (IDT). Quando ocorre uma troca de tarefa, a CPU pode carregar automaticamente o novo estado do TSS.

Como acontece com outras tarefas executadas em hardware, seria de se esperar que fosse bem rápido; no entanto, os sistemas operacionais convencionais, incluindo Windows e Linux , não usam esse recurso. Isso se deve principalmente a dois motivos:

  • A troca de contexto de hardware não salva todos os registros (apenas registros de uso geral, não registros de ponto flutuante - embora o TSbit seja automaticamente ativado no CR0 registro de controle , resultando em uma falha ao executar instruções de ponto flutuante e dando ao sistema operacional a oportunidade de salvar e restaurar o estado de ponto flutuante conforme necessário).
  • Problemas de desempenho associados, por exemplo, a comutação de contexto de software pode ser seletiva e armazenar apenas os registros que precisam ser armazenados, enquanto a comutação de contexto de hardware armazena quase todos os registros, sejam eles necessários ou não.

Veja também

Referências

links externos