Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
so:trocas_de_contexto [2020/07/26 19:23] – maziero | so:trocas_de_contexto [2022/12/11 22:04] (atual) – [Curiosidade] maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Trocas de contexto ====== | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Implementar tarefas simultâneas dentro de um processo de usuário não é uma tarefa difícil, embora alguns detalhes de baixo nível possam assustar os iniciantes, como a manipulação de registradores para as trocas de contexto. Felizmente, algumas chamadas de sistema POSIX permitem simplificar a manipulação de contextos, eliminando as operações com registradores e tornando o código portável: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * as variáveis '' | ||
+ | |||
+ | Mais informações sobre essas funções podem ser obtidas em suas respectivas páginas de manual ('' | ||
+ | |||
+ | Estude o código presente no arquivo {{contexts.c}}, | ||
+ | |||
+ | <note important> | ||
+ | A depuração passo-a-passo desse código pode apresentar alguma dificuldade, | ||
+ | |||
+ | < | ||
+ | |||
+ | Após estudar o código do arquivo, faça as seguintes atividades: | ||
+ | |||
+ | - Explique o objetivo e os parâmetros de cada uma das quatro funções acima. | ||
+ | - Explique o significado dos campos da estrutura '' | ||
+ | - Explique cada linha do código de '' | ||
+ | - Para visualizar melhor as trocas de contexto, desenhe o [[diagrama de tempo]] dessa execução. | ||
+ | |||
+ | ===== Curiosidade ===== | ||
+ | |||
+ | Trocas de contexto são implementadas dentro do núcleo, por código sucinto mas geralmente complexo. Veja um [[https:// | ||
+ | |||
+ | <code c> | ||
+ | /* | ||
+ | * Switch to stack of the new process and set up | ||
+ | * his segmentation registers. | ||
+ | */ | ||
+ | retu(rp-> | ||
+ | sureg(); | ||
+ | /* | ||
+ | * If the new process paused because it was | ||
+ | * swapped out, set the stack level to the last call | ||
+ | * to savu(u_ssav). | ||
+ | * which is executed immediately after the call to aretu | ||
+ | * actually returns from the last routine which did | ||
+ | * the savu. | ||
+ | * | ||
+ | * You are not expected to understand this. < | ||
+ | */ | ||
+ | if(rp-> | ||
+ | rp-> | ||
+ | aretu(u.u_ssav); | ||
+ | } | ||
+ | /* | ||
+ | * The value returned here has many subtle implications. | ||
+ | * See the newproc comments. | ||
+ | */ | ||
+ | return(1); | ||
+ | </ | ||
+ | |||
+ | ===== Outras informações ===== | ||
+ | |||
+ | * Duração estimada: 2 horas. | ||