Temps

Un article de Haypo.

Retour à la page précédente Retour aux articles de programmation

Gestion du temps.

Sommaire

Unités

1 seconde s 1 seconde 1
1 milliseconde ms 0.001 seconde 10-3
1 microseconde µs 0.000001 seconde 10-6
1 nanoseconde ns 0.000000001 seconde 10-9

Horloges

Un ordinateur PC a plusieurs horloges à sa disposition :

  • Chipset Intel 8253/8254 (voir plus bas) utilisé notamment comme Programmable Interval Timer (PIT)
    • Il utilise l'IRQ 0
    • Programmable Interval Timer (PIT) : interruption 0 appelée à une fréquence donnée (lorsque le compteur retombe à zéro)
    • Peut générer une interruption à une fréquence entre 2 Hz et 8192 Hz
    • Permet également de créer des alarmes
    • Port 40h, 8253 Counter 0 Time of Day Clock (normally mode 3)
      • Fréquence minimale : 18,2 Hz (utilisée sous MS-Dos)
      • Fréquence maximale : 1.193.181,8 Hz (39375000/33)
      • Windows utilise une fréquence de 66 ou 100 Hz
      • Linux utilise une fréquence de 100, 250 ou 1000 Hz (valeur configurable)
    • Port 41h, 8253 Counter 1 RAM Refresh Counter (normally mode 2) : Mise à jour de la mémoire (RAM)
    • Port 42h, 8253 Counter 2 Cassette and Speaker Functions : Utilisé pour émettre du son le haut-parleur interne
    • Port 43h, 8253 Mode Control Register
  • « Real Time Clock » (RTC) : horloge matérielle sur la carte mère qui a son propre alimentation (une pile)
    • Il utilise l'IRQ 9
    • Lire son état : /proc/driver/rtc
    • Changer sa fréquence : /proc/sys/dev/rtc/max-user-freq
    • Lire sa valeur : /dev/rtc
    • Port 70h et 71h
  • Horloge APIC (PM Clock ?) : valeur indépendante de la fréquence du processeur => pratique quand on a des CPU à fréquence variable ou plusieurs CPUs différents
    • Fréquence de 3.579.545 Hz (?)
  • Horloge processeur (TSC) : voir l'article Fréquence du processeur
    • Instruction RDTSC
    • Fréquence : celle du processeur
    • Problème sur les processeurs changeant de fréquence (supporté sous Linux)
  • Horloge haut-précision (HPTE) : article Wikipédia. À ce que j'ai compris : ce n'est qu'une norme en cours d'écriture, il n'existe pas de matériel déjà en vente

Autre :

  • Intel 8259 : Programmable Interrupt Controller (PIC)

Lire la valeur HZ du noyau Linux :

  • sysconf(_SC_CLK_TCK)
  • en Python : « import os; print os.sysconf(2) »

Sources :

Voir aussi : Intel 8259 et son successeur APIC.

Dans les sources de Linux

  • kernel/time/clocksource.c -- include/linux/clocksource.h -- Développé par John Stultz (IBM) en février 2006
  • kernel/time.c : interface "publique" des syscalls relatifs au temps + quelques fonction outils comme do_gettimeofday() et get_jiffies_64()
  • kernel/timer.c : "time keeping", etc.
    • interpolation du temps : fonctions time_interpolator_...()
    • update_wall_time() : Uses the current clocksource to increment the wall time
  • drivers/clocksource/ : Source de temps, en particulier :
    • drivers/clocksource/acpi_pm.c : Power Management Timer (PMTMR) (3.579.545 Hz)
  • arch/i386/kernel/time.c : Gestion du temps 'RTC
  • arch/i386/kernel/hpet.c
  • arch/i386/kernel/i8253.c : Intel 8253 (PIC)
  • arch/i386/kernel/i8259.c : 8259A Programmable Interrupt Controller
  • arch/i386/kernel/tsc.c

Types et structures

  • time_t : long int
  • clock_t : long int
  • struct timeb (millisecondes)
    • time (time_t)
    • millitm (unsigned short)
    • timezone (short)
    • dstflag (short)
  • struct timeval (microsecondes)
    • int tv_sec : secondes
    • int tv_usec : microsecondes
  • struct timespec (nanosecondes)
    • tv_sec (time_t) : secondes
    • tv_nsec (long) : nano-secondes
  • struct timezone
    • tz_minuteswest (int) : Minutes à l’ouest de Greenwich
    • tz_dsttime (int) : Type de changement horaire

Lire le temps (libc)

  • time() => int : résolution en secondes
  • gettimeofday() => struct timeval : résolution en microsecondes
  • ftime() => struct timeb : résolution en millisecondes
  • clock_gettime() => struct timespec
    • CLOCK_REALTIME : Horloge temps réel globale au système
    • CLOCK_MONOTONIC : Horloge non configurable qui représente un temps monotone
    • CLOCK_PROCESS_CPUTIME_ID : Horloge CPU haute résolution pour processus
    • CLOCK_THREAD_CPUTIME_ID : Horloge CPU spécifique aux threads

Autres fonctions :

  • clock() => clock_t (résolution : ?)
  • getrusage() => struct timeval
  • times()

Faire une pause (libc)

  • sleep(unsigned int) en secondes
  • usleep(unsigned long) en microsecondes
  • select(struct timeval) en microsecondes
  • nanosleep(struct timespec) en nanosecondes

Temps processeur (Intel Pentium)

Voir l'article Fréquence du processeur.

Divers

Python :

  • time.time() utilise l'une de ces fonctions (tente l'une après l'autre) :
    1. gettimeofday()
    2. ftime()
    3. time()

syscall linux

  • sys_time (13) : get time in seconds
  • sys_stime (25) : set time
  • sys_alarm (27) : set an alarm clock for delivery of a signal
  • sys_ftime (35) (ancien apparement)
  • sys_times (43)
  • sys_gettimeofday (78)
  • sys_settimeofday (79)
  • old_select (82) : ancienne version
  • sys_setitimer (104)
  • sys_getitimer (105)
  • sys_adjtimex (124)
  • sys_select (142) : nouvelle version
  • sys_nanosleep (162)

Liste des syscalls: Linux System Call Table

Voir aussi

Article connexe

Liens externes