====== 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.
Este projeto visa explicar o funcionamento básico das trocas de contexto, usando uma pequena **biblioteca de trocas de contexto** em modo usuário. Essa biblioteca foi escrita em linguagem de máquina, pois a manipulação direta de registradores é difícil de fazer em linguagens de alto nível.
A biblioteca usada é específica para processos Linux executando em processadores Intel/AMD de 64 bits. Sua execução em outros ambientes exige diversas adaptações. O padrão POSIX definiu uma biblioteca portável para trocas de contexto em modo usuário, chamada [[https://en.wikipedia.org/wiki/Setcontext|ucontext]], que foi descontinuada.
===== Tarefa =====
* Estude o conteúdo dos arquivos em {{ context.tgz |}}:
* ''contexts.c'' : programa de teste
* ''ctx.h'' : definições
* ''ctx.s'' : implementação (assembly)
* Compile e execute o programa (''make'') e explique seu funcionamento.
* Explique o objetivo da estrutura ''ctx_t'' definida em ''ctx.h''.
* Explique o objetivo e os parâmetros das funções definidas em ''ctx.h''.
* Explique cada linha do código de teste que chame uma dessas funções.
* Para visualizar melhor as trocas de contexto, desenhe o [[so:diagrama de tempo]] dessa execução.
A depuração passo a passo desse código com o ''gdb'' pode apresentar alguma dificuldade, devido às trocas de contexto. Sugere-se inserir pontos de parada (//breakpoints//) nos trechos mais críticos (antes e depois das chamadas a ''ctx_swap'', por exemplo) e depurar "saltando" de um ponto ao próximo.
===== A entregar =====
=) Nada!
:-D Basta estudar e entender o código da biblioteca e do teste...
===== Curiosidade =====
Trocas de contexto são implementadas dentro do núcleo, por código sucinto mas geralmente complexo. Veja um [[https://en.wikipedia.org/wiki/A_Commentary_on_the_UNIX_Operating_System#%E2%80%9CYou_are_not_expected_to_understand_this%E2%80%9D|comentário do código de troca de contexto]] de uma versão inicial do UNIX (anos 1970):
/*
* Switch to stack of the new process and set up
* his segmentation registers.
*/
retu(rp->p_addr);
sureg();
/*
* If the new process paused because it was
* swapped out, set the stack level to the last call
* to savu(u_ssav). This means that the return
* 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->p_flag&SSWAP) {
rp->p_flag =& ~SSWAP;
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.