“Timers” e Gerenciamento de tempo pelo Kernel Disciplina: Sistemas Operacionais (COS 773) Data: 16/11/ 2005 Professor: Vitor Costa Trabalho de Lúcia C. L. Ferreira 1 Roteiro • • • • • 2 Introdução Conceitos Gerenciando o tempo Tratando interrupções de tempo Utilizando Timers Introdução O controle de tempo pelo Kernel é muito importante, pois várias de suas funções são dirigidas pelo evento “passagem do tempo”. Exemplo: – “Refresh” de tela – Desligar o motor do “floppy drive” após um período de inatividade 3 Conceitos • “Timer” ou temporizador: hw utilizado pelo Kernel para controlar a passagem do tempo; • “Tick rate”: freqüência de operação do timer (HZ); Ex: i386 HZ=1000 hertz • “Tick”: tempo discorrido entre duas interrupções de tempo sucessivas (período de 1/HZ segundos); 4 Conceitos • Jiffies: variável global que armazena o número de ticks que ocorreram desde o boot do sistema; 1seg = HZ jiffies • Timer interrupt handler: trata as interrupções relacionadas à passagem de tempo; 5 Como o Kernel gerencia o tempo Para gerenciar o tempo o Kernel utiliza dois componentes de hw: • Real-Time Clock (RTC): Utilizado para atualizar o tempo real (wall time / time of day); xtime: variável que recebe o valor do RTC no momento do boot; 6 Como o Kernel gerencia o tempo • System Timer: relógio eletrônico que oscila a uma determinada freqüência (tick-rate: HZ); Controla as interrupções de tempo 7 Como o Kernel trata as interrupções de tempo Timer Interrupt Handler • Rotina dependente da arquitetura: responsável por tratar as interrupções geradas pelo System Timer; 8 Como o Kernel trata as interrupções de tempo Timer Interrupt Handler Funções comumente executadas: – Obter o xtime-lock (jiffies, xtime) – Atualiza a RTC (RTC xtime); – Chama a rotina que independe da arquitetura 9 Como o Kernel trata as interrupções de tempo Timer Interrupt Handler • Rotina independente da arquitetura: do-timer() – Incrementa o valor da variável jiffies; – Atualiza o tempo recursos/processos em execução; – Atualiza o wall-time (time of day); – Executa o scheduler_tick(); 10 Freqüência do Timer Interrupt Arquitetura Frequência (Hertz) Alpha i386 Mips Mips64 Sparc Sparc64 x86-64 1024 1000 100 100 ou 1000 100 1000 1000 11 Time of Day Wall-time Definida na estrutura <linux/time.h> Struct timespec { time_t tv_sec; long tv_nsec; }; 12 /* segundos */ /* nanosegundos */ Utilizando Timers “Dynamic Timers” ou “Kernel Timers” • Mecanismo para “atrasar” a execução de determinadas tarefas por um tempo específico; 13 Utilizando Timers Passos: • Setup inicial; • Definir tempo de expiração; • Definir função a ser executada; • Ativar o timer; 14 Utilizando Timers Estrutura: <linux/timer.h> struct timer_list { struct list_head entry; /* entrada lista encadeada de timers */ unsigned long expires; /* valor expiração, jiffies */ spinlock_t lock; /* lock */ void (*function)(unsigned long); /* função a ser executada*/ unsigned long data; /* argumento para o “handler” */ struct tvec_t_base_s *base; /* campo interno – Não Mexer * }; 15 Utilizando Timers Exemplo struct timer_list my_timer; init_timer(&my_timer); my_timer.expires = jiffies + delay; my_timer.data = 0; my_timer.function = my_function; add_timer(&my_timer); 16