Professional Documents
Culture Documents
Tiempo Real
1. Introduccin [Burns 8]
2. Monitores [Burns 8]
3. Concurrencia en Ada 95 [Burns 7, Burns 9]
4. Objetos Protegidos [Burns 8, Burns 11]
1. Introduccin [Burns 8]
2. Monitores [Burns 8]
3. Concurrencia en Ada 95 [Burns 7, Burns 9]
4. Objetos Protegidos [Burns 8, Burns 11]
Introduccin
Semforos
Son variables globales
Son 'engorrosos'
Conceptualmente de bajo nivel
Flexibles pero poco escalables
Error-prone
Paso de mensajes
No modela, de forma natural, el acceso a un
recurso compartido
Bajo nivel
Introduccin
Semforos, v.m.c., mensajes Llamadas al SO
Lenguajes que no necesitan del SO
Mecanismos ms avanzados y de alto nivel
En este tema...
Monitores
Ada 95 y su modelo de tareas
Objetos protegidos
1. Introduccin [Burns 8]
2. Monitores [Burns 8]
3. Concurrencia en Ada 95 [Burns 7, Burns 9]
4. Objetos Protegidos [Burns 8, Burns 11]
Monitores
TAD con operaciones en exclusin mutua
Encapsulacin
Normalmente manejan una cola FIFO interna
Monitores
Slo un proceso activo en cada momento
La exclusin mutua la genera el compilador
Generalmente mediante semforos
Bloqueo dentro del monitor
Ejemplo: Productor/Consumidor
Productor inserta y buffer est lleno
Antes interbloqueo
Variables de Condicin
Operativa
Sobre las cuales los procesos ejecutan wait y signal
Bloqueo con wait
Otro proceso puede entrar en el monitor
Desbloqueo con signal sobre variable de condicin
Asocia variable de condicin sobre cualquier
seal que permite bloqueo/desbloqueo
Ej. variable espacio_libre en el productor/consumidor
Monitores en POSIX
Biblioteca Pthreads
Necesarios mecanismos para exclusin mutua y
la sincronizacin
Mutex
Variables de condicin
1 7 3
primero ltimo
Monitores en POSIX
class Buffer {
public:
Buffer();
~Buffer();
void produce(int item);
int consume();
private:
int _n_data;
int _first, _last;
int _data[MAX_SIZE];
pthread_mutex_t _mutex;
pthread_cond_t _buffer_not_full;
pthread_cond_t _buffer_not_empty;
};
Monitores en POSIX
Constructor/Destructor
Buffer::Buffer():
_n_data(0), _first(0), _last(0)
{
pthread_mutex_init(&_mutex, NULL);
pthread_cond_init(&_buffer_not_full, NULL);
pthread_cond_init(&_buffer_not_empty, NULL);
}
Buffer::~Buffer()
{
pthread_mutex_destroy(&_mutex);
pthread_cond_destroy(&_buffer_not_full);
pthread_cond_destroy(&_buffer_not_empty);
}
Monitores en POSIX
// Synchronization
pthread_cond_signal(&_buffer_not_empty);
pthread_mutex_unlock(&_mutex);
}
Monitores en POSIX
int Buffer::consume() {
int item;
pthread_cond_signal(&_buffer_not_full); // Synchronization
pthread_mutex_unlock(&_mutex);
return item;
}
Monitores en POSIX
Create
static void *producer_func (void *arg); threads
static void *consumer_func (void *arg);
Monitores en POSIX
Monitores en POSIX
Monitores en POSIX
Crticas
No soluciona bien las sincronizaciones de condicin
fuera del monitor
Crticas de los semforos aplicables a variables de
condicin
Cuidado! Slo un proceso activo dentro del monitor
(signal como ltima instruccin)
Cdigo menos legible con variables de condicin
1. Introduccin [Burns 8]
2. Monitores [Burns 8]
3. Concurrencia en Ada 95 [Burns 7, Burns 9]
4. Objetos Protegidos [Burns 8, Burns 11]
ADA
OO, fuertemente tipado, multi-propsito y gran
soporte concurrencia
Sistemas de tiempo real crticos muy fiables y
mantenibles
Estructuras propias del lenguaje
Concurrencia; Sincronizacin; Tiempo Real
Cuatro versiones: 83, 95, 2005 y 2012
Necesidades expresadas por la industria
task body T is
a:Duration := Duration(4);
ID_T:Task_Id := Null_Task_Id;
begin
ID_T := Current_Task;
loop
delay a;
Put("I am the task ");
Put_Line(Image(ID_T));
end loop;
end T;
procedure tasks is
- Definition of the previous slide
F:T; -- Variable of T class
X:T; -- Another task
begin
null;
end tasks;
Problema Productor/Consumidor
Modelo del buffer
task Buffer is
entry Write(D: Data);
entry Read(D: out Data);
end Buffer;
Problema Productor/Consumidor
Modelo del buffer
task body Buffer is Estructura potente en Ada.
ElemLocal : Data; Espera de forma
begin concurrente cualquiera de los
entry (evita bloqueo
loop en un slo accept)
select
accept Write(D: Data) do
ElemLocal := D; -- Store the element
end Write;
or
accept Read(D: out Dato) do
D := ElemLocal; -- Get the element
end Read;
end select;
end loop;
end Buffer;
Problema Productor/Consumidor
Modelo del buffer limitado
task body Buffer is
MaxSize: constant := 100
Data: array(1..MaxSize) of TElement;
i,j: integer range 1..MaxSize := 1;
NData: integer range 0..MaxSize := 0;
begin
loop
select when NData < MaxSize =>
accept Write(D: TElement) do
Data(i) := D;
end Write;
i := i mod MaxSize + 1;
NData := NData + 1;
or when NData > 0 =>
accept Read(D: TElement) do
D := Data(j);
end Read;
j := j mod N+1;
NData := NData - 1;
end select;
end loop;
end Buffer;
1. Introduccin [Burns 8]
2. Monitores [Burns 8]
3. Concurrencia en Ada 95 [Burns 7, Burns 9]
4. Objetos Protegidos [Burns 8, Burns 11]
Objetos Protegidos
Tipo especfico de Ada
Permite definir estructuras complejas privadas
(accesibles mediante procedimientos, funciones
o entradas)
Definen guardas o barreras en las definiciones
de las entradas
Ms fciles de entender e implementar
Guarda o barrera: condicin que se debe
cumplir para que el proceso entre en el
procedimiento
Exclusin mutua en la llamada al procedimiento
Bloqueos en la guarda
Objetos Protegidos
Procedimientos, funciones y entradas
Elementos del lenguaje (no llamadas al SO)
Procedimientos proporcionan exclusin mutua
Funciones permiten acceso concurrente
Para operaciones de slo lectura
Mantienen exclusin mutua con procedimientos
E.j. lectura concurrente pero escritura en exclusin
mutua
Entradas. Procedimientos con barreras
booleanas
Exclusin mutua y adems condicin de barrera
end Sticks;
http://es.wikibooks.org/wiki/Programacion_en_Ada/Tareas/Ejemplos
end Stick;
end Sticks;
begin
loop
Eat;
Think;
end loop;
end TPhilosopher;
declare
type PTPhilosopher is access TPhilosopher;
P: PTPhilosopher;
C: Character := 'A';
StickList: array (1..Num_Sticks)
of PStick;
Barreras booleanas
Cundo se evala una barrera para saber si se
ha cambiado su estado?
Se desbloquean las tareas bloqueadas en ella?
Se evalan siempre que...
Nueva tarea evala la barrera y sta hace
referencia a una variable o atributo relevante.
Tarea abandona procedimiento o entrada y hay
tareas bloqueadas en barreras que referencian a
variables o atributos relevantes
No puedes usar variables globales en barreras
ni ejecutar operaciones potencialmente
bloqueantes