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 [2022/12/11 22:00] – [Curiosidade] 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. | ||