-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCluster.hh
executable file
·188 lines (169 loc) · 7.18 KB
/
Cluster.hh
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/**
* @file Cluster.hh
*
* @brief Especificación de la clase Cluster.
*
*/
#ifndef _CLUSTER_
#define _CLUSTER_
#include "Procesador.hh"
#include "Proceso.hh"
#ifndef NO_DIAGRAM
#include<map>
#include "BinTree.hh"
#include<vector>
#include<iostream>
#include<queue>
#endif
/**
* @class Cluster
* @brief Representa a un cluster de procesadores.
*
* Se proporciona un cluster donde los procesadores se encuentran distribuidos en forma de arbol binario, teniendo cada uno entre 0 y 2 subprocesadores. Todo cluster tiene que tener por lo menos un procesador
*/
class Cluster
{
private:
/**@brief Mapa de procesadores, con el identificador como clave y el Procesador como valor*/
map<string, Procesador> procesadores_mapa;
/**@brief Arbol de procesadores*/
BinTree<string> procesadores_arbol;
/**
* @brief Lee la estructura del cluster
* \pre El cluster esta vacio
* \post Se leen los procesadores y se almacenan en las variables.
* \coste Lineal en el numero de procesadores
*/
static void leer_cluster(BinTree<string>& arbol_procesadores, map <string, Procesador>& procesadores);
/**
* @brief Modifica el cluster copiando los procesadores del cluster c en el cluster actual, manteniendo la jerarquia de procesadores
* \pre El procesador ID existe y no contiene procesos en marcha
* \post Se copian los procesadores del cluster c en el cluster actual, manteniendo la jerarquia de procesadores. En caso de que el procesador ID tenga subprocesadores, se lanza un error.
* \coste Lineal en el numero de procesadores del cluster c_temp
*/
bool juntar_arboles(const string& procID, Cluster& c, BinTree<string>& arbol);
/**
* @brief Busca un procesador en el cluster que cumpla las condiciones necesarias para añadir un proceso
* La busqueda se realiza siguiendo el metodo breadth-first search
* \pre El cluster no esta vacio
* \post Se devuelve un iterador al procesador que cumple las condiciones necesarias para añadir un proceso
* \coste Lineal en el numero de procesadores del cluster
*/
void search_valid_proc(map<string, Procesador>::iterator& cpu_iterator, const BinTree<string>& proc_tree, int pid, int req_mem);
/**
* @brief Devuelve el mapa de procesadores del cluster
* \pre *Cierto*
* \post Se devuelve el mapa de procesadores del cluster
* \coste Lineal
*/
map<string, Procesador> get_cpu_map() const;
/**
* @brief Devuelve el arbol de procesadores del cluster
* \pre *Cierto*
* \post Se devuelve el arbol de procesadores del cluster
* \coste Lineal
*/
BinTree<string> get_cpu_tree() const;
/**
* @brief Imprime la estructura del cluster
* \pre *Cierto*
* \post Se imprime la estructura del cluster
* \coste Lineal en el numero de procesadores
*/
static void print_cluster(const BinTree<string>& arbol_procesadores);
public:
// Constructoras
/**
* @brief Constructora Cluster
*
* \pre *Cierto*
* \post Genera un objeto "Cluster" pero sin inicializarlo.
*
*/
Cluster();
// Modificadoras
/**
* @brief Añade un proceso al procesador especificado
* \pre El Proceso proceso no existe en el cluster y el procesador ID existe
* \post Se añade el proceso al procesador especificado. Si ya existe el proceso o no existe el procesador, o no hay suficiente espacio en el procesador, se lanza un error.
* \coste Logaritmico (llamada a add_proceso de Procesador)
*
*/
void add_proc_cpu(const Proceso& proceso, const string& ID);
/**
* @brief Busca un procesador apto para el Proceso p_to_add proporcionado por el area de espera y devuelve un booleano indicando si se ha encontrado un procesador apto
* \pre El Proceso p_to_add no existe en el cluster
* \post Se devuelve un booleano indicando si se ha encontrado un procesador apto para el Proceso p_to_add proporcionado por el area de espera. Si no se ha encontrado un procesador apto, se devuelve false.
* \coste lineal al buscar y logaritmico al añadir (llamada a add_proceso de Procesador)
*
*/
bool add_proc_ep(const Proceso& p_to_add);
/**
* @brief Actualiza los tiempos de los procesos en el cluster
* \pre *Cierto*
* \post Se avanza el tiempo de ejecucion de los procesos en el cluster
* \coste Lineal en el numero de procesos del cluster
*
*/
void avanzar_tiempo(int segundos);
/**
* @brief Elimina el proceso con identificador PID del procesador especificado
* \pre El procesador cpuID existe y contiene el proceso con identificador PID
* \post Se elimina el proceso con identificador PID del procesador especificado. Si no existe el procesador o no contiene el proceso, se lanza un error.
* \coste Logaritmico (llamada a del_proceso de Procesador)
*
*/
void eliminar_proceso(const string& cpuID, int PID);
/**
* @brief Modifica el cluster copiando los procesadores del cluster c en el cluster actual, manteniendo la jerarquia de procesadores
* \pre El procesador ID existe y no contiene procesos en marcha
* \post Se copian los procesadores del cluster c en el cluster actual, manteniendo la jerarquia de procesadores. En caso de que el procesador ID tenga subprocesadores, se lanza un error.
* \coste Logaritmico (busquedas en mapas) y lineal (funcion juntar_arboles)
*/
void modificar_cluster(const string& cpuID, Cluster& cluster);
/**
* @brief Compacta la memoria del cluster
* \pre *Cierto*
* \post Se compacta la memoria de cada procesador del cluster
* \coste Lineal
*
*/
void compactar_memoria_cluster();
/**
* @brief Compacta la memoria del procesador especificado
* \pre El procesador ID existe
* \post Se compacta la memoria del procesador especificado. Si no existe el procesador, se lanza un error.
* \coste Logaritmico
*/
void compactar_mem_proc(const string& ID);
// Lectura y escritura
/**
* @brief Lee la estructura del cluster
* \pre *Cierto*
* \post Se leen los procesadores y se almacenan en las variables.
* \coste Lineal
*/
void leer_estructura_cluster();
/**
* @brief Imprime la estructura del cluster
* \pre *Cierto*
* \post Se imprime la estructura del cluster
* \coste Lineal en el numero de procesadores
*/
void imprimir_estructura_cluster() const;
/**
* @brief Imprime los procesadores del cluster, junto a sus detalles
* \pre *Cierto*
* \post Se imprime los procesadores del cluster, junto a sus detalles
* \coste Lineal en el numero de procesadores
*/
void imprimir_procesadores_cluster() const;
/**
* @brief Imprime los detalles del procesador especificado
* \pre El procesador ID existe, o el iterador it apunta a un procesador del cluster
* \post Se imprime los detalles del procesador especificado. Si no existe el procesador, se lanza un error.
* \coste Logaritmico (busqueda en mapas) / Lineal si ya se tiene el iterador
*/
void imprimir_procesador(const string& procID, map<string, Procesador>::const_iterator& it) const;
};
#endif