Programación Concurrente

Documentos relacionados
Gestión del tiempo en POSIX

TEMA 3. Gestión de tiempo y relojes. Gestión del Tiempo. Gestión del Tiempo. Facilidades de tiempo real. Tiempo. Noción de Tiempo. Objetivos.

Fiabilidad y Tolerancia a Fallos

Midiendo el tiempo de ejecución de un programa en Linux

Administración del Tiempo

Tiempo real. Juan Antonio de la Puente DIT/UPM. Tiempo real. Comprender el papel del tiempo en el diseño y realización de sistemas de tiempo real

Programación Concurrente

Tema 4 : señales. Sistemas Operativos: Programación de Sistemas. Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J. Santana Pérez.

Procesos e Hilos en C

Sistemas Operativos Práctica 3

Instrumentación de Tiempo Real

Programación Concurrente

Estructuras de Datos Declaraciones Tipos de Datos

Elementos de un programa en C

TEMA 3. CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO. Definición y objetivos de un S.O

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Introducción a Sistemas Operativos: Concurrencia

Programación Estructurada

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

7.3. Estructura de un programa

T5-multithreading. Indice

Programación estructurada (Introducción a lenguaje C)

SISTEMAS OPERATIVOS Arquitectura de computadores

Funciones Definición de función

En este artículo vamos a conocer los tipos de datos que podemos manejar programando en C.

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA INGENIERÍA EN INFORMÁTICA. ARQUITECTURA DE COMPUTADORES II 10 junio de 2006

Tema 5 Tabla de Símbolos

Arquitecturas cliente/servidor

TADs en C. Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013

Sistemas Operativos (prácticas) E.U. Informática en Segovia Universidad de Valladolid

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Programación. Test Autoevaluación Tema 3

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

Funciones Tipos de funciones y Recursividad

TEMA 8: Gestión dinámica de memoria

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Tostadores y POSIX. 1. Introducción

Tema 6: Memoria dinámica

Examen Fundamentos de Programación 15 de enero de 2016 Curso 2015/16

Lenguaje C Elementos de un Programa. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

Control por Computador

Programación Concurrente

de Gran Canaria Centro de Tecnología Médica Programación Concurrente

Hilos. Módulo 4. Departamento de Informática Facultad de Ingeniería Universidad Nacional de la Patagonia San Juan Bosco. Hilos

Sistemas Operativos Practica 1: procesos y concurrencia.

funciones printf scanf

Fundamentos de programación

Fundamentos de Programación 2017-I

Master SIA 2012/13. Programación de Sistemas Paralelos. OpenMP: Ejercicios prácticos. Facultad de Informática. Ejercicio 1.A. pi.c

Sistemas Operativos. Procesos

Sistemas operativos: una visión aplicada. Capítulo 2 Introducción a los sistemas operativos

Laboratorio de Arquitectura de Redes. Introducción al lenguaje C

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Informática Electrónica Manejadores de Dispositivos (Device Drivers)

Programación I Unidad III. Tema: Tipos, estructuras y uniones

Sistemas Operativos Práctica 4

Programación En Lenguaje C

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

RELOJES DE TIEMPO REAL ÍNDICE

TIPOS DE DATOS BASICOS EN LENGUAJE C

Informática Ingeniería en Electrónica y Automática Industrial

Introducción a PL/SQL

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

TEMA 5: Subprogramas, programación modular

Procesadores de lenguaje Tema 6 La tabla de símbolos

- Bajo que condiciones el algoritmo de planifiación de procesos FIFO (FCFS) resultaría en el tiempo de respuesta promedio más pequeño?

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

LENGUAJE. Tema 1 - Introducción

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

LENGUAJE. Tema 2 Elementos de un programa

Práctica 7c: Uso de estructuras en C.

PRÁCTICA DE LABORATORIO 4 Programación Orientada a Objetos

INDICE 1. Introducción 2. Entrada / Salida: Principios y Programación 3. Procesos

1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos

UNIDAD 1. Algoritmo se define como un conjunto de instrucciones que la computadora debe seguir para resolver un problema.

Sistemas Operativos I. Tema 3. Procesos. Equipo de Sistemas Operativos DISCA / DSIC UPV

Tecnología de software para sistemas de tiempo real

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Curso de Programación Avanzada en C

Paso de Parámetros a una Función

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

Estructuración del programa en partes más pequeñas y sencillas

TEMA 02 TIPOS, OPERADORES Y EXPRESIONES

Apuntadores (Punteros)

Maquina de Turing. 5. Fundamentos de algoritmos. Turing TURING TURING 10/08/2010. MI Elizabeth Fonseca Chávez

Bloque 4. La descomposición funcional y el diseño descendente

Estructuras de Repetición (Repita para)

Sistemas operativos. Hasta ahora hemos visto. Relación programa-sistema operativo Gestión de memoria

Transcripción:

Master en Computación Programación Concurrente Bloque II: Programación concurrente en POSIX Tema 1. Introducción al estándar POSIX Tema 2. Sistema Operativo MaRTE OS Tema 3. Gestión de Threads Tema 5. Planificación de Threads Tema 6. Sincronización Tema 7. Señales Tema 8. Temporizadores y Relojes de Tiempo de Ejecución Programación Concurrente oct-13 1 4.1. Conceptos Básicos 4.2. Reloj del Sistema 4.3. Relojes de Tiempo Oficial y Monótono 4.4. Funciones para Manejar Relojes 4.5. Funciones sleep 4.6. Implementación de Threads Periódicos Programación Concurrente oct-13 2 Reloj: objeto que mide el paso del tiempo Resolución (o Tick ) del reloj: el intervalo de tiempo más pequeño que el reloj puede medir La Época: las 0 horas, 0 minutos, 0 segundos del 1 de enero de 1970, UTC (Coordinated Universal Time) segundos desde la Época sec + min*60 + hour*3600 + yday*86400 + (year-1970)*31536000 + ((year-1969)/4)*86400 Programación Concurrente oct-13 3

Relojes en un sistema POSIX Reloj del sistema: - mide los segundos transcurridos desde la Época - se usa para marcar las horas de creación de ficheros, etc. Reloj de Tiempo Oficial (CLOCK_REALTIME) - reloj que mide el tiempo transcurrido desde la Época - se usa para timeouts y para crear temporizadores - puede coincidir o no con el reloj del sistema - resolución máxima: 20 ms. Precaución! - resolución mínima: 1 nanosegundo Reloj monótono (CLOCK_MONOTONIC) - el tiempo medido con este reloj siempre crece de forma monótona (no se puede cambiar su hora) Otros relojes definidos por la implementación Programación Concurrente oct-13 4 Tipo timespec El tipo timespec permite especificar el tiempo con alta resolución: struct timespec { time_t tv_sec; // segundos (32 bits con signo) long tv_nsec; // nanosegundos tiempo en nanosegundos = tv_sec*10 9 +tv_nsec 0 tv_nsec<10 9 Incómodo para hacer operaciones Fin de los tiempos según POSIX (2³¹-1 seg. después de la época) $ date -d @2147483647 Tue Jan 19 04:14:07 CET 2038 MaRTE OS proporciona <misc/timespec_operations.h> con operaciones de comparación, suma, resta, multiplicación y división de timespecs Programación Concurrente oct-13 5 4.2 Reloj del Sistema 4.2 Reloj del Sistema Leer la hora: time_t time (time_t *tloc); - time() devuelve los segundos desde la Época, según el reloj del sistema - si tloc no es NULL, también devuelve la hora en *tloc Funciones relacionadas (ver manual): gettimeofday(), ctime(), etc. Alarma: unsigned int alarm (unsigned int seconds); - envía SIGALRM cuando han transcurrido los segundos especificados - sólo se puede programar una alarma para cada proceso Programación Concurrente oct-13 6

4.3 Relojes de Tiempo Oficial y Monótono 4.3 Relojes de Tiempo Oficial y Monótono El resto de relojes soportados por el sistema se definen mediante constantes del tipo clockid_t POSIX define dos: reloj de tiempo oficial y reloj monótono cada SO puede definir más relojes si lo desea Reloj de tiempo oficial (CLOCK_REALTIME) NO es el más indicado para usar en aplicaciones de tiempo real su hora puede ser cambiada la máxima resolución permisible es de 20 ms Reloj monótono (CLOCK_MONOTONIC) el más indicado para aplicaciones de tiempo real su hora NO puede ser cambiada su origen de tiempos es indeterminado Programación Concurrente oct-13 7 4.4 Funciones para Manejar Relojes 4.4 Funciones para Manejar Relojes Cambiar la hora: int clock_settime (clockid_t clock_id, const struct timespec *tp); Leer la hora: int clock_gettime (clockid_t clock_id, struct timespec *tp); Leer la resolución del reloj: int clock_getres (clockid_t clock_id, struct timespec *res); Programación Concurrente oct-13 8 Dormir un thread: #include <unistd.h> unsigned int sleep (unsigned int seconds); el thread se suspende hasta que transcurren los segundos indicados, o se ejecuta un manejador de señal valor retornado: - 0 si duerme el intervalo solicitado - número de segundos que faltan para completar el intervalo si vuelve a causa de que una señal ha sido entregada al thread y su acción asociada era ejecutar un manejador int usleep(useconds_t useconds); // obsoleta el thread se suspende hasta que transcurren los microsegundos indicados, o se ejecuta un manejador de señal Programación Concurrente oct-13 9

Sleep de alta resolución Relativo: int nanosleep (const struct timespec *rqtp, struct timespec *rmtp); *rqtp es el tiempo a suspenderse si es interrumpida por una señal, en *rmtp retorna el tiempo que falta para finalizar la suspensión Absoluto o relativo, con especificación del reloj: int clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); clock_id es el identificador del reloj a usar flags especifica opciones; si la opción TIMER_ABSTIME está, es absoluto; si no (flags=0), es relativo Programación Concurrente oct-13 10 La necesidad de realizar una actividad de forma periódica es un requerimiento muy común en los sistemas de tiempo real En POSIX utilizaremos un thread con la siguiente estructura: void * thread_periodico (void *arg) { struct timespec next_time; // hora de activación clock_gettime(clock_monotonic, &next_time); // lazo que se ejecuta periódicamente realiza la actividad periódica; incr_timespec(&next_time,&periodo); CHK( clock_nanosleep(clock_monotonic, TIMER_ABSTIME, &next_time, NULL) ); Programación Concurrente oct-13 11 Condición de carrera con las operaciones de suspensión relativas Observar que con un sleep relativo existe una condición de carrera inevitable en un sistema multitarea pseudocódigo thread_pseudoperiodico { next_time = clock_gettime; // lazo que se ejecuta pseudo-periódicamente realiza la actividad periódica; next_time+=periodo; suspend_time=next_time-clock_gettime; sleep(suspend_time); El error se da si la tarea es expulsada después de haber leído la hora pero antes de iniciar la suspensión Programación Concurrente oct-13 12

Ejemplo: threads periódicos #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <misc/error_checks.h> #include <misc/timespec_operations.h> void * periodic (void *arg); // Programa principal, que crea dos threads periódicos int main () { pthread_t t1,t2; struct timespec per_params1,per_params2; per_params1.tv_sec=0; per_params1.tv_nsec=500000000; CHK( pthread_create (&t1, NULL, periodic, &per_params1) ); per_params2.tv_sec=1; per_params2.tv_nsec=500000000; CHK( pthread_create (&t2, NULL, periodic, &per_params2) ); sleep(30); return 0; Programación Concurrente oct-13 13 Ejemplo: threads periódicos (cont.) // Cuerpo del thread periódico que usa clock_nanosleep void * periodic (void *arg) { struct timespec next_time; // hora de activación struct timespec my_period = * (struct timespec*)arg; clock_gettime(clock_monotonic, &next_time); // lazo que se ejecuta periódicamente printf("thread con periodo sec=%ld nsec=%ld activo \n", my_period.tv_sec, my_period.tv_nsec); incr_timespec(&next_time,&my_period); CHK( clock_nanosleep(clock_monotonic, TIMER_ABSTIME, &next_time, NULL) ); return NULL; Programación Concurrente oct-13 14