0% encontró este documento útil (0 votos)
86 vistas12 páginas

Simulación de Asignación de Procesos

Este documento presenta el código para simular diferentes estrategias de asignación del procesador a procesos concurrentes, incluyendo FIFO, Round Robin, Relación de Respuesta Máxima y Retroalimentación de Niveles Múltiples. Define clases para procesos y procesadores que almacenan información como identificación, estado, cuenta de ciclos y prioridad. Incluye funciones para inicializar los datos, mostrar la lista de procesos, y simular el comportamiento de cada estrategia a través de un número determinado de ciclos de control.

Cargado por

aleescribd
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
86 vistas12 páginas

Simulación de Asignación de Procesos

Este documento presenta el código para simular diferentes estrategias de asignación del procesador a procesos concurrentes, incluyendo FIFO, Round Robin, Relación de Respuesta Máxima y Retroalimentación de Niveles Múltiples. Define clases para procesos y procesadores que almacenan información como identificación, estado, cuenta de ciclos y prioridad. Incluye funciones para inicializar los datos, mostrar la lista de procesos, y simular el comportamiento de cada estrategia a través de un número determinado de ciclos de control.

Cargado por

aleescribd
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

/* Simulacin de estrategias de asignacin del procesador */ #include #include #include #include #include <stdio.h> <stdlib.h> <conio.h> <iostream.h> <io.

h> /* Pointer al archivo usado */ /* Registro del archivo usado (para lectura)

FILE *textfile; // char regis[70]; */ class Proc{

public: /* identif: identificacin del proceso */ char identif; /* fin: estado de finalizacin del proceso */ /* 0: listo para ejecutar */ /* 1: interrumpido p/ entrada / salida */ /* 3: interrumpido p/ tiempo */ /* 2: terminado */ int fin; /* cuenta: total de ciclos de control asignados al proceso */ int cuenta; /* pri: prioridad del proceso */ int pri; /* nivel: identificacin de la sub-cola donde est el proceso */ int nivel; Proc() { identif = 0; fin = 0; cuenta = 0; pri = 0; nivel = 0;}; Inicializacin de valores. }; class procesos{ public: int cc; // Nmero de ciclos de control. int np; // Nmero de procesos. char auxiden; // Variable auxiliar. int auxfin; // Variable auxiliar. int auxcuenta; // Variable auxiliar. int auxpri; // Variable auxiliar. int auxnivel; // Variable auxiliar. int cambio; // Variable auxiliar. Proc p[50]; // Vector (lista) de procesos. void inicio(); // Acciones iniciales. void introducir_datos(); // Carga de identificacin de procesos. void mostrar(); // Mostrar lista de procesos. void fifo(); // Simulacin segn estrategia FIFO. void rrobin(); // Simulacin segn estrategia RR (Round Robin). void hrn(); // Simulacin segn estrategia HRN (Relacin de Respuesta M xima). void rnm(); // Simulacin segn estrategia RNM (Retroalimentacin de Niveles Mltiples). void final(); // Acciones finales. }; //

void procesos::inicio(){ cout << "*****************************************************"; cout << "\n"; cout << "*Estrategias de asignacin del procesador a procesos*"; cout << "\n"; cout << "*en ejecucin concurrente. *"; cout << "\n"; cout << "*****************************************************"; cout << "\n"; cout << "\n"; cout << "Introduzca el nmero de ciclos de control de la simulaci n."; cout << "\n"; cout << "(Se sugiere entre 30 y 40 por cada 10 procesos): "; cin >> cc; cout << "\n"; cout << "Introduzca el nmero de procesos de la simulacin."; cout << "\n"; cout << "(El m ximo permitido es 50): "; cin >> np; cout << "\n"; if (np > 50) {np = 50; cout << "El nmero de procesos se ha limitado a 50. \n"; cout << "\n"; } /* Apertura del archivo usado para grabacin */ cout << "Apertura del archivo resumen '[Link]' para grabaci n. \n"; cout << "\n"; if ((textfile = fopen("[Link]", "a")) == NULL) {printf("Error de apertura para grabacin en el archivo '[Link]'\n"); exit (0); } } void procesos::introducir_datos(){ char opc; cout << "\nSi desea introducir manualmente la identificacin de los procesos\n"; cout << "tipee: 's', de lo contrario: 'n' y el sistema asumir las identificaciones.\n"; cin >> opc; if (opc == 's') { for (register int i=0; i<np; i++) {cout << "Introduzca la identificacin del proceso p[" <<i << "]: "; cin >> p[i].identif; } } else { p[0].identif = 'a'; p[1].identif = 'b'; p[2].identif = 'c'; p[3].identif = 'd'; p[4].identif = 'e'; p[5].identif = 'f'; p[6].identif = 'g'; p[7].identif = 'h'; p[8].identif = 'i'; p[9].identif = 'j';

p[10].identif p[11].identif p[12].identif p[13].identif p[14].identif p[15].identif p[16].identif p[17].identif p[18].identif p[19].identif p[20].identif p[21].identif p[22].identif p[23].identif p[24].identif p[25].identif p[26].identif p[27].identif p[28].identif p[29].identif p[30].identif p[31].identif p[32].identif p[33].identif p[34].identif p[35].identif p[36].identif p[37].identif p[38].identif p[39].identif p[40].identif p[41].identif p[42].identif p[43].identif p[44].identif p[45].identif p[46].identif p[47].identif p[48].identif p[49].identif

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

'k'; 'l'; 'm'; 'n'; 'o'; 'p'; 'q'; 'r'; 's'; 't'; 'u'; 'v'; 'w'; 'x'; 'y'; 'z'; '1'; '2'; '3'; '4'; '5'; '6'; '7'; '8'; '9'; 'A'; 'B'; 'C'; 'D'; 'E'; 'F'; 'G'; 'H'; 'I'; 'J'; 'K'; 'L'; 'M'; 'N'; 'O';

} for (register int i=0; i<np; i++) {p[i].fin = 0; p[i].cuenta = 0; p[i].pri = 0; p[i].nivel = 0; } } void procesos::mostrar(){ printf("\n"); cout << "Listado de procesos:" <<"\n"; cout << "********************" <<"\n"; cout << "Estado: 0 -> Listo para ejecutar." <<"\n"; cout << "Estado: 1 -> Interrumpido en espera de entrada / salida." <<"\n"; cout << "Estado: 2 -> Proceso terminado." <<"\n"; cout << "Estado: 3 -> Interrumpido por tiempo (no aplicable en FIFO ni en HRN)." <<"\n"; for (register int i=0; i<np; i++) {cout << "Proceso p[" <<i << "]: " << p[i].identif<< " Estado: "<< p[i].fin<< " Ciclos de control utilizados: "<< p[i].cuenta<< "\n"; cout << "Proceso p[" <<i << "]: " << p[i].identif<< " Prioridad:

"<< p[i].pri<< " cout <<"\n"; } }

Nivel: "<< p[i].nivel;

void procesos::fifo(){ auxiden = 0; auxfin = 0; auxcuenta = 0; cambio = 0; /* Grabacin en el archivo usado */ fprintf(textfile, "%s\n", "************************************************************"); fprintf(textfile, "%s", "Simulacin FIFO con "); fprintf(textfile, "%i", cc); fprintf(textfile, "%s\n", " ciclos de control."); cout <<"\n"; cout <<"Secuencia de seleccin de procesos para su ejecucin segn FIFO:"; cout <<"\n"; cout <<"****************************************************************"; cout <<"\n"; cout <<"Los procesos son atendidos segn su orden en la lista de procesos listos:"; cout <<"\n" <<"\n"; for (register int j=0; j<cc; j++) // ***Realiza 'cc' ciclos de control*** {auxfin = 0; for (register int m=0; m<np; m++) {auxfin = auxfin + p[m].fin;} if (auxfin == (np * 2)) { cout <<"\n"<< "Todos los procesos han finalizado en "<< j << " ciclos de control.\n"; /* Grabacin en el archivo usado */ fprintf(textfile, "%s", "Todos los procesos han finalizado en "); fprintf(textfile, "%i", j); fprintf(textfile, "%s\n", " ciclos de control."); j = cc; auxfin = getch(); } for (register int i=0; i<np; i++) {if (p[i].fin == 0) { cout <<"Procesador asignado al proceso: "<< p[i].identif; cout <<"\n"; p[i].cuenta = p[i].cuenta + 1; p[i].fin = int(random(3)); // Determina prximo estado del proceso. // cout <<"\n" <<p[i].identif <<p[i].fin <<"\n"; if (p[i].fin == 1) cout <<"Proceso '" <<p[i].identif <<"' interrumpido por entrada / salida. "<< "\n"; else {if (p[i].fin == 2) cout <<"Proceso '" <<p[i].identif <<"' finalizado. "<< "\n"; } if (p[i].fin > 0) { // Intercambio de contexto. cambio = cambio + 1; auxiden = p[i].identif; auxfin = p[i].fin; auxcuenta = p[i].cuenta; for (register int k=i; k<(np - 1); k++)

{p[k].identif = p[k+1].identif; p[k].fin = p[k+1].fin; p[k].cuenta = p[k+1].cuenta; } p[(np - 1)].identif = auxiden; p[(np - 1)].fin = auxfin; p[(np - 1)].cuenta = auxcuenta; } i = np; auxfin = getch(); } for (register int k=0; k<np; k++) // Determina si contina la espera por entrada / salida. {if (p[k].fin == 1) p[k].fin = int (random (2)); } } } cout <<"\n"<< "***Se han producido "<< cambio<< " cambios de contexto.***"<< "\n"; /* Grabacin en el archivo usado */ fprintf(textfile, "%s", "Se han simulado "); fprintf(textfile, "%i", np); fprintf(textfile, "%s\n", " procesos concurrentes."); fprintf(textfile, "%s", "Se han producido "); fprintf(textfile, "%i", cambio); fprintf(textfile, "%s\n", " cambios de contexto."); auxfin = getch(); } void procesos::rrobin(){ auxiden = 0; auxfin = 0; auxcuenta = 0; cambio = 0; /* Grabacin en el archivo usado */ fprintf(textfile, "%s\n", "************************************************************"); fprintf(textfile, "%s", "Simulacin RR - Round Robin con "); fprintf(textfile, "%i", cc); fprintf(textfile, "%s\n", " ciclos de control."); cout <<"\n"; cout <<"Secuencia de seleccin de procesos para su ejecucin segn RR - Round Robin:"; cout <<"\n"; cout <<"****************************************************************** **********"; cout <<"\n"; cout <<"Los procesos son atendidos segn su orden en la lista de procesos listos,\n"; cout <<"pero disponen de un tiempo limitado (cuantum) del procesador:"; cout <<"\n" <<"\n"; for (register int j=0; j<cc; j++) // ***Realiza 'cc' ciclos de control*** {auxfin = 0; for (register int m=0; m<np; m++) {if (p[m].fin != 2) {auxfin = 1; m = np; } } if (auxfin == 0) { cout <<"\n"<< "Todos los procesos han finalizado en "<< j << " ciclos de control.\n";

/* Grabacin en el archivo usado */ fprintf(textfile, "%s", "Todos los procesos han finalizado en "); fprintf(textfile, "%i", j); fprintf(textfile, "%s\n", " ciclos de control."); j = cc; auxfin = getch(); } for (register int i=0; i<np; i++) {if (p[i].fin == 0) { cout <<"Procesador asignado al proceso: "<< p[i].identif; cout <<"\n"; p[i].cuenta = p[i].cuenta + 1; p[i].fin = int(random(4)); // Determina prximo estado del proceso. // cout <<"\n" <<p[i].identif <<p[i].fin <<"\n"; if (p[i].fin == 0) p[i].fin = 3; if (p[i].fin == 1) cout <<"Proceso '" <<p[i].identif <<"' interrumpido por entrada / salida. "<< "\n"; else {if (p[i].fin == 2) cout <<"Proceso '" <<p[i].identif <<"' finalizado. "<< "\n"; else {if (p[i].fin == 3) cout <<"Proceso '" <<p[i].identif <<"' interrumpido por tiempo. "<< "\n"; } } if (p[i].fin >= 0) { // Intercambio de contexto. cambio = cambio + 1; auxiden = p[i].identif; auxfin = p[i].fin; auxcuenta = p[i].cuenta; for (register int k=i; k<(np - 1); k++) {p[k].identif = p[k+1].identif; p[k].fin = p[k+1].fin; p[k].cuenta = p[k+1].cuenta; } p[(np - 1)].identif = auxiden; p[(np - 1)].fin = auxfin; p[(np - 1)].cuenta = auxcuenta; } i = np; auxfin = getch(); } for (register int k=0; k<np; k++) // Determina si contina la espera por entrada / salida. {if (p[k].fin == 1) p[k].fin = int (random (2)); } for (register int l=0; l<np; l++) // Determina si contina la espera por tiempo. {if (p[l].fin == 3) {auxfin = int (random (4)); if (auxfin == 1) auxfin = 0; else {if (auxfin == 2) auxfin = 3;} p[l].fin = auxfin; } } } } cout <<"\n"<< "***Se han producido "<< cambio<< " cambios de contexto.***"<< "\n";

/* Grabacin en el archivo usado */ fprintf(textfile, "%s", "Se han simulado "); fprintf(textfile, "%i", np); fprintf(textfile, "%s\n", " procesos concurrentes."); fprintf(textfile, "%s", "Se han producido "); fprintf(textfile, "%i", cambio); fprintf(textfile, "%s\n", " cambios de contexto."); auxfin = getch(); } void procesos::hrn(){ auxiden = 0; auxfin = 0; auxcuenta = 0; auxpri = 0; cambio = 0; /* Grabacin en el archivo usado */ fprintf(textfile, "%s\n", "************************************************************"); fprintf(textfile, "%s", "Simulacin HRN con "); fprintf(textfile, "%i", cc); fprintf(textfile, "%s\n", " ciclos de control."); cout <<"\n"; cout <<"Secuencia de seleccin de procesos para su ejecucin segn HRN:"; cout <<"\n"; cout <<"***************************************************************"; cout <<"\n"; cout <<"Los procesos son atendidos segn su prioridad en la lista de procesos listos;\n"; cout <<"la prioridad depende de la relacin de respuesta: (TE + TS) / TS, donde\n"; cout <<"TE = Tiempo de Espera y TS = Tiempo de Servicio:"; cout <<"\n" <<"\n"; for (register int j=0; j<cc; j++) // ***Realiza 'cc' ciclos de control*** {auxfin = 0; for (register int m=0; m<np; m++) {auxfin = auxfin + p[m].fin;} if (auxfin == (np * 2)) { cout <<"\n"<< "Todos los procesos han finalizado en "<< j << " ciclos de control.\n"; /* Grabacin en el archivo usado */ fprintf(textfile, "%s", "Todos los procesos han finalizado en "); fprintf(textfile, "%i", j); fprintf(textfile, "%s\n", " ciclos de control."); j = cc; auxfin = getch(); } if (j == 0) {for (register int z=0; z<np; z++) {p[z].cuenta = 1;} } if (j < cc) { for (register int l=0; l<np; l++) {p[l].pri = (j / p[l].cuenta); } } if (auxpri == 1) { for (register int s=0; s<np; s++) {for (register int t=s; t<(np - 1); t++) {if (p[t+1].pri > p[t].pri)

{auxiden = p[t].identif; auxfin = p[t].fin; auxcuenta = p[t].cuenta; auxpri = p[t].pri; p[t].identif = p[t+1].identif; p[t].fin = p[t+1].fin; p[t].cuenta = p[t+1].cuenta; p[t].pri = p[t+1].pri; p[t+1].identif = auxiden; p[t+1].fin = auxfin; p[t+1].cuenta = auxcuenta; p[t+1].pri = auxpri; } } } } for (register int i=0; i<np; i++) {if (p[i].fin == 0) {auxpri = 0; cout <<"Procesador asignado al proceso: "<< p[i].identif; cout <<"\n"; p[i].cuenta = p[i].cuenta + 1; p[i].fin = int(random(3)); // Determina prximo estado del proceso. // cout <<"\n" <<p[i].identif <<p[i].fin <<"\n"; if (p[i].fin == 1) cout <<"Proceso '" <<p[i].identif <<"' interrumpido por entrada / salida. "<< "\n"; else {if (p[i].fin == 2) cout <<"Proceso '" <<p[i].identif <<"' finalizado. "<< "\n"; } if (p[i].fin > 0) { // Intercambio de contexto. cambio = cambio + 1; auxiden = p[i].identif; auxfin = p[i].fin; auxcuenta = p[i].cuenta; auxpri = p[i].pri; for (register int k=i; k<(np - 1); k++) {p[k].identif = p[k+1].identif; p[k].fin = p[k+1].fin; p[k].cuenta = p[k+1].cuenta; p[k].pri = p[k+1].pri; } p[(np - 1)].identif = auxiden; p[(np - 1)].fin = auxfin; p[(np - 1)].cuenta = auxcuenta; p[(np - 1)].pri = auxpri; auxpri = 1; // Indica que hubo intercambio de contexto y debe reordenarse la lista de procesos segn prioridades. } i = np; auxfin = getch(); } for (register int k=0; k<np; k++) // Determina si contina la espera por entrada / salida. {if (p[k].fin == 1) p[k].fin = int (random (2)); } } } for (register int y=0; y<np; y++) {p[y].cuenta = p[y].cuenta - 1;} cout <<"\n"<< "***Se han producido "<< cambio<< " cambios de

contexto.***"<< "\n"; /* Grabacin en el archivo usado */ fprintf(textfile, "%s", "Se han simulado "); fprintf(textfile, "%i", np); fprintf(textfile, "%s\n", " procesos concurrentes."); fprintf(textfile, "%s", "Se han producido "); fprintf(textfile, "%i", cambio); fprintf(textfile, "%s\n", " cambios de contexto."); auxfin = getch(); } void procesos::rnm(){ auxiden = 0; auxfin = 0; auxcuenta = 0; auxpri = 0; auxnivel = 0; cambio = 0; /* Grabacin en el archivo usado */ fprintf(textfile, "%s\n", "************************************************************"); fprintf(textfile, "%s", "Simulacin RNM con "); fprintf(textfile, "%i", cc); fprintf(textfile, "%s\n", " ciclos de control."); cout <<"\n"; cout <<"Secuencia de seleccin de procesos para su ejecucin segn RNM:"; cout <<"\n"; cout <<"**************************************************************"; cout <<"\n"; cout <<"Los procesos son atendidos segn su nivel en la lista de procesos listos;\n"; cout <<"pero disponen de un tiempo limitado (cuantum) del procesador;\n"; cout <<"si son interrumpidos por entrada / salida permanecen en la subcola\n"; cout <<"del nivel donde est n, pero si son interrumpidos por tiempo pasan a\n"; cout <<"un nivel superior, que es atendido cuando ya no hay procesos listos\n"; cout <<"en los niveles inferiores; de all el nombre de\n"; cout <<"Retroalimentacin de Niveles Mltiples:"; cout <<"\n" <<"\n"; for (register int j=0; j<cc; j++) // ***Realiza 'cc' ciclos de control*** {auxfin = 0; for (register int m=0; m<np; m++) {if (p[m].fin != 2) {auxfin = 1; m = np; } } if (auxfin == 0) { cout <<"\n"<< "Todos los procesos han finalizado en "<< j << " ciclos de control.\n"; /* Grabacin en el archivo usado */ fprintf(textfile, "%s", "Todos los procesos han finalizado en "); fprintf(textfile, "%i", j); fprintf(textfile, "%s\n", " ciclos de control."); j = cc; auxfin = getch(); } if (auxpri == 1) {

for (register int s=0; s<np; s++) {for (register int t=s; t<(np - 1); t++) {if (p[t+1].nivel < p[t].nivel) {auxiden = p[t].identif; auxfin = p[t].fin; auxcuenta = p[t].cuenta; auxpri = p[t].pri; auxnivel = p[t].nivel; p[t].identif = p[t+1].identif; p[t].fin = p[t+1].fin; p[t].cuenta = p[t+1].cuenta; p[t].pri = p[t+1].pri; p[t].nivel = p[t+1].nivel; p[t+1].identif = auxiden; p[t+1].fin = auxfin; p[t+1].cuenta = auxcuenta; p[t+1].pri = auxpri; p[t+1].nivel = auxnivel; } } } } for (register int i=0; i<np; i++) {if (p[i].fin == 0) {auxpri = 0; cout <<"Procesador asignado al proceso: "<< p[i].identif; cout <<"\n"; p[i].cuenta = p[i].cuenta + 1; p[i].fin = int(random(4)); // Determina prximo estado del proceso. // cout <<"\n" <<p[i].identif <<p[i].fin <<p[i].nivel <<"\n"; if (p[i].fin == 0) p[i].fin = 3; if (p[i].fin == 1) cout <<"Proceso '" <<p[i].identif <<"' interrumpido por entrada / salida. "<< "\n"; else {if (p[i].fin == 2) cout <<"Proceso '" <<p[i].identif <<"' finalizado. "<< "\n"; else {if (p[i].fin == 3) cout <<"Proceso '" <<p[i].identif <<"' interrumpido por tiempo. "<< "\n"; p[i].nivel = p[i].nivel + 1; } } if (p[i].fin > 0) { // Intercambio de contexto. cambio = cambio + 1; auxiden = p[i].identif; auxfin = p[i].fin; auxcuenta = p[i].cuenta; auxpri = p[i].pri; auxnivel = p[i].nivel; for (register int k=i; k<(np - 1); k++) {p[k].identif = p[k+1].identif; p[k].fin = p[k+1].fin; p[k].cuenta = p[k+1].cuenta; p[k].pri = p[k+1].pri; p[k].nivel = p[k+1].nivel; } p[(np - 1)].identif = auxiden; p[(np - 1)].fin = auxfin; p[(np - 1)].cuenta = auxcuenta; p[(np - 1)].pri = auxpri; p[(np - 1)].nivel = auxnivel;

auxpri = 1; // Indica que hubo intercambio de contexto y debe reordenarse la lista de procesos segn prioridades. } i = np; auxfin = getch(); } for (register int k=0; k<np; k++) // Determina si contina la espera por entrada / salida. {if (p[k].fin == 1) p[k].fin = int (random (2)); } for (register int l=0; l<np; l++) // Determina si contina la espera por tiempo. {if (p[l].fin == 3) {auxfin = int (random (4)); if (auxfin == 1) auxfin = 0; else {if (auxfin == 2) auxfin = 3;} p[l].fin = auxfin; } } } } cout <<"\n"<< "***Se han producido "<< cambio<< " cambios de contexto.***"<< "\n"; /* Grabacin en el archivo usado */ fprintf(textfile, "%s", "Se han simulado "); fprintf(textfile, "%i", np); fprintf(textfile, "%s\n", " procesos concurrentes."); fprintf(textfile, "%s", "Se han producido "); fprintf(textfile, "%i", cambio); fprintf(textfile, "%s\n", " cambios de contexto."); auxfin = getch(); } void procesos::final(){ /* Cierre del archivo usado */ cout << "\nCierre del archivo resumen '[Link]'. \n"; cout << "Se sugiere visualizar su contenido con el [Link] de Windows. \n"; fclose(textfile); } void main(){ /* Variables */ procesos p1; /* Cdigo */ clrscr(); [Link](); p1.introducir_datos(); [Link](); [Link](); [Link](); p1.introducir_datos(); [Link](); [Link](); [Link](); p1.introducir_datos(); [Link](); [Link](); [Link](); p1.introducir_datos();

[Link](); [Link](); [Link](); [Link](); getch(); }

También podría gustarte