Temps
Un article de Haypo.
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 :
- HOWTO: How to set and keep your computer's clock on time
- Intel 8253 (Wikipédia)
- Guidelines For Providing Multimedia Timer Support (Windows Hardware Developer Central)
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) :
- gettimeofday()
- ftime()
- 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
Formats date
- Calendier Grégorien : 15 octobre 1582
- UUID : précision = 100 ns
- Win64 : 1er janvier 1601
- Précision = 100 ns
- NTP : 1er janvier 1900
- 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
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