====== Contabilização de tarefas ======
:!: alterações na interface em 03/2023
{{ :so:ppos_06_contabilizacao.mkv |Video deste 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//):
Task 17 exit: execution time 4955 ms, processor time 925 ms, 171 activations
===== Cálculo dos tempos =====
A figura abaixo ilustra a execução de uma determinada tarefa, de sua criação (''task_init'') 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 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 uma função para informar às tarefas o valor corrente do relógio:
unsigned int systime () ;
===== Códigos de teste =====
* {{pingpong-contab.c|Teste 1}} ({{pingpong-contab.txt|saída esperada}}), sem usar prioridades. Neste exemplo, as tarefas devem concluir juntas, com consumo de processador e número de ativações similares.
* {{pingpong-contab-prio.c|Teste 2}} ({{pingpong-contab-prio.txt|saída esperada}}), usando prioridades. Neste exemplo, as tarefas devem concluir **em instantes bem distintos**, mas com consumo de processador e número de ativações similares (pois a carga computacional delas é a mesma).
===== Outras informações =====
* Duração estimada: 4 horas.
* Dependências:
* [[Gestão de Tarefas]]
* [[Dispatcher]]
* [[Escalonador por prioridades]] (para o teste 2)
* [[Preempção por Tempo]]