====== Contabilização de tarefas ======
Este projeto faz parte do [[PPOS-v2:start|PPOS v2]].
Neste projeto, você irá adicionar mecanismos para contabilizar o uso do processador pelas tarefas em execução. Sua implementação deve produzir uma mensagem de saída com o seguinte formato, para cada tarefa que finaliza (incluindo o próprio //dispatcher//):
PPOS: task 3 (peng) exit code 0, 42562 ms elapsed time, 8512 ms cpu time, 852 activations
Valores impressos:
* ''3'': task id
* ''peng'': nome da tarefa
* ''0'': exit code (informado em ''task_exit'')
* ''42562'': tempo de vida
* ''8512'': tempo de CPU
* ''852'': número de ativações
Essa mensagem deve ser gerada pelo despachante, assim que a tarefa encerrar.
===== Cálculo dos tempos =====
A figura abaixo ilustra a execução de uma determinada tarefa, de sua criação (''task_create'') ao seu encerramento (''task_exit''). As áreas em verde indicam o uso do processador. É fácil perceber como os valores de contabilização podem ser calculados:
{{ contabilização.png |}}
Para a contabilização você precisará de uma **referência de tempo** (ou seja, um relógio). Para isso, pode ser definida uma variável global (em ''time.c'') para contar //ticks// de relógio, incrementada a cada interrupção do temporizador (1 ms). Dessa forma, essa variável indicará o número de //ticks// decorridos desde a inicialização do sistema na função ''ppos_init'', ou seja, funcionará como um relógio baseado em milissegundos.
Um dos objetivos deste projeto é entender como é implementada a contagem de tempo no kernel de um SO. Por isso, você deve construir seu próprio relógio, sem usar funções de consulta ao relógio do Linux como ''gettimeofday'' e outras.
Você deverá implementar a seguinte função em ''time.c'' para informar às tarefas o valor corrente do relógio:
int systime () ;
===== Arquivos =====
Os seguintes arquivos são relevantes para este projeto:
* ''kernel/time.c'': gestão de tempo
* ''kernel/task.c'': gestão de tarefas
* ''kernel/tcb.c'': define a estrutura do task control block
* ''test/pingpong-contab.c'': teste sem prioridades; as tarefas devem concluir juntas, com tempos de vida e de CPU similares e número de ativações também similares.
* ''test/pingpong-contab-prio.c'': teste com prioridades; as tarefas devem ter tempos de vida bem distintos, mas tempo de CPU e número de ativações similares (pois a carga computacional delas é a mesma).
* ''test/pingpong-contab-stress.c'': teste para verificar se seu sistema se comporta bem com muitas tarefas (todas têm a mesma prioridade e mesma carga computacional).
* ''test/pingpong-contab*.txt'': saídas esperadas (pequenos desvios são aceitáveis)
===== Outras informações =====
* Duração estimada: 4 horas.
* Dependências:
* [[Tarefas cooperativas]]
* [[Despachante de tarefas]]
* [[Escalonador por prioridades]] (para o teste 2)
* [[Preempção por Tempo]]