Troca de contexto: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Gunnex (discussão | contribs)
Linha 1:
Em [[sistema operacional|sistemas operacionais]], uma '''troca de contexto''' (também conhecido como '''chaveamento''' ou '''mudança de contexto''') é o processo computacional de armazenar e restaurar o estado (contexto) de uma [[CPU]] de forma que múltiplos [[processo (informática)|processo]]s possam compartilhar uma única instância de CPU. É garantido que quando o contexto anterior armazenado seja restaurado, o ponto de execução volte ao mesmo estado que foi deixado durante o armazenamento.
 
Termo referente a [[sistemas operacionais]], encontrado também sobre a designação ''troca de contexto'' ou ''mudança de contexto'', que se refere à saída de uma tarefa do [[processamento]] para que outra assuma, podendo a primeira não ter sido concluída. O chaveamento garante que quando a primeira novamente voltar a ser processada todo o seu contexto de [[software]] volte ao ponto de onde ela permitiu a entrada de outro [[processo]].
 
== UsoContexto de um Processo ==
 
Existem três cenários no qual a troca de contexto ocorre. A primeira e mais comum e a [[multitarefa]]. Em uma esquema de [[escalonamento de processos]], um processo deve ser substituído por outro na CPU. Em um sistema [[preemptividade|preemptivo]], o escalonador permite que cada tarefa seja executada por um determinado tempo. Se um processo não indicar explicitamente a troca de contexto (por exemplo, ao realizar uma operação de [[E/S]]), uma interrupção de tempo é disparada, e o sistema operacional troca o contexto para outro processo. Isso assegura que a CPU não é monopolizada por um processo somente.
 
Contexto de um processo são as informações necessárias para que um processo possa ser restaurado a partir do ponto interrompido.
O segundo cenário é a [[interrupção de hardware]], presente em algumas arquiteturas (como o [[Intel]] [[x86]]). Isso significa que se a CPU requisita dados de um disco, por exemplo, ela não precisa esperar a leitura em disco terminar, podendo continuar alguma outra tarefa na fila de execução. Quando a leitura em disco é terminada, a CPU é interrompida e o resultado da leitura é disponibilizado. Antes de realizar a interrupção, o contexto do processo em execução é armazenado para futura restauração.
 
O terceiro cenário é a troca de modo usuário para modo kernel. Quando tal transição é requisitada pelo sistema operacional, uma troca de contexto não é necessária, mas dependendo da implementação isso é feito.
 
== ProcedimentoChaveamento de Contexto ==
Em uma troca de contexto, o estado do primeiro processo deve ser armazenado de alguma forma, para que quando o escalonador retorne sua execução, o estado seja antes restaurado. O estado de um processo inclui todos os registradores que o processo pode estar usando, especialmente o [[contador de programa]], e qualquer outro dado específico do sistema operacional. A estrutura que armazena todas essas informações é chamada de bloco de controle de processo.
 
Ocorre quando um novo processo é selecionado para execução, ou seja, a CPU é chaveada para um novo processo. Quando um programa deixa a CPU, para que ele possa retornar no mesmo ponto e nas mesmas condições que saiu, o estado atual do programa na CPU tem que ser salvo para que o programa possa retornar e continuar sua execução como se não tivesse sido interrompido. Isso inclui não só os registradores como também outros detalhes como, por exemplo, quais eram os arquivos que estavam abertos. Podemos dizer que este estado completo do que estava em execução define um ambiente de execução. Portanto, processo é o ambiente onde se executa um programa, a estrutura responsável pela manutenção de todas as informações necessárias a execução de um programa.
O bloco pode ser armazenado na pilha de execução do processo na memória do kernel, ou em algum outro local específico definido pelo sistema operacional. A seguir é feita a restauração do bloco de controle do processo que irá executar. Com a atualização do contador de programa, a execução do novo processo pode iniciar.
Em geral, salvar o contexto de execução do processo em execução é a primeira tarefa do SO, ao ser acionado. Da mesma forma, a última tarefa do SO ao entregar o processador para um processo é repor o seu contexto de execução. Ao repor o valor usado pelo processo no apontador de instruções (program counter), o processador volta a executar instruções do programa de usuário. O módulo do SO que realiza a reposição do contexto é chamado de dispatcher.
 
 
== PCB (Process Control Block = Bloco de Controle de Processo) ==
 
 
Para poder definir o ambiente completo de execução e assim materializar o conceito de processo, o sistema operacional mantém uma estrutura de dados que contém os todos os detalhes necessários para esta definição. Esta estrutura chama-se PCB (Process Control Block = BLOCO DE CONTROLE DO PROCESSO). Alguns sistemas dão o nome de BLOCO DE CONTROLE DA TAREFA (task control block).
O conteúdo exato do PCB varia com o sistema operacional, mas basicamente contêm dados como: ponteiro (uma forma de indicar algum outro processo), endereço de memória, nome do processo, tamanho, usuário que criou o processo, registradores (PC, SP, etc.), grupo de usuários que podem acessar o processo, prioridade, pilha, classe de escalonamento, lista de arquivos abertos, quando o processo foi iniciado, estado do processo, tempo acumulado de execução, etc.
É através de várias chamadas de sistema que o sistema operacional gerencia os processos. Todos esses elementos que definem o ambiente de execução podem ser classificados em três grandes grupos: contexto de hardware, contexto de software e espaço de endereçamento.
 
Cada bloco possui informações sobre um processo tais como:
 
• Estado em que o processo se encontra (pronto, em execução, em espera, etc.)
• Contador de instrução (aponta para a próxima instrução que será executada quando o processo ganhar a CPU).
• Valor dos registradores da CPU usados pelo processo.
• Informações para alocação da CPU (tais como prioridade, etc.)
• Informações relativas ao gerenciamento de memória (tais como base e limite do espaço de memória, etc.)
• Informações de contabilidade (tempo de CPU usado, limites de tempo, etc.)
• Informações relativas às operações de E/S (lista de dispositivos alocados, etc.)
 
Percebemos então que a impressão que temos de que os processos são “executados ao mesmo tempo” é devido à CPU sendo multiplexada entre eles.
Vale ressaltar que a mudança de contexto de uma thread para outra é muito mais rápida do que de um processo comum (processo pesado) para outro. A thread também tem a vantagem de compartilhar o mesmo espaço de endereçamento de memória e os demais recursos disponíveis para o processo pai.
A idéia de multithreading é associar vários fluxos de execução (várias threads) a um único processo. Em determinadas aplicações, é conveniente disparar várias threads dentro de um mesmo processo (programação concorrente). É importante notar que as threads existem no interior de um processo, compartilhando entre elas os recursos do processo, como o espaço de endereçamento (código e dados0. Devido a essa característica, a gerência de threads(criação, destruição, troca de contexto, sincronização) é “mais leve” quando comparada com processos.
Por outro lado, criar uma thread implica apenas definir uma pilha e um novo contexto de execução dentro de um processo já existente. O chaveamento de duas threads de um mesmo processo é muito mais rápido que o chaveamento entre dois processos. Por exemplo, como todas as threads de um mesmo processo compartilham o mesmo espaço de endereçamento, a MMU (memory management unit) não é afetada pelo chaveamento entre elas. Em função do exposto acima, threads são muitas vezes chamadas de processos leves.
A troca de contexto pode produzir um gargalo (bottleneck) fazendo decair em muito a performance. A solução empregada atualmente é a utilização de threads. O uso de threads passa pela programação, o que não é simples, e pelo suporte por parte do próprio sistema operacional, que deve suportar sua criação e controle. A idéia principal é diminuir o tempo gasto na criação/eliminação de um PCB para cada subprocesso criado. Sendo assim, subprocessos se diferenciam de threads pelo espaço de endereçamento independente que possuem. Threads compartilham o mesmo espaço de endereçamento de um processo, passando pelos mesmos estados de um processo.
O tempo de troca de contexto é puro overhead e é dependente de suporte de hardware.
 
 
== Contexto de Hardware ==
 
 
É o contexto que é copiado para o hardware (CPU) para que a execução possa ocorrer. Basicamente os registradores: PC (program counter, que contém o endereço da próxima instrução a ser executada), SP (stack pointer, o ponteiro de pilha, que é o registrador que contém o endereço de memória do topo da pilha), a pilha toda (para que a CPU, ao completar uma função ou subrotina, saiba para que endereço irá retornar), registrador de estado (PSW).
 
 
== Contexto de Software ==
 
 
São as características que vão influir na execução. O contexto de software define basicamente três grupos de informações: identificação, cotas e privilégios.
 
• Identificação – Cada processo ao ser criado recebe uma identificação, que é um número e, normalmente, também um nome. Chamamos esse número de PID (Process IDentification = identificação do processo). O processo pode receber também, de acordo com o S.O., um número relacionado à identificação do usuário que o criou UID (User IDentification = identificação do usuário) e uma identificação do grupo de usuários aos quais é permitido o acesso a arquivos, processos, etc.: GID (Group identification = identificação do grupo). Esses dois últimos estão ligados ao modelo de segurança implementado por alguns S.O. para permitir acessos ou não. Por exemplo, um usuário não pode normalmente deletar os processos de outros. O superusuário pode deletar todos os processos do sistema.
Um processo pode criar um ou mais processos (estes são chamados de processos-filho = child process). O processo filho tem um PPID (Parent Process IDentification = identificação do processo-pai), para que o filho possa retornar ao pai. O PPID de um processo-filho é o UID do processo-pai.
• Cotas – Limites de cada recurso que pode ser utilizado pelo processo. Esses limites são determinados para o processo no momento de sua criação. Alguns sistemas incluem também, dinamicamente, porcentagem do recurso já utilizado ou que ainda pode ser utilizado. Basicamente são: número máximo de arquivos abertos simultaneamente, tamanho máximo de memória que o processo pode alocar, número máximo de operações de E/S pendentes, tamanho máximo de buffers para o acesso de E/S, número máximo de subprocessos que podem ser criados.
• Privilégios – Definem o que um processo pode ou não fazer em relação ao sistema e aos outros processos. Já vimos (acima) os privilégios associados à segurança. Existem outros privilégios associados à operação e à gerência do sistema.
 
 
== Espaço de Endereçamento ==
 
 
É a área da memória onde reside o processo. Quando um programa é colocado na memória principal, para que a sua execução seja possível, temos que as instruções estão arrumadas em ordem de execução em endereços adjacentes. Logo após o bloco de instruções temos a seção de dados que serão utilizados pelo programa. Da mesma forma um processo reside na memória principal com o seu código, em endereços adjacentes, seguido de um bloco de dados.
 
[[Categoria:Sistemas operativos]]