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 actuelle (25 novembre 2008 à 12:19) (modifier) (défaire) Haypo (Discuter | Contributions) (→Formats date) |
||
(4 révisions intermédiaires masquées) | |||
Ligne 148 : | Ligne 148 : | ||
Liste des syscalls: [http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html Linux System Call Table] | Liste des syscalls: [http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html Linux System Call Table] | ||
- | == | + | == 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 | * 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 | * TAI : 1er janvier 1958 | ||
* UNIX : 1er janvier 1970 | * 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 | * UTC : 1er janvier 1972 | ||
* GPS : 1er janvier 1980 | * GPS : 1er janvier 1980 | ||
* Y2K : 1er janvier 2000 | * 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 | ||
== Voir aussi == | == Voir aussi == |
Version actuelle
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