Temps
Un article de Haypo.
Catégorie:Programmation
 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 :
- 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)
 
[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) :
- gettimeofday()
 - ftime()
 - 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
 
 

