Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Nociones de
Programación Concurrente
y
Sistemas en Tiempo Real
Alberto Hamilton
ULL
Contenido
●
Concurrencia
– Planteamiento
– Semáforos
– Concurrencia en C++11
●
Sistemas en Tiempo Real
– Características
– Medida y control del tiempo
– C++ chrono
– Tareas periódicas y retardos
– Planificación
P1 P1
P2 P2
P3 P3
t t
Consumidor2
Productor2
ProductorN ConsumidorM
●
Sistemas en Tiempo Real
– Características
– Medida y control del tiempo
– C++ chrono
– Tareas periódicas y retardos
– Planificación
#include <semaphore.h>
// código inicial
sem_t sem;
sem_init(&sem,0,1);
– En cada proceso:
/* cada proceso */
sem_wait(&sem); //protocolo de entrada
/* Sección crítica */
/* Manejo de recurso compartido */
//Consumidor //Productor
while(1) { while(1) {
sem_wait(&llenos); /* Produce dato */
sem_wait(&exmu);
sem_wait(&vacios);
/* retira elemento */ sem_wait(&exmu);
●
Sistemas en Tiempo Real
– Características
– Medida y control del tiempo
– C++ chrono
– Tareas periódicas y retardos
– Planificación
#include <thread>
void funcionHilo1(int v1, double v2)
{
// código a ejecutar en el hilo
}
int main()
{
std::thread hilo1(funcionHilo1, 4, 3.3);
std::thread hilo2(funcionHilo1, 10, -5.97);
//hilo1, hilo2 e hilo principal
// se ejecutan concurrentemente
...
Concurrencia y STR 15/52
C++ hilos: métodos
Si queremos ejecutar método
– constructor se le pasa
●
puntero al método
●
puntero al objeto
●
parámetros que espera la función
class X {
public:
void doWork(int n);
};
int main()
{
X my_x;
#include <thread>
int main()
{
std::thread hilo1(fHilo1, 4, 3.3);
std::thread hilo2(fHilo1, 10. -5.97);
#include <thread>
int main()
{
std::thread hilo1(fHilo1, 4, 3.3);
hilo1.detach(); //desconectamos hilo 1
// hilo1 se seguirá ejecutando
// se borran sus recursos en cuanto termine
}
#include <mutex>
std::mutex miMutex;
// sección crítica
// sale de ámbito guard -> se libera miMutex
}
Concurrencia y STR 21/52
C++: unique_lock
Como lock_guard pero además:
– con métodos de mutex: lock() y unlock()
– se puede usar donde vaya mutex
std::mutex miMutex;
void fHilo1(int v1, double v2)
{
std::unique_lock<std::mutex> uLock(miMutex);
// se ha hecho lock() sobre miMutex
// sección crítica
uLock.unlock()
// código no crítico
uLock.lock()
// sección crítica
// sale de ámbito uLock -> se libera miMutex
}
Concurrencia y STR 22/52
C++: sincronismo
Se utilizan las variables de condición (VC)
– cola de hilos esperando condición de sincronización
– clase std::condition_variable
– asociadas a mutex que protege recurso
– wait() bloquea hilo y libera mutex
●
si el recurso en estado inadecuado
●
cuando se desbloquea tiene el mutex
●
condición puede no cumplirse
– volver a comprobar → bucle while
– notify_one() notify_all()
●
desbloquea el primer (todos) hilo bloqueado en la VC
●
invocar cuando estado del recurso a cambiado
// Consumidor
{ // tratamos de sacar dato en buffer
std::unique_lock<std::mutex> lck(mBuffer);
while(NumDatos == 0) {
// no hay datos -> nos bloqueamos
vcDatos.wait(lck);
}
// sección crítica -> sacamos dato en el buffer
vcHuecos.notify_one(); // ahora hay huecos
} //lck sale de ámbito y se libera mBuffer
Concurrencia y STR 25/52
Contenido
●
Concurrencia
– Planteamiento
– Semáforos
– Concurrencia en C++
●
Sistemas en Tiempo Real
– Características
– Medida y control del tiempo
– C++ chrono
– Tareas periódicas y retardos
– Planificación
●
Sistemas en Tiempo Real
– Características
– Medida y control del tiempo
– C++ chrono
– Tareas periódicas y retardos
– Planificación
Tiempo relativo
– intervalos de tiempo
●
Sistemas en Tiempo Real
– Características
– Medida y control del tiempo
– C++ chrono
– Tareas periódicas y retardos
– Planificación
// medir tiempos
auto start = std::chrono::high_resolution_clock::now();
// hacer algo
auto stop = std::chrono::high_resolution_clock::now();
std::chrono::nanoseconds tardo = stop - start;
std::cout<< "Se tardó " << tardo.count() << " nanosegundos";
●
Sistemas en Tiempo Real
– Características
– Medida y control del tiempo
– C++ chrono
– Tareas periódicas y retardos
– Planificación
this_thread::sleep_for(periodo);
}
Pueden ser
– hardware → interrupción
●
sin derivas
– software
●
En sistemas UNIX → señales al proceso
●
Precisión de segundos
●
Derivas locales
unique_lock.try_lock_for(duration);
unique_lock.try_lock_until(time_point);
condition_variable.wait_for(duration);
condition_variable.wait_until(time_point);
●
Sistemas en Tiempo Real
– Características
– Medida y control del tiempo
– C++ chrono
– Tareas periódicas y retardos
– Planificación
Pi
Di
Algoritmos:
– Planificación cíclica
– Planificación basada de prioridades
●
Prioridades estáticas
●
Prioridades dinámicas
...
C. Secundario
Ciclo Principal
C. Secundario (PB)