Pergunta

O que é exatamente salvos e restaurados em uma troca de contexto entre duas threads

  • no mesmo processo
  • entre dois processos
Foi útil?

Solução

Esta é sim uma questão complexa, pois a resposta (s) são dependentes de muitas coisas:

  1. A CPU em questão
    • Pode variar significativamente, mesmo dentro da mesma família, por exemplo, os registros adicionais adicionados para operações SSE / MMX.
  2. O sistema operacional, uma vez que controla os manipuladores de que gatilho em uma troca de contexto e decidir se o hardware do CPU (se houver) para auxiliar na troca de contexto é usado ou não.
    • Por exemplo o Windows não usa o hardware da Intel que pode fazer muito do armazenamento de troca de contexto para você, uma vez que não armazena registros de ponto flutuante.
  3. Qualquer otimizações habilitado por um programa ciente de seu próprio requisitos e capaz de informar o OS deste
    • Talvez para indicar que ele não está usando registros FP por isso não se preocupar com eles
    • Em arquiteturas com arquivos de registro consideráveis ??como a maioria RISC projeta há um benefício considerável para saber que você só precisa de um subconjunto menor destes registos

No mínimo, o uso em registos de uso geral e contador de programa registo terá de ser salvo (assumindo que o projeto comum da maioria CISC atual / style RISC CPUs de propósito geral).

Note que a tentativa de fazer apenas a quantidade mínima de esforço em relação a uma mudança de contexto é uma tema de algum interesse acadêmico

Linux, obviamente, tem mais informações disponíveis sobre isso no domínio público, embora minhas referências pode ser um pouco fora de data.

Há um ‘task_struct’, que contém um grande número de domínios relacionados com o estado de tarefa, bem como o processo que a tarefa é para.

Um deles é o ‘thread_struct’

/ * estado específico da CPU desta tarefa * / Tablet - struct thread_struct fio;
contém informações sobre descritores de cache TLS, depuração registros,
info, ponto flutuante, o modo de 86 virtual ou permissões IO falha.

cada arquitetura define o seu próprio thread_struct que identifica os registros e outros valores guardados em um switch.

Este é ainda mais complicada pela presença de registros renomear que permitem múltiplas em instruções de voo (quer através de projetos de arquitetura superescalares ou dutos relacionados). A fase de restauração de um swicth contexto provavelmente vai contar com a rede da CPU sendo restaurada em um estado inicialmente vazia, tais as instruções que ainda não tinham sido aposentados no pipeline não têm nenhum efeito e, portanto, pode ser ignorado. Isso faz com que o design da CPU muito mais difícil.

A diferença entre um processo e um fio é que o interruptor processo (que sempre significa um interruptor segmento em todos os sistemas operacionais corrente principal) terá de atualizar as informações de tradução de memória, IO informações relacionadas e permissão estruturas relacionadas.

Estes serão essencialmente ponteiros para as estruturas de dados mais ricos por isso não vai ser um custo significativo em relação à mudança de contexto fio.

Outras dicas

Quando a troca de contexto entre threads do mesmo processo, todos os não-voláteis registradores de propósito geral do thread atual são salvas e as do novo segmento são restaurados; registradores voláteis só precisa ser salvo se a execução do thread atual foi interrompida por uma interrupção. Registos de qualquer co-processador utilizado por os fios (por exemplo flutuantes processador de ponto), também devem ser guardados e restaurados Se a comutação entre threads de 2 processos, para além do que é necessário para uma mudança de contexto normal, mudanças de gestão relacionados com memória e IO também deve ser feito; e.g. proteção de memória necessária por processos é conseguido usando tabelas de páginas e tabelas do diretório de página e cada processo tem um endereço de mesa diretório página única, que tem que ser mudado quando o processo muda.

Isso depende do sistema operacional que você está usando, mas com certeza você vai ter que guardar o conteúdo de todos os registos (incluindo o contador de instruções) e carregar os registros do segmento que você está mudando.

A única diferença que vem à minha mente sobre o interruptor entre dois threads no mesmo processo é que você não perder o conteúdo do cache L1 e MMU.

Eu não tenho certeza, mas se bem me lembro também o conjunto de memória de trabalho é alterado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top