S.O FIFO y Otros
Published: 2024-04-10 14:50:25

#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;
}