Programación Concurrente

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

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

Sincronización de procesos en C

Gestión del tiempo en POSIX

Boletín 5- Señales. Departamento de Lenguajes y Sistemas Informáticos

Procesos e Hilos en C

Sistemas Operativos Práctica 3

PRÁCTICAS DE SS.OO. Universidad de Murcia. I.I./I.T.I. Sistemas/I.T.I. Gestión

Sistemas Operativos. Procesos

Práctica 2: Realización de una Alarma Temporizada Diseño de Sistemas Operativos U.L.P.G.C.

Funciones Definición de función

Control por Computador

EDITRAN/TR. Windows/Unix. Manual de referencia

Programación Concurrente

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

Tema 4: Corrección y Robustez en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

!! Identificar las señales que llegan a la consola.

Sistemas Operativos Practica 1: procesos y concurrencia.

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Elementos de un programa en C

Procesos Concep Conce to de Proceso Multitarea Información del proceso (BCP) Creación de procesos T rminación de procesos

Arquitecturas cliente/servidor

LENGUAJE. Tema 1 - Introducción

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

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

Fundamentos de programación

SISTEMAS OPERATIVOS 2 INGENIERIA TECNICA INFORMATICA SISTEMAS CORRECCION PRACTICA 3: SEÑALES Y CREDENCIALES CURSO

Llamadas al Sistema. Laboratorio de Arquitectura de Ordenadores

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

Programación Concurrente

Funciones y paso de parámetros

Tema 3. Concurrencia entre procesos

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

T5-multithreading. Indice

Procesos Definición y Estados

Tema 6: Memoria dinámica

Programación. Test Autoevaluación Tema 3

TEMA 8: Gestión dinámica de memoria

Estructuras de Datos Declaraciones Tipos de Datos

Se guardan en archivos con extencion c y los cabezales con extension h

Lenguaje de programación C. Introducción

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

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Message Passing Interface (MPI)

Tema 5 Tabla de Símbolos

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

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

1. Sistema Operativo Unix

Capítulo 3: Procesos. n Concepto de Proceso. n Despacho (calendarización) de Procesos. n Operaciones en Procesos. n Procesos en cooperación

Funciones Tipos de funciones y Recursividad

SISTEMAS OPERATIVOS Arquitectura de computadores

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

Fiabilidad y Tolerancia a Fallos

Programación Estructurada

FACULTAD DE INGENIERÍA

Tema 2. El lenguaje JAVA

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Palabras reservadas de C++ y C. Una palabra reservada no puede declararse como un identificador, esto haría un conflicto entre conectores y funciones.

Examen Principios de Programación Febrero 2012

Introducción a Sistemas Operativos: Concurrencia

Estructuras de Repetición (Hacer-Mientras)

Programación en Lenguaje C

Sistemas Operativos I Manual de prácticas

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

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

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

LENGUAJE. Tema 2 Elementos de un programa

Instituto Politécnico Nacional

Estructuras de Repetición (Repita para)

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

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

APUNTES PROII 2º PARCIAL.

Sistema Operativo. Repaso de Estructura de Computadores. Componentes Hardware. Elementos Básicos

Prueba de Laboratorio Modelo B01 Semáforos y Memoria Compartida

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

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

TEMA 4. ESTRUCTURAS DE CONTROL

Cadena de caracteres. 1. Fundamentos de cadenas y caracteres

Prácticas de Sistemas Operativos

Programación Orientada a Objetos. Resumen de Temas Unidad 3: Constructores y destructores

Tema 13: Apuntadores en C

Generador de analizadores léxicos FLEX

Práctica 2. Implementación de un driver básico para la transmisión de datos a través de la UART.

LABORATORIO 3 ESTRUCTURAS REPETITIVAS WHILE / DO WHILE

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013

FACULTAD DE ECONOMIA Y ADMINISTRACION DEPARTAMENTO DE CIENCIAS DE LA COMPUTACION CÁTEDRA PROGRAMACION GENERAL. Trabajo Práctico Nº 4

Estructuras de Decisión Simples y Dobles

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

Operadores de comparación

Memoria compartida y semáforos r/w. La página del manual que podría servir para describir estas funciones es la siguiente:

Conceptos de Planificación

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

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 4. Gestión del Tiempo Tema 5. Planificación de Threads Tema 6. Sincronización Tema 8. Temporizadores y Relojes de Tiempo de Ejecución Programación Concurrente oct-13 1 7.1. Conceptos Básicos 7.2. Señales Existentes 7.3. Generación, Entrega y Aceptación 7.4. Señales en Procesos Multi-Thread 7.5. Funciones para Configurar Señales 7.6. Funciones para Envío y Aceptación de Señales 7.7. Ejemplo del Uso de Señales Programación Concurrente oct-13 2 7.1 Conceptos Básicos Se trata de un mecanismo de intercambio de mensajes 7.1 Conceptos Básicos Señal POSIX: mecanismo por el que un proceso o thread puede ser notificado de, o afectado por, un evento producido en el sistema excepciones detectadas por hardware expiración de una alarma o temporizador finalización de una operación de I/O asíncrona llegada de un mensaje a una cola de mensajes mensaje enviado desde otro proceso o thread actividad del terminal, etc. Número de señal: Entero positivo que identifica una señal. Existen también constantes predefinidas para dar nombre a las señales Programación Concurrente oct-13 3

7.2 Señales Existentes 7.2 Señales Existentes Algunas señales no fiables Nombre de Señal Descripción SIGABRT Terminación anormal, p.e. con abort() SIGALRM Timeout, p.e. con alarm() SIGFPE Operación aritmética errónea, p.e. división por cero u overflow SIGILL Instrucción hardware inválida SIGINT Señal de atención interactiva (ctrl-c) SIGKILL Señal de terminación (no puede ser cazada ni ignorada) SIGQUIT Señal de terminación interactiva (terminales) SIGSEGV Referencia a memoria inválida SIGTERM Señal de terminación SIGUSR1 Reservada para la aplicación SIGUSR2 Reservada para la aplicación SIGBUS Acceso a una porción indefinida de un objeto de memoria (opcional) Todas las señales anteriores son no fiables, pues se pueden perder si ya hay una señal del mismo número pendiente Programación Concurrente oct-13 4 Señales de Tiempo Real 7.2 Señales Existentes Si se soporta la opción de señales de tiempo real, existen señales con números comprendidos entre SIGRTMIN y SIGRTMAX, que son señales de tiempo real, o fiables Las señales de tiempo real: no se pierden (se encolan) se aceptan en orden de prioridad (a menor número de señal mayor prioridad) tienen un campo adicional de información hay como mínimo 8 Programación Concurrente oct-13 5 Cada thread tiene su propia máscara de señales que define las señales bloqueadas para ese thread en un proceso monothread sólo existe la máscara de señales del thread principal Una señal se genera: cuando el evento que causa la señal ocurre Una señal no bloqueada se entrega: cuando la señal causa al proceso la acción asociada: ignorar, terminar el proceso o ejecutar un manejador Una señal bloqueada se acepta: cuando se selecciona y devuelve por una función sigwait() Programación Concurrente oct-13 6

Diagrama de funcionamiento Recomendado para señales no manejadas Ignorar Acción por defecto No bloqueada Se entrega Ejecutar un manejador Se genera la señal Se desbloquea NO recomendado Fin Bloqueada Pendiente Si es de tiempo real, se encola sigwait() Se acepta Recomendado para señales manejadas Programación Concurrente oct-13 7 Señales Pendientes Señal pendiente: estado entre su generación y su entrega o aceptación observable cuando la señal está bloqueada (enmascarada) si ocurre un nuevo evento de una señal pendiente: - si es una señal no fiable, el evento puede perderse - si es una señal de tiempo real, y la opción SA_SIGINFO ha sido especificada (ver sigaction()), la señal se encola Programación Concurrente oct-13 8 Acciones Asociadas a una Señal Hay tres tipos de acciones que se pueden asociar a una señal: SIG_DFL: acción por defecto (generalmente, terminar el proceso) SIG_IGN: ignorar la señal puntero a función: capturar (o cazar ) la señal, ejecutando un manejador de señal - al entregarse la señal, se ejecuta el manejador indicado - una vez finalizado el manejador, se continúa el proceso en el lugar interrumpido - Los manejadores sólo pueden llamar a funciones seguras Programación Concurrente oct-13 9

7.4 Señales en Procesos Multi-Thread 7.4 Señales en Procesos Multi-Thread Cada thread tiene su propia máscara de señales define las señales bloqueadas para ese thread la máscara se hereda del thread padre, y se puede modificar Una señal se puede generar para un proceso o un thread si el evento es a causa de un thread, se envía a ese thread - p.e. una excepción hardware si el evento es asíncrono al proceso, se envía al proceso - p.e. expiración de un temporizador las señales generadas en asociación a un pid se envían al proceso; en asociación a un tid, se envían al thread Programación Concurrente oct-13 10 Señales en Procesos Multi-Thread 7.4 Señales en Procesos Multi-Thread (cont.) Una señal generada para un thread si no está bloqueada: se entrega si está bloqueada y la acción no es ignorar : se queda pendiente hasta que se acepta con sigwait() o se desbloquea si está bloqueada y la acción es ignorar : no especificado Una señal generada para un proceso: si la acción no es ignorar, se envía a un único thread que esté esperando en un sigwait(), o a un thread que no tenga la señal bloqueada si no se entrega, la señal queda pendiente hasta que un thread llame a sigwait(), un thread desbloquee la señal, o la acción asociada se ponga a ignorar Programación Concurrente oct-13 11 7.4 Señales en Procesos Multi-Thread Uso Recomendado de Señales en Procesos Multithread El thread principal enmascara todas las señales que se vayan a usar (salvo las destinadas a finalizar el proceso) los demás threads heredan esta máscara y no la modifican No se usan "manejadores de señal"; en su lugar, se crean threads que aceptan señales con sigwait(). Ventajas: se puede especificar la prioridad a la que se ejecuta la función manejadora la función manejadora se ejecuta en un contexto conocido y sin restricciones (el del thread) - por el contrario, el contexto en que se ejecutan los manejadores de señal no está definido por el estándar y desde ellos sólo se puede invocar funciones "seguras" Programación Concurrente oct-13 12

Manipular conjuntos de señales: #include <signal.h> int sigemptyset (sigset_t *set); int sigfillset (sigset_t *set); int sigaddset (sigset_t *set, int signo); int sigdelset (sigset_t *set, int signo); int sigismember (const sigset_t *set, int signo); Estas funciones no afectan de forma directa al comportamiento del sistema Programación Concurrente oct-13 13 Cambio de la acción asociada a una señal Examinar y cambiar la acción asociada a una señal: int sigaction (int sig, const struct sigaction *act, struct sigaction *oact); si act es NULL, la acción actual no se cambia si oact no es NULL, la acción actual se devuelve en *oact Programación Concurrente oct-13 14 Estructura sigaction struct sigaction { void (*) (int signo) sa_handler; // SIG_DFL, SIG_IGN, o puntero a función // manejadora de señal sigset_t sa_mask; // señales a ser bloqueadas mientras se ejecuta // el manejador (además de la señal manejada) int sa_flags; // si vale SA_SIGINFO la señal se encola y lleva // información asociada; el manejador es // sa_sigaction void (*)(int signo,siginfo_t *info, void *context) sa_sigaction; // puntero a función manejadora de señal // (SA_SIGINFO). context no está especificado por // el estándar ; Programación Concurrente oct-13 15

Configurar una señal de tiempo real La función sigaction() nos permite configurar una señal para que tenga comportamiento de tiempo real: no se pierde (se encola) se acepta en orden de prioridad (a menor número de señal mayor prioridad) tiene un campo adicional de información señales comprendidas entre SIGRTMIN y SIGRTMAX // configura la señal SIGRTMIN para que tenga // comportamiento de tiempo real y no instala // manejador (se utilizará sigwait) struct sigaction sigact; sigact.sa_handler=sig_dfl; sigact.sa_flags=sa_siginfo; CHKE( sigaction(sigrtmin, &sigact, NULL) ); Programación Concurrente oct-13 16 Información Asociada a una Señal de TR Las señales de tiempo real pueden llevar información asociada - representada mediante una estructura siginfo_t typedef struct { int si_signo; // número de señal int si_code; // causa de la señal: // SI_USER: enviada por kill() // SI_QUEUE: enviada por sigqueue() // SI_TIMER: expiración de un temporizador // SI_ASYNCIO: fin de operación de I/O asíncrona // SI_MESGQ: llegada de mensaje a cola vacía union sigval si_value; // valor asociado a la señal siginfo_t; union sigval { int sival_int void *sival_ptr ; Programación Concurrente oct-13 17 Cambio de la máscara de señal Examinar y cambiar señales bloqueadas: int pthread_sigmask (int how, const sigset_t *set, sigset_t *oset); how indica la forma de operar: - SIG_BLOCK: señales bloqueadas = anteriores + nuevas - SIG_UNBLOCK: señales bloqueadas = anteriores - nuevas - SIG_SETMASK: señales bloqueadas = nuevas set: señales nuevas; si vale NULL, no se cambian oset: si no es NULL, devuelve señales bloqueadas anteriores existe una función relacionada (sigprocmask()) que sólo debe ser utilizada en procesos mono-thread Programación Concurrente oct-13 18

7.6 Funciones para Envío y Aceptación de Señales 7.6 Funciones para Envío y Aceptación de Señales Enviar una señal a un proceso: #include <sys/types.h> #include <signal.h> int kill (pid_t pid, int sig); int sigqueue (pid_t pid, int signo, const union sigval value); Enviar una señal a un thread: int pthread_kill(pthread_t thread, int sig); Examinar señales pendientes: int sigpending (sigset_t *set); - Señales pendientes para el proceso + señales pendientes para el thread Programación Concurrente oct-13 19 Envío y Aceptación de Señales 7.6 Funciones para Envío y Aceptación de Señales (cont.) Esperar a que se ejecute un manejador de señal: int pause (void); int sigsuspend (const sigset_t *sigmask); - las señales bloqueadas se cambian a sigmask, y vuelven al valor original cuando sigsuspend() retorna Aceptar una señal bloqueada: int sigwait (const sigset_t *set, int *sig); int sigwaitinfo (const sigset_t *set, siginfo_t *info); int sigtimedwait (const sigset_t *set, siginfo_t *info, const struct timespec *timeout); Programación Concurrente oct-13 20 7.7 Ejemplo del Uso de Señales Thread que acepta la señal SIGINT 7.7 Ejemplo del Uso de Señales // El thread acepta la señal SIGINT. Cuando la recibe escribe un // mensaje en pantalla. A la cuarta señal recibida cambia la // máscara para que la siguiente señal termine el proceso. #include <signal.h> #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <misc/error_checks.h> // declaración del cuerpo de la función manejadora void * sigwaiter (void * arg); Programación Concurrente oct-13 21

7.7 Ejemplo del Uso de Señales Ejemplo del Uso de Señales (cont.) // Thread principal int main () { sigset_t set; pthread_t th; // Coloca la máscara para él y para el hijo sigemptyset(&set); sigaddset(&set,sigint); CHK( pthread_sigmask(sig_block, &set, NULL) ); // crea la tarea manejadora de señales CHK( pthread_create(&th,null,sigwaiter,null) ); // permite ejecutar a la tarea manejadora while (1) { printf ("Main thread executing \n"); sleep(1); Programación Concurrente oct-13 22 7.7 Ejemplo del Uso de Señales Ejemplo del Uso de Señales (cont.) void * sigwaiter (void * arg) { sigset_t set; int counter = 0; int signo; // La mascara de señales se hereda del padre (SIGINT enmascarada) // crea conjunto de señales a esperar sigemptyset(&set); sigaddset(&set, SIGINT); while (1) { CHKE( sigwait(&set, &signo) ); if (signo == SIGINT) { // Maneja la señal de terminación counter ++; if (counter < 4) { printf ("SIGINT %d recibida \n", counter); else { printf ("Señal final cazada, la próxima mata el proceso\n"); // desbloquea la señal CHK( pthread_sigmask(sig_unblock, &set, NULL) ); // while Programación Concurrente oct-13 23 #include <signal.h> #include <pthread.h> #include <stdio.h> #include <unistd.h> #include "misc/error_checks.h" // información a enviar con la señal typedef struct { char * msj; int num; user_info_t; Programación Concurrente oct-13 24

Ejemplo de Señales con Información (cont.) // thread que acepta la señal void * sigwaiter (void * arg) { sigset_t set; siginfo_t sig_info; // La mascara de señales se hereda del padre // Debe tener SIGRTMIN enmascarada // prepara el set de señales a esperar sigemptyset(&set); sigaddset(&set,sigrtmin); while (1) { // espera la señal CHKE( sigwaitinfo(&set, &sig_info) ); printf ("Signal %d accepted with info: (%d,%s)\n", sig_info.si_signo, ((user_info_t *)(sig_info.si_value.sival_ptr))->num, ((user_info_t *)(sig_info.si_value.sival_ptr))->msj); Programación Concurrente oct-13 25 Ejemplo de Señales con Información (cont.) // thread principal que envía la señal int main () { sigset_t set; pthread_t th; user_info_t user_info; user_info.msj = "Message"; union sigval user_sigval; user_sigval.sival_ptr = &user_info; int i; // configura la señal SIGRTMIN para que tenga comportamiento // de tiempo real y no instala manejador (se utilizará // sigwaitinfo para aceptarla) struct sigaction sigact; sigact.sa_handler=sig_dfl; sigact.sa_flags=sa_siginfo; CHKE( sigaction(sigrtmin, &sigact, NULL) ); // pone la mascara para él y para su hijo sigemptyset(&set); sigaddset(&set,sigrtmin); CHK( pthread_sigmask(sig_block, &set, NULL) ); Programación Concurrente oct-13 26 Ejemplo de Señales con Información (cont.) // crea el thread sigwaiter CHK( pthread_create(&th,null,sigwaiter,null) ); // envía tres veces la señal for(i=0; i<3; i++) { user_info.num = i; printf ("Main thread send signal %d with info: (%d,%s)\n", SIGRTMIN, user_info.num, user_info.msj); // envía la señal sigqueue(0, SIGRTMIN, user_sigval); sleep(5); return 0; Programación Concurrente oct-13 27