#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Proceso { string id; int tiempo; int prioridad; Proceso* siguiente;
};
Proceso* primero = NULL;
Proceso* ultimo = NULL;
void agregarProceso() {
int n; cout<<"cuantos datos desea ingresar: "; cin>>n; for(int i=0;i<n;i++){ Proceso* nuevo = new Proceso(); cout << "Ingrese el id del proceso: "; cin >> nuevo->id; cout << "Ingrese el tiempo del proceso: "; cin >> nuevo->tiempo; cout << "Ingrese la prioridad del proceso: "; cin >> nuevo->prioridad; nuevo->siguiente = NULL; if (primero == NULL) { primero = nuevo; ultimo = nuevo; } else { ultimo->siguiente = nuevo; ultimo = nuevo; } cout << "Proceso agregado correctamente." << endl;
}
}
void imprimirProcesos() { if (primero == NULL) { cout << "No hay procesos en la lista." << endl; return; } cout << "Procesos:" << endl; Proceso* actual = primero; cout << "Id " << " tiempo de ejecucion " << "prioridad " << endl; while (actual != NULL) { cout<<" "<< actual->id<<" "<<actual->tiempo<<" "<<actual->prioridad<<endl ; actual = actual->siguiente; }
}
void calcularFIFO() { if (primero == NULL) { cout << "No hay procesos en la lista." << endl; } else { Proceso* actual = primero; float tiempoRetorno = 0; float tiempoRetornoTotal = 0; int numProcesos = 0; cout << "Id " << " tiempo de ejecucion: " << " Tiempo de retorno: " << endl; while (actual != NULL) { tiempoRetorno += actual->tiempo; tiempoRetornoTotal += tiempoRetorno; // declaramos/asignamos cout<<" "<< actual->id<<" "<<actual->tiempo<<" "<<
tiempoRetorno<<endl ; actual = actual->siguiente; numProcesos++; } float timpoProm=tiempoRetornoTotal/numProcesos; cout << "El tiempo de retorno promedio es: " << timpoProm << endl; }
}
void calcularSJF() {
if (primero == NULL) {
cout << "No hay procesos en la lista." << endl;
}
//se ordena por su tiempo de ejecuci n
Proceso* actual = primero; //obj de tipo proceso
while (actual != NULL){ // aun no se ha llegadi al final Proceso* siguiente = actual->siguiente; while (siguiente != NULL) { if (siguiente->tiempo < actual->tiempo) { //se compara el tiemp de ejec // Intercambiar los procesos string idAux = actual->id; int tiempoAux = actual->tiempo; int prioridadAux = actual->prioridad; actual->id = siguiente->id; actual->tiempo = siguiente->tiempo; //intercambia valores actual/siguiente actual->prioridad = siguiente->prioridad; //tiempo de mas corto se coloque antes siguiente->id = idAux; siguiente->tiempo = tiempoAux; siguiente->prioridad = prioridadAux; //tempor } siguiente = siguiente->siguiente; } actual = actual->siguiente;
}
//tiempos de retorno
float tiempoRetorno = 0;
float tiempoRetornoTotal =0;
actual = primero;
int numProcesos = 0;
cout << "Id " << " tiempo de ejecucion " << "prioridad " << "Tiempo de retorno " << endl;
while (actual != NULL) { tiempoRetorno += actual->tiempo; tiempoRetornoTotal += tiempoRetorno; numProcesos++; cout<<" "<< actual->id<<" "<<actual->tiempo<<" "<<actual->prioridad<<" "<< tiempoRetorno<<endl ; actual = actual->siguiente;
}
float promedioRetorno = (float) tiempoRetornoTotal/ numProcesos;
cout << "Promedio de tiempos de retorno: " << promedioRetorno << endl;
}
void roundRobin(int quantum){ // Realizar un seguimiento del proceso y el tiempo actuales Proceso* actual = primero; int actual_time = 0; // Realizar un seguimiento del tiempo total y el n mero de procesos completados int total_time = 0; int completed_processes = 0; //Siga iterando hasta que el indicador se establezca en false bool ejecutar = true; while (ejecutar) { // Ejecutar proceso para quantum o hasta su finalizaci n if (actual -> tiempo > quantum) { actual_time += quantum; actual -> tiempo -= quantum; // Mover el proceso actual al final de la cola si no ha finalizado if (ultimo == actual) { ultimo = primero; } else { ultimo -> siguiente = actual; ultimo = actual; } actual = actual -> siguiente; } else { // El proceso se ha completado actual_time += actual -> tiempo; cout << "Proceso " << actual -> id << " terminado. Tiempo de retorno: "
<< actual_time << endl; // Quitar proceso de la cola Proceso* temp = actual; actual = actual -> siguiente; if (primero == temp) { primero = actual; } // Actualizar el tiempo total y el n mero de procesos completados total_time += actual_time; completed_processes++; // borrar proceso delete temp; // Compruebe si todav a hay procesos en la cola if (actual == NULL && primero != NULL) { actual = primero; } } // Compruebe si se han ejecutado todos los procesos if (actual == NULL && primero == NULL) { ejecutar = false; } } //Calcular e imprimir el tiempo de respuesta promedio float promedio_tiempo_retorno = total_time / (float)completed_processes; cout << "El promedio del tiempo de retorno es: " << promedio_tiempo_retorno
<< endl;
}
bool compararPorPrioridad(Proceso a, Proceso b) { return a.prioridad > b.prioridad;}
void calcularPrioridad(float quantum) {
// inicializaci n de variables int tiempoTotal = 0; int cantidadProcesos = 0; int tiempoRetornoTotal = 0; int tiempoEsperaTotal = 0;
// contar el tiempo total y la cantidad de procesos Proceso* actual = primero; while (actual != NULL) { cantidadProcesos++; tiempoTotal += actual->tiempo; actual = actual->siguiente; } // crear un array de procesos y ordenarlos por prioridad Proceso* procesos = new Proceso[cantidadProcesos];
actual = primero; for (int i = 0; i < cantidadProcesos; i++) { procesos[i] = *actual; actual = actual->siguiente; }
sort(procesos, procesos + cantidadProcesos, compararPorPrioridad);
// inicializar arrays de tiempo, tiempo de retorno y tiempo de espera int tiempo[cantidadProcesos]; int tiempoRetorno[cantidadProcesos]; int tiempoEspera[cantidadProcesos]; for (int i = 0; i < cantidadProcesos; i++) { tiempo[i] = procesos [i].tiempo; // primero = primero->siguiente; }
// simular la ejecuci n de los procesos int tiempoTranscurrido = 0; while (true) { bool todosTerminados = true; for (int i = 0; i < cantidadProcesos; i++) { if (tiempo[i] > 0) { todosTerminados = false; if (tiempo[i] <= quantum) { tiempoTranscurrido += tiempo[i]; tiempoRetorno[i] = tiempoTranscurrido; tiempo[i] = 0; } else { tiempoTranscurrido += quantum; tiempo[i] -= quantum; } } } if (todosTerminados) { break; } } // calcular el tiempo de espera de cada proceso y el tiempo total de retorno y espera
for (int i = 0; i < cantidadProcesos; i++) { int tEspera = tiempoRetorno[i] - procesos[i].tiempo; tiempoEspera[i] = (tEspera < 0) ? 0 : tEspera; tiempoRetornoTotal += tiempoRetorno[i]; tiempoEsperaTotal += tiempoEspera[i]; cout << "Proceso " << procesos[i].id << " Tiempo de espera: " <<
tiempoEspera[i] << " Tiempo de retorno: " << tiempoRetorno[i] << endl;
}
// calcular el tiempo promedio de retorno y espera y mostrarlo por pantalla double tiempoPromedioRetorno = (double) tiempoRetornoTotal /
cantidadProcesos;
double tiempoPromedioEspera = (double) tiempoEsperaTotal /
cantidadProcesos;
cout << "Tiempo promedio de retorno: " << tiempoPromedioRetorno << endl;
cout << "Tiempo promedio de espera: " << tiempoPromedioEspera << endl; cout << endl << "Procesos ordenados por prioridad:" << endl; for (int i = 0; i < cantidadProcesos; i++) { cout << "Proceso " << i+1 << ": " << "ID=" << procesos[i].id << " Tiempo="
<< procesos[i].tiempo << " Prioridad=" << procesos[i].prioridad << endl; }
}
int main(){ int opcion; do { cout << "MENU" << endl; cout << "1. Entrada de datos" << endl; cout << "2. Calcular FIFO" << endl; cout << "3. Calcular SJF" << endl; cout << "4. Calcular prioridad" << endl; cout << "5. Calcular Round-Robin" << endl; cout << "6. Salir" << endl; cout << "Ingrese su opcion: "; cin >> opcion; system("cls"); switch (opcion) { case 1: agregarProceso(); imprimirProcesos(); break; case 2: calcularFIFO(); break; case 3: calcularSJF(); break; case 5: float quantum;
cout<<"Ingrese el tiempo quantum: ";
cin>>quantum; roundRobin(quantum); break; case 4: cout<<"INGRESE QUANTUM: "<<endl; cin>>quantum; calcularPrioridad(quantum); break; case 6: cout << "Saliendo del programa." << endl; break; default: cout << "Opcion invalida." << endl; break; } } while (opcion != 6);
return 0;
}
Discover more from Coursity
Subscribe to get the latest posts sent to your email.