Ir para o conteúdo

Troca de contexto

Origem: Wikipédia, a enciclopédia livre.

Em computação, uma troca de contexto é o processo de armazenar o estado de um processo ou thread, de forma que ele possa ser restaurado e a execução retomada posteriormente, e então restaurar um estado diferente, previamente salvo.[1] Isso permite que múltiplos processos compartilhem uma única unidade central de processamento (CPU) e é uma característica essencial de um sistema operacional multiprogramável ou multitarefa. Em uma CPU tradicional, cada processo um programa em execução usa os vários registradores da CPU para armazenar dados e manter o estado atual do processo em execução. No entanto, em um sistema operacional multitarefa, o sistema operacional alterna entre processos ou threads para permitir a execução simultânea de múltiplos processos.[a] Para cada troca, o sistema operacional deve salvar o estado do processo em execução e, em seguida, carregar o estado do próximo processo que será executado na CPU. Essa sequência de operações que armazena o estado do processo em execução e carrega o próximo processo em execução é chamada de troca de contexto.

O significado preciso da expressão "troca de contexto" varia. Em um contexto multitarefa, refere-se ao processo de armazenar o estado do sistema para uma tarefa, permitindo que essa tarefa seja 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 de CPU para outras tarefas. Alguns sistemas operacionais também exigem uma troca de contexto para alternar entre tarefas em modo usuário e em modo kernel. O processo de troca de contexto pode ter um impacto negativo no desempenho do sistema.[2]:28

As trocas de contexto geralmente exigem alto poder computacional, e grande parte do projeto de sistemas operacionais visa otimizar seu uso. A transição entre processos requer um certo tempo para a administração. Salvar e carregar registradores e mapas de memória, atualizar várias tabelas e listas, etc. O que está realmente envolvido em uma troca de contexto depende das arquiteturas, dos sistemas operacionais e da quantidade de recursos compartilhados (threads que pertencem ao mesmo processo compartilham muitos recursos em comparação com processos não relacionados e não cooperativos).

Por exemplo, no kernel do Linux, a troca de contexto envolve o carregamento do bloco de controle de processo (PCB) correspondente, armazenado na tabela PCB na pilha do kernel, para recuperar informações sobre o estado do novo processo. As informações de estado da CPU, incluindo os registradores, o ponteiro de pilha e o contador de programa, bem como informações de gerenciamento de memória, como tabelas de segmentação e tabelas de páginas (a menos que o processo antigo compartilhe a memória com o novo), são carregadas do PCB para o novo processo. Para evitar traduções de endereço incorretas no caso de os processos anterior e atual utilizarem memórias diferentes, o buffer de tradução antecipada (TLB) deve ser limpo. Isso afeta negativamente o desempenho, pois cada referência de memória ao TLB resultará em uma falha, uma vez que ele estará vazio após a maioria das trocas de contexto.[3][4]

Notas e referências

Notas

  1. Ou sequencialmente, tão rapidamente que parecem ser simultâneas.

Referências

  1. Douglas Comer; Timmothy V. Fossum (1988). «4 Scheduling and Context Switching». Operating System Design. I: The XINU Approach (PC Edition). [S.l.]: Prentice Hall. p. 67. ISBN 0-13-638180-4. Context switching lies at the heart of the process juggling act. It consists of stopping the current computation, saving enough information so it may be restarted later, and restarting another process.
  2. Tanenbaum, Andrew S.; Bos, Herbert (20 de março de 2014). Modern Operating Systems (em inglês) 4th ed. [S.l.]: Pearson. ISBN 978-0133591620
  3. IA-64 Linux Kernel: Design and Implementation, 4.7 Switching Address Spaces
  4. Operating Systems, 5.6 The Context Switch, p. 118

Ligações externas

[editar | editar código]