Temps

Un article de Haypo.

(Différences entre les versions)
Version du 25 novembre 2008 à 12:02 (modifier)
Haypo (Discuter | Contributions)
(Voir aussi)
← Différence précédente
Version du 25 novembre 2008 à 12:06 (modifier) (défaire)
Haypo (Discuter | Contributions)
(Epoch)
Différence suivante →
Ligne 150 : Ligne 150 :
== Epoch == == Epoch ==
- +* Calendier Grégorien : 15 octobre 1582 (aussi utilisé pour UUID)
 +* Win64 : 1er janvier 1601
* NTP : 1er janvier 1900 * NTP : 1er janvier 1900
 +* Mac : 1er janvier 1904
* TAI : 1er janvier 1958 * TAI : 1er janvier 1958
* UNIX : 1er janvier 1970 * UNIX : 1er janvier 1970
Ligne 157 : Ligne 159 :
* GPS : 1er janvier 1980 * GPS : 1er janvier 1980
* Y2K : 1er janvier 2000 * Y2K : 1er janvier 2000
 +* DateTime MS-Dos : 1er janvier 1980
 +
 +== Overflow ==
 +
 +* Timestamp POSIX (time_t) : 2038-01-19 03:14:08 (UTC) et 1901-12-13 20:45:52 (UTC)
 +* DateTime MS-Dos : 31 décembre 2107 (UTC)
== Voir aussi == == Voir aussi ==

Version du 25 novembre 2008 à 12:06

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 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 :

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

Epoch

  • Calendier Grégorien : 15 octobre 1582 (aussi utilisé pour UUID)
  • Win64 : 1er janvier 1601
  • NTP : 1er janvier 1900
  • Mac : 1er janvier 1904
  • TAI : 1er janvier 1958
  • UNIX : 1er janvier 1970
  • UTC : 1er janvier 1972
  • GPS : 1er janvier 1980
  • Y2K : 1er janvier 2000
  • DateTime MS-Dos : 1er janvier 1980

Overflow

  • Timestamp POSIX (time_t) : 2038-01-19 03:14:08 (UTC) et 1901-12-13 20:45:52 (UTC)
  • DateTime MS-Dos : 31 décembre 2107 (UTC)

Voir aussi

Article connexe

Liens externes