Sie sind auf Seite 1von 109

Sistemas en tiempo real y

Lenguajes de Programacin
Objetivos del curso:
Comprender las caractersticas de los sistemas en tiempo real.
Aplicar los conceptos en el dominio industrial
Investigacin

Requisitos
Conocimientos de un lenguaje de programacin
secuencial.

Ingeniera de Software.
Introduccin a los conceptos bsicos del control
automtico.

Tema 1
Definicin de los sistemas en tiempo real.
Ejemplos.

Qu es un sistema en tiempo real?


Definicin: Cualquier sistema en el que el tiempo en el que
se produce la salida es significativo. La entrada al sistema
corresponde a un estmulo externo y se producir una salida
relacionada con esta entrada en un perodo de tiempo finito y
determinado.
Control en tiempo real. El tiempo es crucial en cualquier
sistema embebido.
El programador debe lograr que los programas sincronicen con el
tiempo.
Especificar los tiempos en los que deben ser realizadas las acciones y
completadas. Se deben responder a situaciones en las que no todos los
requisitos temporales se deben satisfacer.
Responder a situaciones en las que los requisitos temporales cambian
dinmicamente.

Qu es un sistema en tiempo real?


La correccin de un sistema de tiempo real depende no solo
del resultado lgico sino tambien del tiempo en el que se
producen los resultados.
Sistemas embebidos: Cuando el commputador es un
componente del proceso de informacin en un sistema de
ingeniera ms grande.

Terminologa

Hard real-time Sistemas de tiempo real estrictos. En estos sistemas el tiempo de


respuesta es crucial y debe producirse dentro del lmite especificado. Ejemplo:
Sistemas de control de vuelo.

Soft real-time Sistemas de tiempo real no estrictos. En estos sistemas el tiempo


de respuesta es importante pero el sistema seguir funcionando correctamente
aunque los tiempo lmite no se cumplan ocasionalmente. Ejemplo: Sistemas de
adquisicin de datos.

Real real-time Sistemas de tiempo real son sistemas en los cuales el tiempo de
respuesta es muy corto.

Firm real-time Sistemas de tiempo real firme son sistemas de tiempo real no
estricto pero el tiempo lmite puede no cumplirse ocasionalmente pero no hay
beneficio por la entrega retrasada.

Ejemplos de sistemas en tiempo real


Ejemplos:
Control de procesos
Fabricacin: mantener los costes bajos y el nivel de productividad.
Comunicacin, mando y control: Reserva de plazas de una compaa
area, las funcionalidades mdicas para cuidado automtico del
paciente, control de trfico areo, contabilidad bancaria remota.
Sistema de computador embebido generalizado: siempre interacciona
con el equipamiento fsico en el mundo real.
Dispositivos del mundo real se debe muestrear la informacin a
intervalos de tiempo regulares.
Reloj de tiempo real.
Consola de operador para la intervencin manual.
Displays de diferentes tipos incluyendo grficos.

A simple fluid control system


Interfase
Tubera

Lectura del
Flujo de entrada

Medidor de Flujo

Procesado

ngulo de
la vlvula de salida
Tiempo
Ordenador

Vlvula

Sistema de Control de Procesos


Consola del operador

Ordenador del cotrol


Del proceso

Producto
final

Materia prima

PLANTA

Un sistema de mando y control


Puesto de mando

Ordenador de mando y
control

Temperatura, Presin, Potencia, etc.


Terminales

Sensores/Actuatores

Sistema Tpico Embebido


Reloj de
tiempo real

Algoritmos para
Control Digital

Registro de datos

Base de
Datos
Recuperacin y
Presentacin de datos

Consola del
operador

Interfaz
Del operador

Interfaz

Dispositivos de
Presentacin

Sistema de Ingeniera

Sistema de
monitorizacin
remota

Ordenador tiempo real

Caractersticas de los sistemas embebidos


Los sistemas embebidos deben responder a eventos
del mundo real.
Los sistemas de tiempo real precisan mantenimiento
constante y mejoras durante sus ciclos de vida.
Deben ser extensibles.
Los sistemas de tiempo real son a menudo complejos

Tema 2: Caractersticas de
un RTS(Sistema en tiempo
real)

Caractersticas de un RTS
Grande y complejo: Los programas deben cambiar
continuamente. Precisan de mantenimiento constante y
mejoras durante su ciclo de vida. Se pueden dividir en
componentes ms pequeos ms fciles de gestionar.
El software y el hardware deben ser fiables y seguros.
Control concurrente de los distintos componentes separados
del sistema. Un sistema embebido suele constar de
ordenadores y otros elementos externos con los que los
programas deben interactuar simultmeamente. La naturaleza
de estos elementos externos del mundo real suelen existir en
paralelo. Cuando los elementos externos se encuentran
distribuidos geogrficamente se deben considerar sistemas
embebidos distribuidos o multiprocesadores.

Caractersticas de un RTS
Control en tiempo real: Los sistemas de tiempo real se
construyen habitualmente utilizando procesadores con
considerable
capacidad
adicional
garantizando
el
comportamiento en el peor de los casos. El programador debe
especificar los tiempos en los que deben ser realizadas las
acciones, especificar los tiempos en los que las acciones
deben ser completadas, responder a situaciones en las que no
todos los requisitos temporales se pueden satisfacer y
responder a situaciones en las que los requisitos temporales
cambian dinmicamente ( modos de cambio). El programador
debe sincronizar el programa con el tiempo.

Caractersricas de un RTS
Interaccin con interfaces hardware.
Especificacin de registro de dispositivos y control de
interrupciones.
Lenguajes de alto nivel, niveles de calidad.
Control directo y evitar las arquitecturas con una capa de
funciones del sistema operativo.
Implementacin eficiente y entorno de ejecucin.
Evaluar el coste de las caractersticas de implementacin.

Resumen
Clasificacin de los sistemas de tiempo real:
Sistemas en tiempo real crtico
Sistemas en tiempo real acrtico
Caractersticas de un sistema de tiempo real o embebido:
Grandeza y complejidad,
Fiabilidad y seguridad extrema,
Control concurrente de componentes separados del
sistema,
Control en tiempo real,
Interaccin con interfaces hardware,
Implementacin eficiente,

Paradigmas de Programacin
Un paradigma de programacin representa un enfoque
particular para la construccin del software.
Segn las especificaciones del sistema un paradigma resulta
ms apropiado que otro.
Ejemplos de paradigmas:
Imperativo o por procedimientos: C
Funcional: Lisp
Lgico: PROLOG
Orientado a Objetos: Phyton, Java, C++

Imperativo o por procedimientos


Se describe la programacin en trminos del estado del
programa y secuencias que cambian dicho estado.
Los programas son una serie de instrucciones que indican al
ordenador cmo realizar una tarea.
Programacin alto nivel y bajo nivel, la diferencia es el tipo de
sentencias y variables.
Ejemplos:
C,C++, Java

Programacin dirigida por eventos


La estructura como la ejecucin de los programas van
determinados por los sucesos que ocurran en el
sistema o que ellos mismos provoquen.
A diferencia de la programacin estructurada es el
usuario o lo que est accionando el programa el que
dirija el flujo del programa.
La programacin orientada a eventos permite
interactuar con el usuario en cualquier momento de la
ejecucin. Los programas creados bajo esta
arquitectura se componen
por un bucle exterior
permanente encargado de recoger los eventos y
distintos procesos que se encargan de tratarlos.

Descomposicin y Abstraccin
Programacin Estructurada:
Diseo descendente
Abstraccin - Diseo Inductivo
Mdulos: conjunto de objetos y operaciones relacionadas
lgicamente.
La tcnica de encapsulamiento sirve para aislar una
funcin en un mdulo.
La estructura Mdulo permite:
Ocultacin de Informacin
Compilacin por Separado: permite la construccin de
bibliotecas de componentes precompilados. Favorece la
reutilizacin.
Tipos abstractos de datos uso de estructuras
ADA, Java paquetes
C archivos separados la compilacin (esttico)
Java clases y objetos

Tcnicas
En la programacin estructurada se utilizan estructuras
de tipo secuencial, condicional e iterativa.
La programacin modular consiste en dividir un
programa en mdulos o subprogramas con el fin de
hacerlo ms legible y manejable. Es una evolucin de
de la programacin estructurada para solucionar
problemas de programacin ms grandes y complejos.
Un problema complejo debe de ser dividido en varios
subproblemas ms simples, repitiendo este proceso
hasta obtener subproblemas simples como para poder
ser resueltos por un lenguaje de programacin. Este
proceso se llama anlisis descendente (Top-Down). En
la prctica suelen representarse los mdulos como
procedimientos o funciones. Si un mdulo necesita de
otro se debe definir una interfaz de comunicacin.

Lenguajes de programacin RTL


Lenguajes de programacin secuenciales: Soporte del sistema
operativo:
RTL/2, Coral 66, Jovial, C.

Sin soporte del sistema operativo: lenguajes de alto nivel


concurrentes: Ada, Chill, Modula-2, Mesa, Java.

Java/Real-Time Java
C and Real-Time POSIX (Laboratorios)
Ada 95
Also Modula-1 for device driving

Sistemas de Tiempo Real y Sistemas


Operativos
User Programs
Operating

Hardware

System

Configuracn de un Sistema Operativo

User Program
Including Operating

Hardware

System Components

Configuracin de un Sistema Embebido

Diseo de sistemas de Tiempo Real

Lo ms importante del desarrollo de un sistema de


tiempo real es la generacin de un diseo consistente
que satisfaga una especificacin acreditada de los
requisitos.
Fases:

Especificacin de requisitos
Diseo arquitectnico
Diseo detallado
Implementacin
Prueba
Otras actividades:
Prototipado previo a la implementacin final
Diseo de la interfaz hombre-mquina
Criterios para la evaluacin de los lenguajes de implementacin

Diseo de Sistemas en tiempo real

Niveles de notacin: Mtodos McDermid(1989)


Informal lenguaje natural y
Estructurada
Formal

Tema 2: Caractersticas de los


Sistemas en tiempo real
Fiabilidad y Tolerancia a Fallos

Fiabilidad, fallos y defectos


Para cualquier lenguaje de programacin de
tiempo real es requisito tener las herramientas
necesarias para faciliar la construccin de
sistemas altamente fiables. Por ejemplo:
herramientas de gestin de excepciones.
Podemos definir la fiabilidad como: una
medida del xito con el que el sistema se ajusta
a alguna especificacin definitiva de su
comportamiento. Randell et al. (1978).
Cuando el comportamiento de un sistema se
desva del especificado para l, se dice que es
un fallo. Randel et al. (1978)
2

Fiabilidad, fallos y defectos


Los fallos que analizamos estn relacionados
con el comportamiento de un sistema. Los fallos
son el resultado de problemas internos no
esperados
que
el
sistema
manifiesta
eventualmente en su comportamiento externo.
Los problemas se denominan errores y sus
causas mecnicas o algortmicas defectos.
Un componente defectuoso de un sistema es un
componente que reproducir un error bajo un
conjunto concreto de circunstancias durante la
vida del sistema.
3

Fiabilidad, fallos y defectos


Un fallo en un sistema puede inducir un
defecto en otro, el cual puede acabar en
un error y en un fallo potencial de ese
sistemapuede continuar y producir un
defecto en cualquier sistema relacionado,
segn se ilustra en le siguiente diagrama:

Fallo

Defecto

Error

Fallo
4

Fiabilidad, fallos y defectos


Tipos de Fallos:
Fallos transitorios: Comienza en un instante de tiempo concreto,
se mantiene en el sistema durante algn perodo de tiempo y
luego desaparece. Muchos de los fallos de los sitemas de
comunicacin son transitorios.
Fallos permanentes: comienzan en un instante determinado y
permanecen en el sistema hasta que son separados, p.e.cable
roto, error de diseo del software.
Fallos intermitentes: Son fallos transitorios que ocurren de vez
en cuando. Un ejemplo es un componente hardware sensible al
calor que funciona durante un rato deja de funcionar, se enfra y
entonces empieza a funcionar de nuevo.

Modo de fallo

Dominio del valor

Error de Lmites

Valor
erroneo

Dominio del tiempo

Adelantado

Fallo de Silencio:
a partir de un
momento falla el
servicio

Omission:
El servicio no
es entregado

Fallo de parada
Es un fallo
silencioso pero los
otros sistemas
detectan el fallo

Arbitrario
(Valor y Tiempo)

Retraso:error
De prestaciones

Fallo
controlado:
Falla de una
forma
Controlada y
especificada
6

Aproximaciones para Disear


Sistemas Fiables
Prevencin de Fallos: se refiere al intento
de impedir que cualquier posibilidad de
fallo se cuele en el sistema antes de que
est operativo.
Tolerancia a Fallos: hace posible que el
sistema contine funcionando incluso ante
la presencia de fallos.
Ambas intentan producir sistemas con modos de fallo bien definidos

Prevencin de Fallos
Fases en la prevencin de fallos: evitacin y
eliminacin
Fase Evitacin se intenta limitar la introduccin de
componentes potencialmente defectuosos durante la
construccin del sistema.
Hardware:
Componentes ms fiables dentro de las restricciones de coste
y prestaciones dadas.
Tcnicas exhaustivamente refinadas para la interconexin de
componentes y el ensamblado de subsistemas.
Aislamiento para protegerlo de formas de interferencia
esperadas.
8

Prevencin de Fallos
Fase Evitacin Cont.
Software:
Especificacin de requisitos rigurosas, si no formales.
Metodologa de diseo.
Lenguajes que faciliten la abstraccin de datos y la
modularidad.
Herramientas de ingeniera de software para ayudar en
la manipulacin de los componentes de software y en la
gestin de complejidad.

Prevencin de Fallos
Fase Eliminacin de Fallos:
Procedimientos para encontrar y eliminar las
causas de los errores.
Revisores de diseo.
Verificacin de programas
Inspecciones del cdigo.
Pruebas del sistema.

10

Prevencin de Fallos
Nota: Como los componentes de HW pueden fallar la
prevencin de fallos puede ser inapropiada cuando la
frecuencia o la duracin de los tiempos de reparacin
resulten inaceptables o cuando no se pueda acceder al
sistema para actividades de mantenimiento y
reparacin.

11

Tolerancia a fallos.
Niveles de tolerancia a fallos de un sistema:
Tolerancia total frente a fallos: el sistema continua en
funcionamiento en presencia de fallos, aunque por un
perodo limitado, sin una prdida significativa de
funcionalidad o prestaciones. (Sistemas de
seguridad)
Degradacin controlada( o cada suave) el sistema
continua en operacin. Si los sistemas son muy
complejos y deben funcionar de forma continua con
requisitos de alta disponibilidad.
Fallo seguro: el sistema cuida de su integridad
durante el fallo acaptando una parada temporal de su
funcionamiento.
12

Degradacin controlada y recuperacin en el sistema de


control del trfico areo.
Funcionalidad completa dentro
del tiempo de respuesta
especificado

Funcionalidad mnima
Precisa para mantener el
control areo bsico

Funcionalidad de emergencia
slo para dar separacin
Entre aviones.

Mecanismo de respaldo adyacente: cuando


ocurre un fallo catastrfico ( terremoto)
13

Redundancia
Todas las tcnicas utilizadas para
conseguir tolerancia a fallos se basan en
aadir elementos extra al sistema para
que detecte y se recupere de los fallos,
estos componentes no son necesarios
para el normal funcionamiento del sistema
(Redundancia protectora)
Tipos: Hw y SW
14

Redundancia HW
Esttica o Enmascarada:
TMR-Triple Modular Redundancy consiste en tres componentes
o idnticos y en circuitos de votacin por mayora. Los circuitos
comparan la salida de todos los componentes, y si alguna difiere
de las otras dos es bloqueada. En este caso se supone que el
fallo se debe a un error transitorio o al deterioro de algn
componente.
NMR- redundancia N modular

Dinmica: es la redundancia aportada dentro de un


componente que hace que el mismo indique que la
salida es errnea. ( dotar de deteccin de errores: la
suma de comprobacin en las transmisiones de
comunicaciones y las paridades de bits en las memorias
15

Software- Tolerancia de fallos


(causa-errores de diseo)
Dinmica:
Deteccin y recuperacin de errores: similar
al enfoque de redundancia dinmica de HW,
en el sentido de que se activan los
procedimientos de recuperacin despus de
haberse detectado el error.

Esttica - Programacin de N-versiones:


similar al de redundancia enmascarada
del HW
16

Programacin de N-versiones
Versin 1

Versin 2
estatus

Versin 3
estatus
estatus

voto

vote

voto

Director

17

Programacin de N-versiones
Aspectos principales
T1

T2

> Tth

T3
no

> Tth

si

> Tth

Cada versin produce


un resultado diferente
pero
correcto(comparacin
consistente)

si

P1

P2

P3

no

> Pth

> Pth

> Pth

si
18

V1

V2

V3

Programacin de N-versiones
Aspectos principales:
Especificacin Inicial Un error en la
especificacin permanecer en las Nversiones.
Independencia en el diseo: Un sistema de
tres versiones es ms fiable que un sistema
de alta calidad de versin nica.
Presupuesto adecuado: con la mayora de los
sistemas embebidos el principal coste se
debe al software.
19

Redundancia de software dinmica


Deteccin de errores
Confinamiento y valoracin de daos.
Construccin de cortafuegos

Recuperacin del error


Diagnosis del error.
Existe un intervalo de tiempo entre el fallo y la
manifestacin del error asociado.
Estrategias: recuperacin hacia delante (excepcin
asncrona) y hacia atrs (bloques de recuperacin).

Tratamiento del fallo y continuacin del servicio.


20

Redundancia de software dinmica


Tcnicas de deteccin de errores
En el entorno HW ( violacin de proteccin,
desbordamiento aritmtico) SW (valor fuera de rango,
referencua a apuntador nulo)
En la aplicacin

Comprobacin de rplicas
Comprobaciones temporales
Comprobaciones inversas Una entrada y una salida.
Cdigos de comprobacin checksum, corrupcin de datos
Comprobaciones de racionalidad (aserciones)
Comprobaciones estructurales
Comprobaciones de racionalidad dinmica
21

Mecanismo del bloque de


recuperacin
Restaura punto de
recuperacin

fallo

Establece punto
de recuperacin

Alguna
alternativa

Si

Ejecuta
siguiente
alternativa

Pasa

Evala test
De
aceptacin

Descarta punto
de recuperacinint

No

Falla bloque
De recuperacin
22

Redundancia dinmica y
excepciones
Una excepcin es la ocurrencia de un
error.
Generar una excepcin es mostrar la
condicin de excepcin que ha causado
dicha excepcin.
La respuesta es la captura de la
excepcin.

23

Manejo de excepciones
Representacin de excepciones: de forma
explcita o implcita.
Dominio de un manejador de excepciones:
con cada manejador viene asociado un
dominio que significa la regin cmputo
durante la cual se activar el manipulador
si aparece una excepcin. El dominio se
encuentra asociado a un bloque, un
subprograma o una sentencia.
24

Ejemplos
C
if(llamada_funcion(parametros) == Un_Error) {
/* cdigo para el manejo de errores */
} else {
/*cdigo para el retorno normal*/
};

25

Ejemplos
C++ - definicin del dominio
try {
// sentencias que pueden generar una
//excepcin
}
catch (ExceptionType e) {
// manejador para e e
}
26

Manejo de excepciones
Propagacin de excepciones: Cuando se
lance una excepcin, puede que no exista
ningn manejador de excepciones en el
dominio que la encierra. En este caso
podr propagarse la excepcin hacia el
siguiente nivel de dominio que lo
envuelve, o podr considerarse como un
error de programacin.
27

Modelo de Reanudacin
Hq
P invoca Q

Hr genera
la excepcin
q

P
Hq reanuda Hr

Hr
Q invoca R

R genera
la excepcin
r

Q
Hq reanuda R

2
6

R
28

Modelo
deTerminacin
Procedimiento P
1

P invoca Q

Procedimiento Q
3

Q invoca R

Procedimiento R
5

4
Generada la
excepcin r

Manejador
visto

6
Termina
el
procedimiento

Manejador
para r

29

Manejo de excepciones
El modelo de reanudacin o de
terminacin determina la accin a tomar
tras el manejo de una excepcin. Con el
modelo de reanudacin el invocador de la
excepcin se reanuda en la sentencia
posterior a la que provoc la excepcin.
Con el modelo de terminacin el bloque o
procedimiento que contiene el manejador
es terminado, y se pasa el control al
bloque o procedimiento que lo llam.
30

Tema 3: Concurrencia
Programacin Concurrente
Teora y ejemplos de implementacin

Programacin Concurrente
Denominamos programacin concurrente a la
notacin y tcnicas de programacin que expresan
el paralelismo potencial y que resuelven los
problemas resultantes de la sincronizacin y la
comunicacin. La implementacin del parlelismo
es un tema de los sistemas informticos (SW y
HW) La importancia de la programacin
concurrente est en que proporciona un entorno
abstracto donde estudiar el paralelismo sin tener
que enfrescarse en los detalles de implementacin.
(Ben-Ari, 1982)
2

Programacin Concurrente
Los sistemas operativos proporcionan mecanismos
para crear procesos concurrentes. Cada proceso se
ejecuta en su propia mquina virtual, para evitar
interferencias con otros procesos no relacionados.
Los sistemas operativos modernos permiten crear
procesos dentro del mismo programa accediendo
de modo compartido, y sin restricciones, a la
memoria comn ( estos procesos suelen llamarse
hilos o hebras).
3

Multiprogramacin
Los procesos son ejecutados,
concurrentemente, compartiendo uno o ms
procesadores (c/u con su memoria)
El kernel del sistema operativo multiplexa
los procesos en los procesadores
Proc7

Proc1
Proc2

M1 CPU1
Proc6

M2 CPU2
Proc5

Proc3
Proc4

Multiprocesamiento
Se ejecuta un proceso en cada procesador
Los procesos comparten una memoria en
comn
Proc1
CPU1

Proc2

Proc3

Proc4

CPU2

CPU3

CPU4

Memoria comn

Procesamiento distribuido
Los procesos estn conectados a travs de
una red de comunicacin
Cada procesos cuenta con su memoria
Proc1

Proc2

Proc3

Proc4

CPU1

CPU2

CPU3

CPU4

M1

M2

M3

M4

red de comunicacin

Diagrama de estados sencillo para un


proceso
NOexistente
existente
NO

Noexistente
existente
No

Creado
Creado

Inicializacin
Inicializacin

Terminado
Terminado

Ejecutable
Ejecutable
7

Programacin concurrente
Los sistemas operativos que se ajustan a
POSIX se debe distinguir entre
concurrencia de programas (procesos) y la
concurrencia dentro de un programa (hilos).

Programacin concurrente
Servicios fundamentales:
La expresin de ejecucin concurrente
mediante la nocin de proceso.
La sincronizacin de procesos.
La comunicacin entre procesos.

Programacin concurrente
Interaccin entre procesos:
Independiente: no se comunican o sincronizan
entre s.
Cooperativo: Se comunican con regularidad y
sincronizan sus actividades para realizar alguna
operacin comn.
Competitivo: Para que los procesos obtengan
una proporcin justa de recursos deben
competir entre s.
10

Hilos
Hilos: permiten mltiples flujos de control
que se ejecutan de manera concurrente
dentro de uno de sus programas. Los hilos
permiten que su programa emprenda varias
tareas de cmputo al mismo tiempo, una
caracterstica que da soporte al programa
orientado a eventos.
11

Hilos y Programacin Concurrente


Un ordenador tiene un CPU o elemento de
procesamiento (PE Processing Element) que
ejecuta un programa a la vez.
Un programa es un proceso que se ejecuta una
sola vez.
Dentro de un proceso el control suele seguir a un
solo hilo de ejecucin que por lo general empieza
con el primer elemento de main, recorriendo una
secuencia de instrucciones y terminando cuando se
regresa a main. Programacin de un solo hilo.
12

Hilos y Programacin Concurrente


Los lenguajes de programacin como el C
tienen un nico hilo (hebra) de control.
Existe una nica traza.
El trmino concurrente indica paralelismo
potencial.
C/C++ POSIX permite mltiples tareas y
programacin concurrente.
13

Hilos y Programacin Concurrente


Los programas de un solo hilo son buenos
para clculos sencillos.
Los programas dinmicos, interactivos,
controlados por eventos, suelen incluir
varias partes activas que se ejecutan de
manera independiente e interactan o
cooperan de alguna manera para alcanzar
las metas.
14

Hilos y Programacin Concurrente


Se pueden utilizar hilos para desacoplar
actividades
con
velocidades
de
procesamiento muy diferentes.
Un programa de procesamiento multihilos
tiene que coordinar varias actividades
independientes y evitar la posibilidad de
que se encimen entre s.
15

Programa de Varios Hilos


Main()
start()
run()

run()
run()

16

Pthreads hilos en C/C++


Un hilo es un flujo de control separado que
ejecuta su propio cdigo. En C/C++ el hilo
es un objeto de la clase Pthread.

17

Pthreads hilos en C/C++


Lanzando Hilos. Un hilo en ejecucin puede
lanzar o crear otros hilos creando objetos
tipo hilo e invocando sus mtodos start para
que empiecen a ejecutarse
independientemente.

18

Pthreads hilos en C/C++


Control de hilo. Un hilo padre da lugar a un
hilo hijo al crear un objeto de Thread e
invocar a su mtodo start, el cual causa que
el objeto se vuelva un nuevo hilo listo para
ejecutarse.

19

Hilos y Programacin Concurrente


Estos programas incluyen cuatro aspectos
nuevos e importantes que no incluyen los
programas de un solo hilo:

Exclusin mutua
Sincronizacin
Calendarizacin
Punto muerto
20

Hilos y Programacin Concurrente


Exclusin mutua
Los hilos de un programa suelen necesitar ayuda
para lograr de una cierta tares. Esta cooperacin
generalmente implica el acceso de diferentes hilos
a las mismas construcciones del programa.
Cuando varios hilos comparten un recurso comn
(campo, arreglo u otro objeto) puede darse el
acceso simultneo de ms de un hilo.
Es necesario organizar un acceso mutuamente
exclusivo a a cantidades compartidas. Solo un hilo
puede accesar al mismo tiempo la cantidad
protegida por exclusin mutua (mutex).
21

Tema 4: Tareas
Exclusin Mutua
Mutex

Gua

Interaccin y sincronizacin procesos


Corutinas, fork-join y cobegin-coend
Exclusin mutua, seccin crtica y condicin de
competencia
Soluciones problema exclusin mutua

Caractersticas procesos
concurrentes
Los procesos son concurrentes si existen
simultneamente
Pueden funcionar en forma totalmente
independiente, unos de otros
Pueden ser asncronos lo cual significa que
en ocasiones requieren cierta sincronizacin
y cooperacin
3

Interaccin entre procesos


Para poder cooperar, procesos concurrentes
deben comunicarse y sincronizarse
Comunicacin permite ejecucin de un
proceso para influenciar ejecucin de otro
Comunicacin entre procesos esta basada en
el uso de variables compartidas o envo de
mensajes
4

Representacin de procesos
La estructura del programa permite localizar los
segmentos que pueden ejecutarse concurrentemente
Mecanismos bsicos para representar la ejecucin
concurrente:
corutinas
fork-join
el enunciado co-begin
Pueden usarse para especificar un nmero esttico o
dinmico de procesos

Corutinas
Propuestas por Conway en 1963
Corutinas son subrutinas que permiten una
transferencia de control de una forma
simtrica ms que jerrquica
Cada corutina puede ser vista como la
implementacin de un proceso
Bien usadas, son un medio para organizar
programas concurrentes que comparten un
mismo procesador
6

Elementos corutinas
El enunciado resume
transfiere control a la corutina mencionada
guarda informacin necesaria para controlar la
ejecucin de regreso

El enunciado call
inicializa el clculo de la corutina

El enunciado return
transfiere el control de regreso al procedimiento
7
que realiz un call

Comentarios corutinas
La ejecucin, por parte de un proceso, de
resume provoca una sincronizacin
No son adecuadas para un verdadero
procesamiento paralelo
Son procesos concurrentes en el que el
switcheo de procesos ha sido
completamente especificado y no dejado al
kernel o a la implementacin
Lenguajes: SIMULA I y SL5
8

Enunciados fork-join
Enunciado fork especifica que una rutina
puede empezar su ejecucin
La rutina invocada y la rutina invocadora
proceden concurrentemente
Para sincronizar invocada e invocadora, esta
ltima puede ejecutar un join
Enunciado join retrasa ejecucin rutina
invocadora hasta que la rutina invocada
termine
9

Comentarios fork-join
Enunciados fork-join puede aparecer en
condicionales y ciclos
es necesario entender bien la ejecucin del programa,
para saber que rutinas se van a ejecutar concurrentemente

Cuando se usa de forma disciplinada los


enunciados son prcticos y poderosos
fork proporciona un mecanismo para la creacin
dinmica de procesos
enunciados similares tambin estn incluidos en PL/I y
Mesa
10

El enunciado cobegin
Es una forma estructurada de denotar una
ejecucin concurrente
Por ejemplo:
cobegin S1 || S2 || || Sn coend
denota una ejecucin concurrente de S1, S2,
Sn
cada uno de los Sis puede ser cualquier
enunciado incluyendo un cobegin o un bloque
con declaraciones locales
11

Caractersticas cobegin
La ejecucin de un cobegin solo termina cuando la
ejecucin de todos los Sis termin
No es tan potente como fork-join, pero es
suficiente para especificar la mayor parte de los
clculos concurrentes
Sintaxis hace explcito cuales rutinas son
ejecutadas concurrentemente
Variantes implementadas en ALGOL68, CSP,
Edison y Argus
12

Ejecucin concurrente:
Tareas/Procesos
Declaracin explcita de los procesos:
task body Process is
begin
. . .
end;
Ejemplo: ADA

13

Ejecucin Concurrente Posix


Mecanismos: fork y pthreads.
fork crea un nuevo proceso
pthreads son una extensin POSIX y
permite que un hilo/hebra sean creados.
Todos los hilos/hebras tienen atributos que
permiten su manipulacin.

14

Ejemplo

15

Brazo del Robot en POSIX


const int WORK=1000000;
const int MAXREGS=50;
pthread_attr_t attributes;
pthread_t xp, yp, zp;
time_t inicio, tiempo;
int new_setting(int *D);
void move_arm(int *D, int P);
void *controller(void * dim);

16

int main() {
int X, Y, Z, rc;
void *result;
printf("Programa ejecutandose...Para finalizar, cierre la ventana. \n");
inicio=time(NULL); // cogemos tiempo de referencia
X = 1,
Y = 2;
Z = 3;
/* se establecen los atributos por defecto */
rc=pthread_attr_init(&attributes);
checkResults("pthread_attr_init()", rc);
rc=pthread_create(&xp, &attributes, controller, (void *)&X);
checkResults("pthread_create(X)", rc);
rc=pthread_create(&yp, &attributes, controller, (void *)&Y);
checkResults("pthread_create(Y)", rc);
rc=pthread_create(&zp, &attributes, controller, (void *)&Z);
checkResults("pthread_create(Z)", rc);
pthread_join(xp, (void **)&result);
/* Necesario para bloquear el programa principal
La rutina pthread_join espera a que finalizen las hebras,
con lo que se queda en espera pues las hebras no finalizan
*/
exit(EXIT_FAILURE);
/* El programa no debera terminar con lo que si finaliza se devuelve un
error */
}

17

void *controller(void * dim)


{
int position, setting, j;
double result;
int *eje;
eje=(int*)dim;
position = 0;
while (1) {
/*
Bucle para que la CPU este
trabajando y las hebras se puedan ir
alternando
*/
result=0;
for (j=0; j < WORK; j++)
result = result + j/2;
move_arm(eje, position);
setting = new_setting(eje);
position = position + setting;
}
/* Notar que la hebra no finaliza */
}

18

/*
Rutina de simulacion del movimiento del brazo.
Se graban mensajes en un fichero para cada eje de movimiento
*/
void move_arm(int *D, int P)
{
FILE * pFile;
char c[50];
long t;
if (P<MAXREGS ) // ponemos condicin para grabar en fichero sino se grabara indefinidamente
{
if (P==0) // creamos los ficheros al inicio del movimiento
{
if (*D==1) pFile = fopen ("ejex.txt","w");
if (*D==2) pFile = fopen ("ejey.txt","w");
if (*D==3) pFile = fopen ("ejez.txt","w");
}
else
{
if (*D==1) pFile = fopen ("ejex.txt","a+");
if (*D==2) pFile = fopen ("ejey.txt","a+");
if (*D==3) pFile = fopen ("ejez.txt","a+");
}
tiempo=time(NULL);
t=tiempo-inicio;
sprintf(c, "[clock: %d seg.] Valor de posicion P=%d \n",t,P);
fputs (c,pFile);
fclose (pFile);
}
}

19

A implementar new_setting

20

Comunicacin y Sincronizacin
El comportamiento correcto de un programa concurrente
depende estrechamente de la sincronizacin y la
comunicacin entre procesos.
Sincronizar es satisfacer las restricciones en el entrelazado
de las acciones de diferentes procesos. Una accin
particular de un proceso slo ocurre despus de una accin
especfica de otro proceso.
La sincronizacin debe llevar simultneamente a dos
procesos a estados predefinidos.
Comunicar es pasar informacin de un proceso a otro. Los
dos conceptos estn ligados, puesto que algunas formas de
comunicacin requieren sincronizacin y la sincronizacin
puede ser considerada como comunicacin sin contenido.
21

La exclusin mutua
Garantizar que si un proceso utiliza una variable o
algn recurso compartido, los dems no podrn
usarlos al mismo tiempo
Conocida como mutex
Cada proceso debe verificar que durante cierta
parte del tiempo, puede tener acceso a la memoria
compartida de archivos o realizando labores
crticas que pueden llevar a conflictos
22

Exclusin Mutua
La comunicacin entre procesos se basa
normalmente o en el uso de variables
compartidas o en el paso de mensajes.
Aunque las variables compartidas parecen
una forma directa de pasar informacin
entre procesos su uso debe ser restringido.
Debido a los problemas de actualizacin.
23

Exclusin mutua
Una secuencia de sentencias que debe
aparecer como ejecutada indivisiblemente
se denomina seccin crtica.
La sincronizacin que se precisa para
proteger una seccin crtica se conoce como
exclusin mutua.

24

Seccin crtica
Parte del cdigo en el cual se tiene acceso a
una variable o archivo compartido
Corolario:
si dos procesos no estn al mismo tiempo en
seccin crtica, podemos evitar las condiciones
de competencia

25

Asignacin recursos
Sean n procesos que entran en conflicto por el
acceso a un recurso nico no compartible
Recurso a usar en seccin crtica
Necesario usar un protocolo formado de tres
partes:
protocolo de adquisicin
<uso del recurso en seccin crtica>
protocolo de liberacin
26

Gestin de Mutex

27

Gestin de Mutex
Introduccin

Mutex es una abreviacin de "mutual exclusion". Las rutinas Mutex ofrecen una
de las principales herramientas para implementar sistemas de sincronizacin de
hebras y de proteccin de variables compartidas cuando se accede en modo
escritura desde varios hilos de forma simultnea. Cuando hablamos de mutex
nos referimos en realidad a la variable asociada al mutex o mutex variable
El mutex acta como una llave, protegiendo el acceso a recursos compartidos. El
concepto bsico subyacente a las rutinas mutex usadas en Pthread es que
nicamente 1 hebra puede tener el control o bloquear una variable mutex en un
instante del tiempo, es decir, si varias hebras intentan simultneamente tomar el
control de la variable, nicamente una de ellas lo conseguir, ponindose las
dems hebras en cola de espera hasta que el mutex sea desbloqueado por la
hebra propietaria.
Los mutex se pueden utilizar para evitar situaciones inconsistentes por ejemplo
en una situacin en que se accede simultaneamente a una variable que acumula
el saldo de una cuenta podramos encontrarnos con la siguiente situacin:
Tiempo
T1

Hebra 1
Saldo ledo: 8000

T2
T3

T6

Saldo
8000

Saldo ledo: 8000


Ingresa: 200

T4
T5

Hebra 2

8000
8000

Ingresa: 200
Actualiza Saldo: 8000+200

8000
8200

Actualiza Saldo: 8000+200

8200!!

En este ejemplo, la hebra que actualiza el saldo debe bloquear el mutex antes de
la lectura del saldo y desbloquearlo una vez actualizado su valor. A menudo las
acciones que efecta una hebra propietaria de un mutex es actualizar variables
globales. Esta es la manera de garantizar que el resultado de la actualizacin ser
el mismo que se hubiera producido si solamente tuviramos una hebra en
ejecucin.
La secuencia tpica de instrucciones de un mutex es la siguiente:
o Inicializar y crear el mutex
o Varias hebras intentan bloquear el mutex
o Unicamente una de ellas lo consigue, pasando a ser la hebra propietaria
o La hebra propietaria efecta una serie de acciones
o La hebra propietaria desbloquea el mutex
o Otra hebra toma el control del mutex y se repite la secuencia
o Finalmente se destruye el mutex.

Creacin y destruccin de Mutex

POSIX define las siguientes rutinas para la inicializacin y destruccin de


MUTEX:

int pthread_mutex_init(pthread_mutex_t *mutex, const


thread_mutexattr_t *attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutexattr_init( pthread_mutexattr_t *attr );
int pthread_mutexattr_destroy( pthread_mutexattr_t *attr );

Pthread_mutex_init:

Las varibales Mutex deben declarase con el tipo pthread_mutex_t, y deben


inicializarse antes de poder trabajar con ellas. Cuando se crea, la variable mutex
est en estado desbloqueada. Hay 2 maneras de inicializar una variable Mutex:
1. Estticamente en el momento en que se declara la variable, mediante la
macro PTHREAD_MUTEX_INITIALIZER. En este caso se inicializa con los
valores por defecto:
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
2. Dinmicamente con la rutina pthread_mutex_init() routine. Este

mtodo permite especificar los atributos del mutex, attr.


La variable attr apunta al objeto que se utiliza para establecer las propiedades
del mutex y debe ser del tipo pthread_mutexattr_t. Si se deja a NULL, el mutex
se inicializa con las propiedades por defecto con lo que el resultado es
equivalente a inicializarlo estticamente.

Pthread_mutex_destroy:

La rutina pthread_mutex_destroy() debe usarse para destruir un mutex no

bloqueado que no deba volver a utilizarse en el programa.


Pthread_mutexattr_init/destroy:

Las rutinas pthread_mutexattr_init() y pthread_mutexattr_destroy()


se usan para crear y destruir respectivamente los objetos atributo de mutex
pthread_mutexattr_init() inicializa el objeto apuntado por attr con los
valores por defecto. Estos atributos actuan como parmetros adicionales que se
pasan en la creacin del mutex. Cuando un mutex es inicializado con sus
atributos, dichos atributos se copian dentro de mutex por lo que, una vez
inicializado el mutex, los atributos ya no son necesarios para el resto del
programa y se pueden destruir.
Si se desean crear los mutex con los atributos por defecto, no es necesario
inicializar explcitamente con pthread_mutexattr_init().

Bloqueo y desbloqueo de Mutex

POSIX define las siguientes rutinas para la bloqueo y desbloqueo de MUTEX:

int pthread_mutex_lock(pthread_mutex_t *mutex);


int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

Pthread_mutex_lock:

La rutina pthread_mutex_lock() se utiliza para que una hebra solicite la


propiedad del mutex especificado por la variable mutex. Si el mutex esta
bloqueado en ese instante por otra hebra, la llamada a la rutina bloquear la
ejecucin de la hebra solicitante hasta que el mutex se desbloquee por la hebra
propietaria.

Pthread_mutex_trylock:

pthread_mutex_trylock() intenta bloquear el mutex especificado por la

variable mutex. Sin embargo, si el mutex est bloqueado, la rutina retorna de


forma inmediata a la hebra solicitante (sin esperar a su desbloqueo) pero con un
cdigo de retorno que indica que el mutex est bloqueado. Esta rutina puede ser
til para evitar situaciones de deadlock en que conditions, as in a priorityinversion situation.
Pthread_mutex_unlock:

pthread_mutex_unlock() desbloquea el mutex si es llamado por la hebra que

lo ha bloqueado (hebra propietaria del mutex). Se debe llamar a esta rutina una
vez la hebra ha completado las instrucciones que deban ser protegidas de
accesos concurrentes. Se produce un error si el mutex ya est desbloqueado o
bien la hebra no es propietaria del mutex.
Cuando varias hebras estan esperando el desbloqueo de un mutex para adquirirlo
como propietarias, a menos que se haya aplicado algn mecanismo de
planificacin (priorizacin), la asignacin del mutex a una u otra hebra se delega
al sistema operativo, el cual, lo har de forma ms o menos aleatoria.
Es responsabilidad del programador hacer buen uso de la utilizacin del mutex.
En el siguiente ejemplo (en el cual hay una hebra para la cual no se ha
especificado mutex) se ha producido un error de lgica de programacin ya que
el resultado final ser aleatorio:
Hebra 1(*)
Lock
A = 2
Unlock

Hebra 2(*) Hebra 3(***)


Lock
A = A+1
A = A*B
Unlock

(*) prioridad alta, (**) prioridad media, (***) prioridad baja

Ejemplo: Uso de Mutex


Programa de ejemplo - Mutex
En este programa se muestra la utilizacin de mutex para garantizar la
exclusividad en la actualizacin de variables globales.
Se trata de un ejercicio a efectos meramente didcticos.
Se toma el valor de la variable 'saldo' al inicio del bucle que simula que
la CPU est trabajando y se incrementa el saldo con el valor 'ingreso'
Deberemos observar el comportamiento del programa con mutex y sin
mutex..
#include
#include
#include
#include
#include

<pthread.h>
<windows.h>
<stdio.h>
<stdlib.h>
"check.h"

int const NUMTHRDS=4;


int const INGRESO=1;
int const WORK=1000;
int sw_mutex;
no

// variable para indicar al programa si utiliza mutex o

/* Definimos variables globales y variables mutex */


int num_thrd[NUMTHRDS];
double Saldo;
pthread_t callThd[NUMTHRDS];
pthread_mutex_t mutexsum;
void *acumsaldo(void *arg);
/*
El programa principal crea las hebras que actualizan el saldo.
Antes de crear las hebras se inicializa la variable saldo.
Para evitar que las hebras actualizen simultaneamente la variable
debe usarse mutex. El programa principal debe esperar a que acaben
todas las hebras antes de presentar el resultado final.
*/
int main (int argc, char *argv[])
{
int i, rc;
void *status;
pthread_attr_t attr;
sw_mutex=-1;
while (sw_mutex<0 || sw_mutex>1) {
cout<<"Con mutex, entre 1, sin mutex, entre 0: ";
cin>>sw_mutex;
}
if (sw_mutex==0) cout<<endl<<"Sin mutex"<<endl<<endl;
else cout<<endl<<"Con mutex"<<endl<<endl;
Saldo=0;
rc=pthread_mutex_init(&mutexsum, NULL);
checkResults("pthread_mutex_init()", rc);
rc=pthread_attr_init(&attr);
checkResults("pthread_attr_init()", rc);
// creamos la hebra en modo "joinable" a efectos de portabilidad
rc=pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
checkResults("pthread_attr_setdetachstate()", rc);

for(i=0;i<NUMTHRDS;i++)
{
// asignamos valores a la variable pasada por parametro.
Identificar el mutex
num_thrd[i]=i+1;
// creamos la 4 hebras
rc=pthread_create( &callThd[i], &attr, acumsaldo, (void
*)&num_thrd[i]);
checkResults("pthread_create()", rc);
}
rc=pthread_attr_destroy(&attr);
checkResults("pthread_attr_destroy()", rc);
/* Esperamos la finalizacin de las 4 hebras */
for(i=0;i<NUMTHRDS;i++) {
rc=pthread_join( callThd[i], &status);
checkResults("pthread_join()", rc);
}
/* Despues del join, presentamos el resultado */
printf ("Saldo = %f \n", Saldo);
pthread_mutex_destroy(&mutexsum);
system("pause");
pthread_exit(NULL);
}
void *acumsaldo(void *arg)
{
int i,j, *hebra;
double saldo,k;
hebra = (int *) arg;

// Bloqueo del mutex antes de actualizar la variable.


if (sw_mutex==1) pthread_mutex_lock (&mutexsum);
saldo=Saldo;
printf ("Saldo inicio hebra %d %f \n",*hebra, saldo);
for (i=1; i<=WORK ; i++)
{
saldo += INGRESO;
}
//
Sleep(1);
// para simular consumo CPU
for (i=1; i<=2*WORK ; i++)
for(j=1; j<=WORK ; j++) k=i/j;
Saldo += saldo;
printf ("Saldo final hebra %d %f \n",*hebra, Saldo);
// Desbloqueo del mutex antes de actualizar la variable.
if (sw_mutex==1) pthread_mutex_unlock (&mutexsum);
pthread_exit((void*) 0);
}

Das könnte Ihnen auch gefallen