Temps

Un article de Haypo.

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

Gestion du temps.

Sommaire

[modifier] 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

[modifier] 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 ou PMTMR) : 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)
  • et son successeur : APIC (Advanced Programmable Interrupt Controller)

Lire la valeur HZ du noyau Linux :

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

Sources :

[modifier] 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

[modifier] 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

[modifier] 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()

[modifier] Faire une pause (libc)

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

[modifier] Temps processeur (Intel Pentium)

Voir l'article Fréquence du processeur.

[modifier] Divers

Python :

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

[modifier] 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

[modifier] Formats date

  • Calendier Julien : utilisé à partir de -45
  • Calendier Grégorien : 15 octobre 1582
    • UUID : précision = 100 ns
  • Win64 : 1er janvier 1601
    • Précision = 100 ns
  • NTP : 1er janvier 1900
    • précision = 23 nanosecondes
    • overflow 32 bits : 2036-02-07 06:28:15
  • Mac : 1er janvier 1904
    • 32 bits non signé
  • TAI : 1er janvier 1958
  • UNIX : 1er janvier 1970
    • Underflow 32 bits signé : 1901-12-13 20:45:52
    • Overflow 32 bits signé : 2038-01-19 03:14:08
  • UTC : 1er janvier 1972
  • GPS : 1er janvier 1980
  • Y2K : 1er janvier 2000
  • DateTime MS-Dos : 1er janvier 1980
    • Overflow : 31 décembre 2107

[modifier] Format durée

  • Win64: 64 bits unsigned integer, unité = 100 ns
    • Format de fichier : Microsoft Word document (.doc), ASF video (.asf)
  • 64 bits floattant, unité = 1 seconde
    • Format de fichier : AMF metadata used in Flash video (.flv)
  • AVI video
    • 3 integers (32 bits unsigned): length, rate, scale
    • seconds = length / (rate / scale)
    • (seconds = length * scale / rate)
  • WAV audio
    • 2 integers (32 bits unsigned): us_per_frame, total_frame
    • seconds = total_frame * (1000000 / us_per_frame)
  • Ogg Vorbis
    • 2 integers: sample_rate (32 bits unsigned), position (64 bits unsigned)
    • seconds = position / sample_rate

[modifier] Voir aussi

[modifier] Article connexe

[modifier] Liens externes