Programación Concurrente

Documentos relacionados
Bloque I: Principios de sistemas operativos

Programación Concurrente

Programación Concurrente

SISTEMAS OPERATIVOS: PROCESOS. Hilos y Procesos

Hilos (threads) Realizado por M. Curiel

Bloque I: Principios de sistemas operativos

Informática Electrónica Concurrencia

Función monitoreo descriptor archivo #include <sys/types.h> #include<unistd.h> #include<errno.h> extern void procesamiento_datos(char *, int); void pr

Estándares POSIX. Estándares base

T5-multithreading. Indice

Analista Universitario en Sistemas. Sistemas Operativos. Instituto Politécnico Superior THREADS

PARTE II PROGRAMACION CON THREADS EN C

Sincronización de Threads

Plataformas de Tiempo Real

BENEMERITA UNIVERSIDADD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN

Procesos e hilos: cálculo de

Plataformas de Tiempo Real

Hilos de ejecución POSIX

Programación Concurrente

POSIX-RT. Librería. Sistemas Informáticos de Tiempo Real Francisco Pastor Gomis

HILOS POSIX. LABORATORIO DE SISTEMAS DE OPERACIÓN I (ci 3825) Prof. Yudith Cardinale Enero marzo 2011

Existen diversas técnicas de agrupamiento. Se dividen en dos grandes categorías:

Procesos e hilos. Pablo San Segundo (C-206)

Fundamentos de los Sistemas Operativos

Programación de Multitareas utilizando Hilos

dit Concurrencia Juan Antonio de la Puente DIT/UPM UPM

Taller de pthreads. Sistemas Operativos. Verano de 2009

SISTEMAS OPERATIVOS: COMUNICACIÓN Y SINCRONIZACIÓN ENTRE PROCESOS. Desarrollo de servidores concurrentes

Sistemas Operativos I Manual de prácticas

Informática I Threads

Entorno de programación de nivel 1: La librería PCAP

Procesos ligeros. Arquitectura de Computadores II Universidad Carlos III de Madrid

Sistemas Operativos. Procesos

1. Procesos vs Hilos 2. Cuando se ejecutan los procesos 3. Fork 4. Clone 5. Cómo se ejucuta el fork? 6. do_fork() 7. copy_process 8.

SISTEMAS OPERATIVOS: Lección 5: Hilos y Procesos

Concurrencia en UNIX / LINUX. Introducción: Procesos e Hilos POSIX

Sistemas Operativos Práctica 3

Departamento de Automática

Threads en Linux. Definición de thread. Thread implementado en Linux. Creando un thread en Linux. Ing. Marcelo Doallo Threads en Linux 1/9

Sucesos asíncronos. dit. dit. Juan Antonio de la Puente DIT/UPM UPM UPM

Biblioteca de sistema

Concepto de proceso. (c) 2006 Alexis Quesada / Francisco J. Santana 2

SISTEMAS OPERATIVOS:

Introducción general al Lenguaje C (2010/2011)

Threads. Hilos - Lightweight process - Procesos ligeros

Fundamentos de los Sistemas Operativos. Tema 2. Procesos José Miguel Santos Alexis Quesada Francisco Santana

Boletín de ejercicios 2.2 Ejercicios sobre gestión básica de hilos

Sistemas Operativos 1

PROGRAMACIÓN MULTITHREADING

Prácticas de Sistemas Operativos

Funciones POSIX (I): Introducción

Tema 4: Gestión de Procesos

Clases 04 y 05: Repaso de programación de sistemas basados en UNIX

Arquitecturas cliente/servidor

Departamento de Automática

Procesos e Hilos en C

1. Interfaz de llamadas a la librería de fluxes

Plataformas de Tiempo Real

Tema 2 Comunicación y sincronización entre procesos

MC Hilda Castillo Zacatelco PROCESOS

Recursión como herramienta en resolución de problemas computacionales

Tareas Periódicas en POSIX

Arquitectura de Sistemas

Guillermo Román Díez

Programación Concurrente Recopilación de teoría referente a la materia

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Programación I Funciones

Introducción a Sistemas Operativos: Concurrencia

Bloque I: Principios de sistemas operativos

Concurrencia y paralelismo

Tema 4 El paradigma cliente-servidor

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

Cena de filosofos y sincronizacion java

Tema 6. Threads: programas multitarea

Fundamentos de programación

Tema 2. Procesos e hilos

Funciones POSIX III Funciones POSIX III. No Nombrados Nombrados. sem_open sem_open. sem_close sem_close. sem_unlink sem_unlink

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

Programación concurrente

Procesos e hilos: el downloader

Dobles: Es el caso de la instrucción if-else (punto 1.2).

Una función es un miniprograma dentro de un programa. Las funciones contienen varias

Arquitectura de Sistemas

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

1 Primitivas básicas de OpenMP

Programación 1 Grado de Ingeniería Robótica

Funciones Definición de función

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

Funciones Tipos de funciones y Recursividad

Funciones y paso de parámetros

Bloque I: Principios de sistemas operativos

Procesamiento paralelo con hilos de Java

Modularización en lenguaje C. Funciones

Tostadores y POSIX. 1. Introducción

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

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

Sistemas Complejos en Máquinas Paralelas

Taller de Sistemas Operativos. Procesos 2012

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 4. Gestión del Tiempo Tema 5. Planificación de s Tema 6. Sincronización Tema 7. Señales Tema 8. Temporizadores y Relojes de Tiempo de Ejecución Programación Concurrente oct-13 1 3.1. Procesos y threads 3.2. s POSIX: conceptos básicos 3.3. Creación de threads 3.4. Terminación de threads 3.5. Identificación de threads 3.6. Implementación de la concurrencia a nivel de threads Programación Concurrente oct-13 2 3.1 Procesos y threads 3.1 Procesos y threads El modelo de proceso proporciona protección, pero es inadecuado para sistemas que requieren alta eficiencia: Tiempos de cambio de contexto altos Tiempos de creación y destrucción altos Necesidad de hardware especial (MMU) MMU Tabla de páginas de memoria Proc 3 espacio de direcciones del proceso Proceso en ejecución Proc 1 Proc 2 Otros procesos Proc n Programación Concurrente oct-13 3

s 3.1 Procesos y threads (cont.) POSIX.1 define interfaces para soportar múltiples threads o flujos de control en cada proceso POSIX Los threads de un proceso comparten un Proceso único espacio de direcciones El estado asociado es pequeño Los tiempos de cambio de contexto son menores Los tiempos de creación y destrucción son menores Son similares a las tareas de un kernel de tiempo real de alta eficiencia Sistema mínimo (MaRTE OS): existe un único proceso Programación Concurrente oct-13 4 3.2 s POSIX: conceptos básicos 3.2 s POSIX: conceptos básicos : un flujo de control simple perteneciente a un proceso tiene un identificador de thread (tid) el tid solo es válido para threads del mismo proceso tiene su propia política de planificación, y los recursos del sistema necesarios, tales como su propio stack, etc todos los threads de un proceso comparten un único espacio de direccionamiento Proceso en una implementación multi-thread: un espacio de direccionamiento con uno o varios threads inicialmente contiene un solo thread: el thread principal el thread principal es un thread más, salvo que cuando él termina, todos los demás también Programación Concurrente oct-13 5 3.2 s POSIX: conceptos básicos s POSIX: conceptos básicos (cont.) Servicios bloqueantes: sólo se suspende el thread que invoca el servicio En MaRTE OS sobre Linux se bloquea todo el proceso Los threads tienen dos estados posibles para controlar la devolución de recursos al sistema: detached o independiente: PTHREAD_CREATE_DETACHED - cuando el thread termina, devuelve al sistema los recursos utilizados (tid, stack, etc) - no se puede esperar su terminación joinable o sincronizado: PTHREAD_CREATE_JOINABLE - cuando el thread termina, mantiene sus recursos - se liberan cuando otro thread llama a pthread_join() - por defecto un thread es "joinable" Programación Concurrente oct-13 6

Para crear un thread es preciso definir sus atributos en un objeto especial (pthread_attr_t) El objeto de atributos debe crearse antes de usarlo: pthread_attr_init() puede borrarse: pthread_attr_destroy() se pueden modificar o consultar atributos concretos del objeto (pero no los del thread, que se fijan al crearlo) Los atributos definidos son: tamaño de stack mínimo (opcional) dirección del stack (opcional) control de devolución de recursos ( detach state ) atributos de planificación (tema 5) Programación Concurrente oct-13 7 Atributos de creación: interfaz int pthread_attr_init (pthread_attr_t *attr); int pthread_attr_destroy (pthread_attr_t *attr); int pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize); int pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *stacksize); int pthread_attr_setstackaddr (pthread_attr_t *attr, void *stackaddr); int pthread_attr_getstackaddr (const pthread_attr_t *attr, void **stackaddr); int pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate); int pthread_attr_getdetachstate (const pthread_attr_t *attr, int *detachstate); PTHREAD_CREATE_DETACHED PTHREAD_CREATE_JOINABLE Programación Concurrente oct-13 8 Llamada para creación de threads Interfaz: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); Esta función: crea un nuevo thread con atributos especificados por attr devuelve el tid del nuevo thread en thread el thread se crea ejecutando start_routine(arg) si start_routine termina, es equivalente a llamar a pthread_exit (observar que esto difiere del thread main) Programación Concurrente oct-13 9

Ejemplo de creación de threads #include <stdio.h> #include <unistd.h> #include <misc/error_checks.h> // que pone pseudo-periódicamente un mensaje en pantalla // el periodo se le pasa como parámetro void *periodic (void *arg) int period; period = *((int *)arg); while (1) printf("en el thread con periodo %d\n",period); sleep (period); Programación Concurrente oct-13 10 Ejemplo de creación de threads (cont.) // Programa principal que crea dos threads pseudo-periódicos int main () pthread_t th1,th2; pthread_attr_t attr; int period1=2 int period2=3; // Crea el objeto de atributos para crear threads independientes CHK( pthread_attr_init(&attr) ); CHK( pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) ); // Crea los threads CHK( pthread_create(&th1, &attr, periodic, &period1) ); CHK( pthread_create(&th2, &attr, periodic, &period2) ); // Les deja ejecutar un rato y luego termina sleep(30); printf("thread main terminando \n"); exit (0); Programación Concurrente oct-13 11 Función para terminación de threads: void pthread_exit (void *value_ptr); Esta función termina el thread y hace que el valor apuntado por value_ptr esté disponible para una operación join se ejecutan las rutinas de cancelación pendientes al terminar un thread es un error acceder a sus variables locales Programación Concurrente oct-13 12

Terminación de threads (cont.) Se puede esperar (join) a la terminación de un thread cuyo estado es sincronizado (joinable), liberándose sus recursos: int pthread_join (pthread_t thread, void **value_ptr); También se puede cambiar el estado del thread a detached, con lo que el thread, al terminar, libera sus recursos: int pthread_detach (pthread_t thread); Por defecto el estado de un thread es joinable Existen también funciones para cancelar threads, habilitar o inhibir la cancelación, etc. (ver el manual). Programación Concurrente oct-13 13 Ejemplo: uso de pthread_join #include <stdio.h> #include <misc/error_checks.h> #define MAX 500000 #define MITAD (MAX/2) typedef struct int *ar; long n; subarray_t; // que incrementa n componentes de un array void * incrementer (void *arg) long i; subarray_t * subarray = ((subarray_t *)arg); for (i=0; i < subarray->n; i++) subarray->ar[i]++; return NULL; Programación Concurrente oct-13 14 Ejemplo: uso de pthread_join (cont.) // programa principal que reparte entre dos threads el trabajo // de incrementar los componentes de un array int main() int ar [MAX] = 0 ; // inicializa los elementos a 0 pthread_t th1,th2; subarray_t sb1,sb2; long suma=0, i; // crea los theads sb1.ar = &ar[0]; sb1.n = MITAD; // primera mitad del array CHK( pthread_create(&th1, NULL, incrementer, &sb1) ); sb2.ar = &ar[mitad]; sb2.n = MITAD; // segunda mitad del array CHK( pthread_create(&th2, NULL, incrementer, &sb2) ); // sincronizacion de espera a la finalizacion CHK( pthread_join(th1, NULL) ); CHK( pthread_join(th2, NULL) ); printf ("Ambos threads han finalizado \n"); // muestra resultados for (i=0; i<max; i++) suma=suma+ar[i]; printf ("Suma=%d\n",suma); return 0; Programación Concurrente oct-13 15

3.5 Identificación de threads Identificación del propio thread: pthread_t pthread_self(void); 3.5 Identificación de threads Comparación de tids: int pthread_equal (pthread_t t1, pthread_t t2); Programación Concurrente oct-13 16 3.6 Implementación de la concurrencia a nivel de threads stack de t1 (variables locales y llamadas a funciones anidadas) stacks de otros threads variables globales ESP 0xEF48 IP 0xA3B2 Flags 0x03E1... 0x24D3 : Código Reg. procesador código de t1 void *t1 (void *a) int i; i++; Programación Concurrente oct-13 17 Cambio de contexto Registros variables globales ESP 0xEF48 IP 0xA3B2 Flags 0x03E1... 0x24D3 void *t2 (void *a) int j; j++; código de t1 código de t2 void *t1 (void *a) int i; i++; Programación Concurrente oct-13 18

Cambio de contexto (cont.) Registros variables globales ESP 0xD15A IP 0x9313 Flags 0x28C1... 0x3A17 void *t2 (void *a) int j; j++; código de t1 código de t2 void *t1 (void *a) int i; i++; Programación Concurrente oct-13 19 Implementación de threads a nivel de librería pseudothread 1 1 MaRTE OS pseudothread 2 2 pseudothread 3 3 main thread Proceso Linux thread Linux Programación Concurrente oct-13 20