PDF de programación - Gestión del tiempo en POSIX

Imágen de pdf Gestión del tiempo en POSIX

Gestión del tiempo en POSIXgráfica de visualizaciones

Publicado el 15 de Octubre del 2018
153 visualizaciones desde el 15 de Octubre del 2018
46,0 KB
18 paginas
Creado hace 13a (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, &timespec_value);
clock_gettime (CLOCK_THREAD_CPUTIME_ID, &timespec_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
  • Links de descarga
http://lwp-l.com/pdf13896

Comentarios de: Gestión del tiempo en POSIX (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad