Temps

Un article de Haypo.

(Différences entre les versions)
Version du 25 novembre 2008 à 12:09 (modifier)
Haypo (Discuter | Contributions)

← Différence précédente
Version du 25 novembre 2008 à 12:11 (modifier) (défaire)
Haypo (Discuter | Contributions)
(Formats)
Différence suivante →
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 ==+== Formats date ==
* Calendier Grégorien : 15 octobre 1582 * Calendier Grégorien : 15 octobre 1582
Ligne 166 : Ligne 166 :
* DateTime MS-Dos : 1er janvier 1980 * DateTime MS-Dos : 1er janvier 1980
** Overflow : 31 décembre 2107 ** 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 du 25 novembre 2008 à 12:11

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

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

Voir aussi

Article connexe

Liens externes