-
Notifications
You must be signed in to change notification settings - Fork 0
/
ejecutivo1.cpp
99 lines (84 loc) · 3.17 KB
/
ejecutivo1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// -----------------------------------------------------------------------------
//
// Sistemas concurrentes y Distribuidos.
// Práctica 4. Implementación de sistemas de tiempo real.
//
// Archivo: ejecutivo1.cpp
// Implementación del primer ejemplo de ejecutivo cíclico:
//
// Datos de las tareas:
// ------------
// Ta. T C
// ------------
// A 250 100
// B 250 80
// C 500 50
// D 500 40
// E 1000 20
// -------------
//
// Planificación (con Ts == 250 ms)
// *---------*----------*---------*--------*
// | A B C | A B D E | A B C | A B D |
// *---------*----------*---------*--------*
//
//
// Historial:
// Creado en Diciembre de 2017
// -----------------------------------------------------------------------------
#include <string>
#include <iostream> // cout, cerr
#include <thread>
#include <chrono> // utilidades de tiempo
#include <ratio> // std::ratio_divide
using namespace std ;
using namespace std::chrono ;
using namespace std::this_thread ;
// tipo para duraciones en segundos y milisegundos, en coma flotante:
typedef duration<float,ratio<1,1>> seconds_f ;
typedef duration<float,ratio<1,1000>> milliseconds_f ;
// -----------------------------------------------------------------------------
// tarea genérica: duerme durante un intervalo de tiempo (de determinada duración)
void Tarea( const std::string & nombre, milliseconds tcomputo )
{
cout << " Comienza tarea " << nombre << " (C == " << tcomputo.count() << " ms.) ... " ;
sleep_for( tcomputo );
cout << "fin." << endl ;
}
// -----------------------------------------------------------------------------
// tareas concretas del problema:
void TareaA() { Tarea( "A", milliseconds(100) ); }
void TareaB() { Tarea( "B", milliseconds( 80) ); }
void TareaC() { Tarea( "C", milliseconds( 50) ); }
void TareaD() { Tarea( "D", milliseconds( 40) ); }
void TareaE() { Tarea( "E", milliseconds( 20) ); }
// -----------------------------------------------------------------------------
// implementación del ejecutivo cíclico:
int main( int argc, char *argv[] )
{
// Ts = duración del ciclo secundario
const milliseconds Ts( 250 );
// ini_sec = instante de inicio de la iteración actual del ciclo secundario
time_point<steady_clock> ini_sec = steady_clock::now();
while( true ) // ciclo principal
{
cout << endl
<< "---------------------------------------" << endl
<< "Comienza iteración del ciclo principal." << endl ;
for( int i = 1 ; i <= 4 ; i++ ) // ciclo secundario (4 iteraciones)
{
cout << endl << "Comienza iteración " << i << " del ciclo secundario." << endl ;
switch( i )
{
case 1 : TareaA(); TareaB(); TareaC(); break ;
case 2 : TareaA(); TareaB(); TareaD(); TareaE(); break ;
case 3 : TareaA(); TareaB(); TareaC(); break ;
case 4 : TareaA(); TareaB(); TareaD(); break ;
}
// calcular el siguiente instante de inicio del ciclo secundario
ini_sec += Ts ;
// esperar hasta el inicio de la siguiente iteración del ciclo secundario
sleep_until( ini_sec );
}
}
}