Publicado el 14 de Enero del 2017
776 visualizaciones desde el 14 de Enero del 2017
47,3 KB
9 paginas
Creado hace 11a (14/10/2013)
1
Master en Computación
Programación Concurrente
Bloque II: Programación concurrente en POSIX
Introducción al estándar POSIX
Tema 1.
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 7. Señales
Tema 8. Temporizadores y Relojes de Tiempo de Ejecución
Programación Concurrente
Tema 7. Señales
© M. Aldea, M. González
oct-13
Tema 7. Señales
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
© M. Aldea, M. González
oct-13
2
7.1 Conceptos Básicos
Programación Concurrente
Tema 7. Señales
7.1 Conceptos Básicos
Se trata de un mecanismo de intercambio de mensajes
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
© M. Aldea, M. González
oct-13
3
Tema 7. Señales
7.2 Señales Existentes
7.2 Señales Existentes
Algunas señales “no fiables”
Descripción
Nombre de Señal
SIGABRT
SIGALRM
SIGFPE
SIGILL
SIGINT
SIGKILL
SIGQUIT
SIGSEGV
SIGTERM
SIGUSR1
SIGUSR2
SIGBUS
Terminación anormal, p.e. con abort()
Timeout, p.e. con alarm()
Operación aritmética errónea, p.e. división por cero u overflow
Instrucción hardware inválida
Señal de atención interactiva (ctrl-C)
Señal de terminación (no puede ser “cazada” ni ignorada)
Señal de terminación interactiva (terminales)
Referencia a memoria inválida
Señal de terminación
Reservada para la aplicación
Reservada para la aplicación
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
Tema 7. Señales
© M. Aldea, M. González
oct-13
4
7.2 Señales Existentes
Señales de Tiempo Real
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
Tema 7. Señales
© M. Aldea, M. González
oct-13
5
7.3 Generación, Entrega y Aceptación
7.3 Generación, Entrega y Aceptación
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
© M. Aldea, M. González
oct-13
6
Tema 7. Señales
Diagrama de funcionamiento
7.3 Generación, Entrega y Aceptación
Recomendado para señales no manejadas
Ignorar
No bloqueada
Se entrega
Se genera
la señal
Se
desbloquea
Acción por defecto
Ejecutar un manejador
NO recomendado
Fin
Bloqueada
Pendiente
Si es de
tiempo
real, se
encola
Programación Concurrente
Tema 7. Señales
Señales Pendientes
sigwait()
Se acepta
Recomendado para señales manejadas
© M. Aldea, M. González
oct-13
7
7.3 Generación, Entrega y Aceptación
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
Tema 7. Señales
© M. Aldea, M. González
oct-13
8
7.3 Generación, Entrega y Aceptación
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
© M. Aldea, M. González
oct-13
9
Tema 7. Señales
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
Tema 7. Señales
© M. Aldea, M. González
oct-13
10
7.4 Señales en Procesos Multi-Thread
Señales en Procesos Multi-Thread
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
(cont.)
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
Tema 7. Señales
© M. Aldea, M. González
oct-13
11
Uso Recomendado de Señales en Procesos
7.4 Señales en Procesos Multi-Thread
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
© M. Aldea, M. González
oct-13
12
Tema 7. Señales
7.5 Funciones para Configurar Señales
7.5 Funciones para Configurar Señales
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
Tema 7. Señales
© M. Aldea, M. González
oct-13
13
7.5 Funciones para Configurar Señales
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
© M. Aldea, M. González
oct-13
14
Tema 7. Señales
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;
7.5 Funciones para Configurar Señales
// 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
© M. Aldea, M. González
oct-13
15
Tema 7. Señales
Configurar una señal de tiempo real
La función sigaction() nos permite configurar una señal para
que tenga comportamiento de tiempo real:
7.5 Funciones para Configurar Señales
• 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) );
© M. Aldea, M. González
oct-13
16
Programación Concurrente
Tema 7. Señales
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
7.5 Funciones para Configurar Señales
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/
Comentarios de: Master en Computación - Programación Concurrente - Bloque II: Programación concurrente en POSIX Introducción al estándar POSIX - Tema 7. Señales (0)
No hay comentarios