Publicado el 15 de Octubre del 2018
572 visualizaciones desde el 15 de Octubre del 2018
46,0 KB
18 paginas
Creado hace 19a (16/02/2006)
ditdit
UPM
Gestión del tiempo
en POSIX
Juan Antonio de la Puente
DIT/UPM
Relojes en C / POSIX
Hay dos tipos de relojes
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
u Reloj calendario (ANSI C)
– Proporciona valores de tiempo con resolución de 1s
u Relojes de tiempo real (POSIX)
– Se pueden definir distintos relojes
– Estándar: CLOCK_REALTIME y CLOCK_MONOTONIC
– La resolución de la representación es de 1ns
– La granularidad depende de la implementación
» como máximo 20 ms
16/02/2006
Gestión del tiempo en POSIX
1
Reloj-calendario
typedef … time_t;
struct tm {
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
[0,60] */
int tm_Sec; /* seconds since the hour
int tm_min; /* minutes since the second [0,59] */
int tm_hour; /* hours since midnight [0,23] */
int tm_mday; /* day of the month [1,31] */
int tm_ymon; /* months since January [0,11] */
int tm_year; /* year since 1900 */
int tm_day; /* days since Sunday [0.6] */
int tm_yday; /* days since January 1 [0.365]*/
int tm_isdst; /* DST flag */
}
double difftime (time_t time2,time_t time1);
time_t mktime (struct tm* tp);
time_t time (time_t* tp);
16/02/2006
Gestión del tiempo en POSIX
2
Relojes de tiempo real
u El tiempo se representa mediante el tipo timespec
struct timespec {
time_t tv_sec; /* segundos */
long tv_nsec; /* nanosegundos */
}
typedef .. clockid_t
El tipo clockid_t sirve para identificar distintos relojes
– CLOCK_REALTIME y CLOCK_MONOTONIC son constantes de este
tipo
– Puede haber otros relojes
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
3
Operaciones con relojes
u Leer la hora:
int clock_gettime (clockid_t clockid,
struct timespec *tp);
u Poner en hora
int clock_settime (clockid_t clockid,
struct timespec *tp);
– no se puede usar con CLOCK_MONOTONIC
u Resolución del reloj
int clock_getres (clockid_t clockid,
struct timespec *res);
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
4
Retardo relativo
u La función
unsigned sleep (unsigned seconds);
suspende la hebra que la invoca durante un número
entero de segundos
u La función
int nanosleep (const struct timespec *rqtp,
struct timespec *rmtp;)
permite especificar retardos con mayor precisión
– la resolución es la de CLOCK_REALTIME)
– la duración del retardo es rqtp
– rmtp es el tiempo que queda si el retardo se interrumpe
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
5
Retardos con relojes de tiempo real
u La función
int clock_nanosleep (clockid_t clock_id,
flags,
int
const struct timespec *rtpq,
struct timespec *rmpt);
permite especificar el reloj en que se basa el retardo
– por ejemplo, CLOCK_MONOTONIC
– si se pone TIMER_ABSTIME en flags el retardo es absoluto
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
6
Ejemplo: tarea periódica
void periodic () {
struct timespec next, period;
if (clock_gettime (CLOCK_MONOTONIC, &next) != 0) error();
period.tv_sec
period.tv_nsec = 10.0E6; /* 10 ms */
= 0;
while (1) {
if (clock_nanosleep (CLOCK_MONOTONIC, TIMER_ABSTIME,
&next, 0) != 0) error();
acción periódica
next = next + period;
}
}
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
7
Espera temporizada (1)
u La función
int pthread_cond_timedwait (pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *abstime);
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
permite limitar el tiempo durante el cual se espera una
condición
u El límite es absoluto y su valor es abstime
u El reloj al que se refiere es un atributo de la condición
16/02/2006
Gestión del tiempo en POSIX
8
Espera temporizada (2)
u Para limitar el tiempo de espera de una señal se usa
int sigtimedwait (const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout);
u Aquí timeout es un intervalo de tiempo relativo, medido
con CLOCK_MONOTONIC
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
9
Temporizadores
u Se pueden crear temporizadores asociados a relojes
u Cada temporizador se identifica mediante un valor del tipo
timer_t
u El tiempo de espera se especifica mediante un valor de
tipo itimerspec:
struct itimerspec {
struct timespec it_value; /* expiración */
struct timespec it_interval; /* período */
}
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
10
Creación de temporizadores
u La función
int timer_create (clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid);
crea un temporizador asociado al reloj clock_id
– *evp indica el tipo de notificación que se produce al expirar el
temporizador
– el identificador del temporizador se devuelve en timer_id
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
11
Armar un temporizador
u Se usa la función
int timer_settime (timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue);
– La temporización puede ser relativa o absoluta,
según el valor de flags
– El funcionamiento se repite periódicamente si
value.it_period > 0
– En *ovalue se devuelve el valor que quedaba de la temporización
anterior
16/02/2006
Gestión del tiempo en POSIX
12
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Ejemplo: tarea periódica (1)
void periodic () {
int signum; /* señal recibida */
sigset_t set; /* señales a las que se espera */
struct sigevent sig; /* información de señal */
timer_t timer;
struct itimerspec required, old;
struct timespec first, period;
sig.sigev_notify = SIGEV_SIGNAL;
sig.sigev_signo
= SIGRTMIN;
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
if (clock_gettime (CLOCK_MONOTONIC, &first) != 0) error();
first.tv_sec
period.tv_sec
period.tv_nsec = 10.0E6;
required.it_value = first;
required.it_interval = period;
= first.tv_sec + 1;
= 0;
/* 10 ms */
16/02/2006
Gestión del tiempo en POSIX
13
Ejemplo: tarea periódica (2)
if (timer_create(CLOCK_MONOTONIC,&sig,&timer) != 0) error();
if (sigemptyset(&set) != 0) error ();
if (sigaddset(&set, SIGRTMIN) != 0) error();
if (timer_settime(timer,0, &required, &old) != 0) error ();
while (1) {
if (sigwait(&set, &signum) != 0) error();
acción periódica
}
}
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
14
Relojes de tiempo de ejecución
u Hay un reloj de tiempo de ejecución para cada hebra
– se identifica como CLOCK_THREAD_CPUTIME_ID
u También hay se puede obtener el identificador con:
int pthread_clock_getcpuclockid (pthreadt_t threadid,
clockid_t *clockid);
u Se pueden efectuar las mismas operaciones que con
cualquier reloj:
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
clock_settime (CLOCK_THREAD_CPUTIME_ID, ×pec_value);
clock_gettime (CLOCK_THREAD_CPUTIME_ID, ×pec_value);
16/02/2006
Gestión del tiempo en POSIX
15
Temporizadores de tiempo de ejecución
u Como los de tiempo real
timer_create (CLOCK_THREAD_CPUTIME_ID, &event, &cputimer);
timer_settime (&cputimer, 0, &required, &old);
– Se pueden usar para detectar si una hebra sobrepasa el tiempo de
cómputo especificado
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
16
Resumen
u POSIX contiene un repertorio completo de mecanismos
para gestionar el tiempo de ejecución
– relojes de tiempo real, reloj monótono
– retardos absolutos y relativos
– límites de tiempo en operaciones
– temporizadores de tiempo real
– relojes y temporizadores de tiempo de ejecución
5
0
0
2
-
2
0
0
2
e
t
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
16/02/2006
Gestión del tiempo en POSIX
17
Comentarios de: Gestión del tiempo en POSIX (0)
No hay comentarios