simulador de procesos

20
OBJETIVO DEL TRABAJO En el siguiente trabajo se presenta un simulador de planificación de procesos con tres algoritmos de planificación: 1) Primero el mas corto,2) Round Robín, 3) Round Robín con prioridad y retroalimentación. El objetivo en general del simulador es demostrar físicamente un ejemplo de cómo los procesos entran, se ejecutan y terminan con diferentes algoritmos, lo que se pretende es simular como los procesos se están procesando internamente en el computador, también se podrá observar como cada algoritmo tiene una manera diferente de tratarlos procesos.

Upload: diego-martinez

Post on 14-Apr-2015

267 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Simulador de Procesos

OBJETIVO DEL TRABAJO

En el siguiente trabajo se presenta un simulador de planificación de procesos con tres algoritmos de planificación: 1) Primero el mas corto,2) Round Robín,3) Round Robín con prioridad y retroalimentación.El objetivo en general del simulador es demostrar físicamente un ejemplo de cómo los procesos entran, se ejecutan y terminan con diferentes algoritmos, lo que se pretende es simular como los procesos se están procesando internamente en el computador, también se podrá observar como cada algoritmo tiene una manera diferente de tratarlos procesos.

Page 2: Simulador de Procesos

FUNCIONAMIENTOEl simulador se hizo bajo el lenguaje de programación C# En una forma visual Para explicar el funcionamiento del simulador definirá cada elemento de la forma y se explicara el funcionamiento de cada uno adjuntando la parte de el código que le pertenezca a cada cierto elemento, explicando dicha parte de código y al final se adjuntara el código completo del programa. 1) Forma 2) Botón para agregar proceso 3) Lista con el nombre de cada proceso 4) Lista con el tiempo de llegada de cada proceso 5) Lista con el tiempo en CPU de cada proceso 6) Lista con la prioridad de cada proceso 7) Botón para ejecutar primero el mas corto 8) Botón de Round Robín 9) Botón de Round Robín con prioridad y retroalim. 10) Caja de texto para insertar quantum 11) Lista con los procesos listos para ejecutarse 12) Lista para procesos en ejecución 13) Lista para procesos terminados 14) Botón para salir 1)FormaLa forma es donde se muestran todos los componentes de la misma, es la forma visual del programa. En ella se visualizaran todos los datos y como se esta tratando cada proceso.Parte del código que se encuentra en la formapublic partial class frmSim : Form { public frmSim() { InitializeComponent(); } string PRO; int TLL, TCP, PRI; public List<Procesos> lista = new List<Procesos>(); public List<string> Listos = new List<string>(); public List<string> Ejecucion = new List<string>(); public List<string> Terminado = new List<string>(); public class Procesos { public string Proceso; public int Tiempocpu; public int Prioridad; public int Tiempollegada; public int Quantum; public Procesos(string PRO1, int TLL1, int TCP1, int PRI1, int QTM1) { Proceso = PRO1; Tiempollegada = TLL1; Tiempocpu = TCP1; Prioridad = PRI1; Quantum = QTM1; } }

En esta parte del código que le pertenece a la forma se crean las listas asignándoles nombres a cada una de ellas también se crea una clase donde irán todos los datos de cada uno de los procesos: nombre, tiempo de llegada, tiempo CPU y prioridad.

Page 3: Simulador de Procesos

2) Botón para agregar procesoEste botón sirve para crear un proceso con cada uno de los datos, al presionarse el botón se crea un proceso por click y en las 4 listas contiguas se mostrara primeramente el nombre del proceso, este nombre es secuencial P0, P1, P2,…, Pn, en la siguiente lista se muestra el tiempo de llegada, este tiempo de llegada es directo como se va insertando el proceso el tiempo que se tomo en darle click al botón agregar será el tiempo de llegada pero este tiempo nunca se reinicia sino que siempre corre esto quiere decir que si el primer proceso llego en el segundo 5 y para dar el siguiente click tardo 7 segundo el tiempo de llegada del proceso 1 será 12(5 + 7), en la tercera lista se visualizara el tiempo en CPU este tiempo se genera aleatoriamente para cada proceso y en la cuarta lista se muestra la prioridad del proceso al igual que el tiempo en CPU esta prioridad se genera aleatoriamente automáticamente. Se puede dejar de agregar procesos cuando el usuario lo desee.Parte del código que se encuentra en el botón private void cmdAGR_Click(object sender, EventArgs e) { Random R = new Random(); PRO = "P" + lista.Count.ToString(); TLL = X; TCP = R.Next(5,20); PRI = R.Next(0,3); if (txtQTM.Text == "") { txtQTM.Text = "0"; } Procesos proceso = new Procesos(PRO,TLL,TCP,PRI,Int16.Parse(txtQTM.Text)); lista.Add(proceso); lstPRO.Items.Add(PRO); lstTLL.Items.Add(TLL); lstTCP.Items.Add(TCP); lstPRI.Items.Add(PRI); }

En esta parte del código se puede ver como es que se genera cada dato que contiene cada uno de los procesos como es el nombre del proceso (PRO), el tiempo de llegada (TLL), el tiempo en CPU (TCP)y la prioridad (PRI), también hay una condición que le sirve a primero el mas corto como este algoritmo no ocupa quantum la condición dice que si en la caja del quantum no hay nada por default será 0, y se muestra también como se agrega cada dato del proceso a su respectiva lista.3) Lista con el nombre de cada procesoEn esta lista se muestra el nombre de cada proceso que como mencionamos antes los nombres van de P0, P1, P2,…, Pn y así sucesivamente dependiendo de cuantos clicks se den el botón agregar proceso.4) Lista con el tiempo de llegada de cada procesoEn esta lista se muestra el tiempo de llegada de cada proceso nótese que cada tiempo es acumulativo si el primero llega en el tiempo 5 y para meter el otro proceso se tarda 7 el tiempo de llegada del segundo proceso será 12 esto quiere de sir que cuando se deje de meter proceso ya todos habrán llegado así no ahorramos problemas y es mas eficaz el programa.5) Lista con el tiempo en CPU de cada procesoEn esta lista se muestra el tiempo en CPU de cada proceso que se metió estos procesos se generan aleatoriamente para cada proceso. 6) Lista con la prioridad de cada procesoEn esta lista se muestra la prioridad de cada proceso, esta prioridad es generada aleatoriamente.7) Botón para ejecutar primero el mas corto Este botón lo que hace primeramente ordena los elementos que están en la lista de procesos por tiempo en CPU y hace que se visualice en la forma si ya están ordenados los deja como estaban, enseguida ya que están ordenados pasa todos los procesos a la lista de listos ya que todos ya habían llegado entonces ya que todos están en la lista de listos pasa el primero proceso a ejecución y un contador empieza a correr este contador nos marca el tiempo en CPU transcurrido a la vez cada que ese contador avanza en la lista de tiempo en CPU se ve como se disminuye, al llegar a 0 el proceso se pasa a la lista de terminados y el contador se reinicia, al momento de que la lista de ejecución queda bacía uno de los procesos de la lista de

Page 4: Simulador de Procesos

listos se pasa a ejecución comenzando el conteo del contador nuevamente y restándose el tiempo en CPU esto lo hace con cada proceso. Ya que la lista de terminados tiene la misma cantidad de procesos que la lista de procesos el programa a terminado.Parte del código que pertenece al botónprivate void cmdPMC_Click(object sender, EventArgs e) {

se enciende el timer1 timer1.Enabled = true; se ordenan los procesos por tiempo en cpu for (int I = 0; I <= lista.Count; I++) { for (int J = I + 1; J <= lista.Count - 1; J++) { if (lista[I].Tiempocpu > lista[J].Tiempocpu) { Procesos Auxi = lista[I]; lista[I] = lista[J]; lista[J] = Auxi; string Auxi1 = (lstPRO.Items[I].ToString()); lstPRO.Items[I] = lstPRO.Items[J]; lstPRO.Items[J] = Auxi1;

int Auxi2 = int.Parse(lstTLL.Items[I].ToString()); lstTLL.Items[I] = lstTLL.Items[J]; lstTLL.Items[J] = Auxi2;

int Auxi4 = int.Parse(lstTCP.Items[I].ToString()); lstTCP.Items[I] = lstTCP.Items[J]; lstTCP.Items[J] = Auxi4;

int Auxi5 = int.Parse(lstPRI.Items[I].ToString()); lstPRI.Items[I] = lstPRI.Items[J]; lstPRI.Items[J] = Auxi5; } } } pasa los procesos a la lista de listos (solo el identificador el cual es el nombre) foreach (Procesos P in lista) { Listos.Add(P.Proceso); lstLIS.Items.Add(P.Proceso); } } int D = 0; private void timer1_Tick(object sender, EventArgs e) { D++; lblTMR.Text = D.ToString(); if (Listos.Count >= 1 || Ejecucion.Count >= 1) { si la lista de ejecución esta vacia pasa el priemer proceso de la lista de listos if (Ejecucion.Count == 0) { Ejecucion.Add(Listos[0]); lstEJC.Items.Add(lstLIS.Items[0]); Listos.RemoveAt(0); lstLIS.Items.RemoveAt(0); } int I = 0; for (I = 0; I < lista.Count; I++) { if (Ejecucion[0] == lista[I].Proceso) { break; } }

Page 5: Simulador de Procesos

lista[I].Tiempocpu--; lstTCP.Items[I] = lista[I].Tiempocpu; si el tiempo en cpu es 0 se pasa el proceso en ejcucion a la lista de terminados if (lista[I].Tiempocpu == 0) { Terminado.Add(Ejecucion.ElementAt(0)); D = 0; lstTER.Items.Add(lstEJC.Items[0]); Ejecucion.RemoveAt(0); lstEJC.Items.RemoveAt(0); } } if (lista.Count == lstTER.Items.Count) { timer1.Enabled = false; lblTMR.Text = ""; } }

Como se puede ver en la primera parte del código lo que se hace es activar Timer1 (contador 1) y ordenar los procesos por tiempo de llegada y enseguida pasara cada uno de los procesos a la lista de listos pero solo se pasa el identificador el cual es el nombre del proceso. Ya que se tiene esto se enciende el timer y empieza el conteo lo primero que pasa es que el primero proceso de la lista de listos se pasa a ejecución y se queda ahí hasta que llega a 0 ya que sucede esto se pasa a la lista de terminados el contador se reinicia y hace lo mismo con los demás procesos hasta que la lista de terminados tenga la misma cantidad de procesos que la lista de procesos. 8) Botón de Round RobínComo el round robín se basa en el tiempo de llegada y al momento de agregar procesos por default ya están ordenados por tiempo de llegada entonces todos los procesos se pasan a la lista de listos donde el primer proceso de esta lista pasa a ejecución e inicia el quantum que se introdujo y al tiempo en cpu se le resta 1 si el tiempo en CPU es 0 el proceso pasa a lista de terminados pero si no comprueba si el quantum llego a 0 si es así el proceso se regresa a la lista de listos y de esta lista se agarra el proceso que sigue y hace lo mismo que con el primero ya que todos los procesos están en la caja de terminados el trabajo de round robín ha terminado.Parte del código que pertenece a round robinprivate void cmdRR_Click(object sender, EventArgs e) { timer2.Enabled = true; foreach (Procesos P in lista) { Listos.Add(P.Proceso); lstLIS.Items.Add(P.Proceso); } } int X= 0; int I = 0; private void timer2_Tick(object sender, EventArgs e) { D++; lblTMR.Text = D.ToString(); if (Listos.Count > 0 || Ejecucion.Count > 0) { if (Ejecucion.Count == 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[I] = lista[I].Tiempocpu; } else { if (lista[I].Tiempocpu == 0) {

Page 6: Simulador de Procesos

Terminado.Add(Ejecucion[0]); Ejecucion.RemoveAt(0); lstTER.Items.Add(lstEJC.Items[0]); lstEJC.Items.RemoveAt(0); lstTCP.Items[I] = lista[I].Tiempocpu; } else if (lista[I].Quantum == 0) { Listos.Add(Ejecucion[0]); Ejecucion.RemoveAt(0); lstLIS.Items.Add(lstEJC.Items[0]); lstEJC.Items.RemoveAt(0); lista[I].Quantum = Int16.Parse(txtQTM.Text); lstTCP.Items[I] = lista[I].Tiempocpu; } else { for (I = 0; I < lista.Count; I++) { if (Ejecucion[0] == lista[I].Proceso) { break; } } if (Ejecucion.Count == 0) { if (Listos.Count > 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[I] = lista[I].Tiempocpu; } } } if (Ejecucion.Count == 0) { if (Listos.Count > 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[I] = lista[I].Tiempocpu; } } lista[I].Tiempocpu--; if (lista[I].Tiempocpu > 0) lista[I].Quantum--; } } if (lista.Count == lstTER.Items.Count) { timer1.Enabled = false; lblTMR.Text = ""; } }

9) Botón de Round Robín con prioridad y retroalim.prácticamente este algoritmos es igual al round robín la única diferencia es que para que los procesos pasen a la lista de listos al apretar el botón los procesos se ordenan por prioridad y así es como pasan, el primer proceso en la lista de listos pasa a ejecución el quantum inicia si el tiempo en CPU llego a 0 se pasa a terminados si no comprueba que el quantum halla terminado si es así el proceso pasa de nuevo a la lista de listos y la prioridad aumenta en 1luego pasa el siguiente proceso de los que estaban en listos a ejecución y se hace todo lo anterior con este, ya que todos estén en terminados quiere decir que su tiempo en CPU llego a 0 pero la prioridad aumento dependiendo de cuantas veces pasaron a ejecución.

Page 7: Simulador de Procesos

parte de código para el botón

private void cmdRRPR_Click(object sender, EventArgs e) { se enciende el timer y se ordenan los procesos por prioridad timer4.Enabled = true; for (int I = 0; I <= lista.Count; I++) { for (int J = I + 1; J <= lista.Count - 1; J++) { if (lista[I].Prioridad > lista[J].Prioridad) { Procesos Auxi = lista[I]; lista[I] = lista[J]; lista[J] = Auxi; string Auxi1 = (lstPRO.Items[I].ToString()); lstPRO.Items[I] = lstPRO.Items[J]; lstPRO.Items[J] = Auxi1;

int Auxi2 = int.Parse(lstTLL.Items[I].ToString()); lstTLL.Items[I] = lstTLL.Items[J]; lstTLL.Items[J] = Auxi2;

int Auxi4 = int.Parse(lstTCP.Items[I].ToString()); lstTCP.Items[I] = lstTCP.Items[J]; lstTCP.Items[J] = Auxi4;

int Auxi5 = int.Parse(lstPRI.Items[I].ToString()); lstPRI.Items[I] = lstPRI.Items[J]; lstPRI.Items[J] = Auxi5; } } } cada proceso ya ordenados se pasan a la lista de listos foreach (Procesos P in lista) { Listos.Add(P.Proceso); lstLIS.Items.Add(P.Proceso); } } int Z = 0; int C = 0; private void timer4_Tick(object sender, EventArgs e) { Z++; lblTMR.Text = Z.ToString(); if (Listos.Count > 0 || Ejecucion.Count > 0) { si no hay nada en ejecución se pasa el primer proceso de la lista de listos if (Ejecucion.Count == 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[C] = lista[I].Tiempocpu; } si si hay algo en ejecución se hace lo siguiente else { si el tiempo en cpu del procesos llego a 0 se pasa a la lista de terminados if (lista[C].Tiempocpu == 0) { Terminado.Add(Ejecucion[0]); Ejecucion.RemoveAt(0); lstTER.Items.Add(lstEJC.Items[0]); lstEJC.Items.RemoveAt(0);

Page 8: Simulador de Procesos

lstTCP.Items[C] = lista[C].Tiempocpu; } si no compara si el queantum llego a 0 y si es asi lo de ejecución pasa a la lista de listos else if (lista[C].Quantum == 0) { Listos.Add(Ejecucion[0]); Ejecucion.RemoveAt(0); lstLIS.Items.Add(lstEJC.Items[0]); lstEJC.Items.RemoveAt(0); lista[C].Quantum = Int16.Parse(txtQTM.Text); lstTCP.Items[C] = lista[C].Tiempocpu; lista[C].Prioridad ++; lstPRI.Items[C] = lista[C].Prioridad; } sino else { se hace un procedimiento para comprobar que exista el proceso en la lista de procesos for (C = 0; C < lista.Count; C++) { si es asi hace un salto if (Ejecucion[0] == lista[C].Proceso) { break; } } nuevamente si no hay nada en ejcucion y si hay algo en listo se repite el proceso if (Ejecucion.Count == 0) { if (Listos.Count > 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[C] = lista[C].Tiempocpu; } } } if (Ejecucion.Count == 0) { if (Listos.Count > 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[C] = lista[C].Tiempocpu; } } lista[C].Tiempocpu --; if (lista[C].Tiempocpu > 0) lista[C].Quantum--; } } if (lista.Count == lstTER.Items.Count) { timer1.Enabled = false; lblTMR.Text = ""; } } }

En esta parte del código se hace todo lo que se menciono con anterioridad primeramente se ordenan pro prioridad se enciende el timer, y empieza la horda de condiciones que hacen todo el procedimiento, en el código se explica cada parte

Page 9: Simulador de Procesos

10) Caja de texto para insertar quantumEs donde se pone el quantum para los algoritmos de round Robín y Round Robín con prioridad y retroalimentación. NOTA se debe insertar primero el quantum antes de agregar procesos.11) Lista con los procesos listos para ejecutarseSe muestran los procesos que están listos para se ejecución12) Lista para procesos en ejecuciónSe muestra el proceso que esta en ejecución13) Lista para procesos terminadosSe muestran los procesos que están terminados14) Botón para salir Cierra la formaCódigo completo del programa using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;

namespace WindowsFormsApplication1{ public partial class frmSim : Form { public frmSim() { InitializeComponent(); } string PRO; int TLL, TCP, PRI; public List<Procesos> lista = new List<Procesos>(); public List<string> Listos = new List<string>(); public List<string> Ejecucion = new List<string>(); public List<string> Terminado = new List<string>(); public class Procesos { public string Proceso; public int Tiempocpu; public int Prioridad; public int Tiempollegada; public int Quantum; public Procesos(string PRO1, int TLL1, int TCP1, int PRI1, int QTM1) { Proceso = PRO1; Tiempollegada = TLL1; Tiempocpu = TCP1; Prioridad = PRI1; Quantum = QTM1; } } private void cmdAGR_Click(object sender, EventArgs e) { Random R = new Random(); PRO = "P" + lista.Count.ToString(); TLL = X; TCP = R.Next(5,20); PRI = R.Next(0,3); if (txtQTM.Text == "") { txtQTM.Text = "0"; } Procesos proceso = new Procesos(PRO,TLL,TCP,PRI,Int16.Parse(txtQTM.Text));

Page 10: Simulador de Procesos

lista.Add(proceso); lstPRO.Items.Add(PRO); lstTLL.Items.Add(TLL); lstTCP.Items.Add(TCP); lstPRI.Items.Add(PRI); } private void cmdSAL_Click(object sender, EventArgs e) { Application.Exit(); } private void cmdPMC_Click(object sender, EventArgs e) { timer1.Enabled = true; for (int I = 0; I <= lista.Count; I++) { for (int J = I + 1; J <= lista.Count - 1; J++) { if (lista[I].Tiempocpu > lista[J].Tiempocpu) { Procesos Auxi = lista[I]; lista[I] = lista[J]; lista[J] = Auxi; string Auxi1 = (lstPRO.Items[I].ToString()); lstPRO.Items[I] = lstPRO.Items[J]; lstPRO.Items[J] = Auxi1;

int Auxi2 = int.Parse(lstTLL.Items[I].ToString()); lstTLL.Items[I] = lstTLL.Items[J]; lstTLL.Items[J] = Auxi2;

int Auxi4 = int.Parse(lstTCP.Items[I].ToString()); lstTCP.Items[I] = lstTCP.Items[J]; lstTCP.Items[J] = Auxi4;

int Auxi5 = int.Parse(lstPRI.Items[I].ToString()); lstPRI.Items[I] = lstPRI.Items[J]; lstPRI.Items[J] = Auxi5; } } } foreach (Procesos P in lista) { Listos.Add(P.Proceso); lstLIS.Items.Add(P.Proceso); } } int D = 0; private void timer1_Tick(object sender, EventArgs e) { D++; lblTMR.Text = D.ToString(); if (Listos.Count >= 1 || Ejecucion.Count >= 1) { if (Ejecucion.Count == 0) { Ejecucion.Add(Listos[0]); lstEJC.Items.Add(lstLIS.Items[0]); Listos.RemoveAt(0); lstLIS.Items.RemoveAt(0); } int I = 0; for (I = 0; I < lista.Count; I++) { if (Ejecucion[0] == lista[I].Proceso) { break; } } lista[I].Tiempocpu--;

Page 11: Simulador de Procesos

lstTCP.Items[I] = lista[I].Tiempocpu; if (lista[I].Tiempocpu == 0) { Terminado.Add(Ejecucion.ElementAt(0)); D = 0; lstTER.Items.Add(lstEJC.Items[0]); Ejecucion.RemoveAt(0); lstEJC.Items.RemoveAt(0); } } if (lista.Count == lstTER.Items.Count) { timer1.Enabled = false; lblTMR.Text = ""; } } private void cmdRR_Click(object sender, EventArgs e) { timer2.Enabled = true; foreach (Procesos P in lista) { Listos.Add(P.Proceso); lstLIS.Items.Add(P.Proceso); } } int X= 0; int I = 0; private void timer2_Tick(object sender, EventArgs e) { D++; lblTMR.Text = D.ToString(); if (Listos.Count > 0 || Ejecucion.Count > 0) { if (Ejecucion.Count == 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[I] = lista[I].Tiempocpu; } else { if (lista[I].Tiempocpu == 0) { Terminado.Add(Ejecucion[0]); Ejecucion.RemoveAt(0); lstTER.Items.Add(lstEJC.Items[0]); lstEJC.Items.RemoveAt(0); lstTCP.Items[I] = lista[I].Tiempocpu; } else if (lista[I].Quantum == 0) { Listos.Add(Ejecucion[0]); Ejecucion.RemoveAt(0); lstLIS.Items.Add(lstEJC.Items[0]); lstEJC.Items.RemoveAt(0); lista[I].Quantum = Int16.Parse(txtQTM.Text); lstTCP.Items[I] = lista[I].Tiempocpu; } else { for (I = 0; I < lista.Count; I++) { if (Ejecucion[0] == lista[I].Proceso) { break; } }

Page 12: Simulador de Procesos

if (Ejecucion.Count == 0) { if (Listos.Count > 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[I] = lista[I].Tiempocpu; } } } if (Ejecucion.Count == 0) { if (Listos.Count > 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[I] = lista[I].Tiempocpu; } } lista[I].Tiempocpu--; if (lista[I].Tiempocpu > 0) lista[I].Quantum--; } } if (lista.Count == lstTER.Items.Count) { timer1.Enabled = false; lblTMR.Text = ""; } } private void timer3_Tick(object sender, EventArgs e) { X++; }

private void cmdRRPR_Click(object sender, EventArgs e) { timer4.Enabled = true; for (int I = 0; I <= lista.Count; I++) { for (int J = I + 1; J <= lista.Count - 1; J++) { if (lista[I].Prioridad > lista[J].Prioridad) { Procesos Auxi = lista[I]; lista[I] = lista[J]; lista[J] = Auxi; string Auxi1 = (lstPRO.Items[I].ToString()); lstPRO.Items[I] = lstPRO.Items[J]; lstPRO.Items[J] = Auxi1;

int Auxi2 = int.Parse(lstTLL.Items[I].ToString()); lstTLL.Items[I] = lstTLL.Items[J]; lstTLL.Items[J] = Auxi2;

int Auxi4 = int.Parse(lstTCP.Items[I].ToString()); lstTCP.Items[I] = lstTCP.Items[J]; lstTCP.Items[J] = Auxi4;

int Auxi5 = int.Parse(lstPRI.Items[I].ToString()); lstPRI.Items[I] = lstPRI.Items[J]; lstPRI.Items[J] = Auxi5; } } }

Page 13: Simulador de Procesos

foreach (Procesos P in lista) { Listos.Add(P.Proceso); lstLIS.Items.Add(P.Proceso); } } int Z = 0; int C = 0; private void timer4_Tick(object sender, EventArgs e) { Z++; lblTMR.Text = Z.ToString(); if (Listos.Count > 0 || Ejecucion.Count > 0) { if (Ejecucion.Count == 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[C] = lista[I].Tiempocpu; } else { if (lista[C].Tiempocpu == 0) { Terminado.Add(Ejecucion[0]); Ejecucion.RemoveAt(0); lstTER.Items.Add(lstEJC.Items[0]); lstEJC.Items.RemoveAt(0); lstTCP.Items[C] = lista[C].Tiempocpu; } else if (lista[C].Quantum == 0) { Listos.Add(Ejecucion[0]); Ejecucion.RemoveAt(0); lstLIS.Items.Add(lstEJC.Items[0]); lstEJC.Items.RemoveAt(0); lista[C].Quantum = Int16.Parse(txtQTM.Text); lstTCP.Items[C] = lista[C].Tiempocpu; lista[C].Prioridad ++; lstPRI.Items[C] = lista[C].Prioridad; } else { for (C = 0; C < lista.Count; C++) { if (Ejecucion[0] == lista[C].Proceso) { break; } } if (Ejecucion.Count == 0) { if (Listos.Count > 0) { Ejecucion.Add(Listos[0]); Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[C] = lista[C].Tiempocpu; } } } if (Ejecucion.Count == 0) { if (Listos.Count > 0) { Ejecucion.Add(Listos[0]);

Page 14: Simulador de Procesos

Listos.RemoveAt(0); lstEJC.Items.Add(lstLIS.Items[0]); lstLIS.Items.RemoveAt(0); lstTCP.Items[C] = lista[C].Tiempocpu; } } lista[C].Tiempocpu --; if (lista[C].Tiempocpu > 0) lista[C].Quantum--; } } if (lista.Count == lstTER.Items.Count) { timer1.Enabled = false; lblTMR.Text = ""; } } } }

Page 15: Simulador de Procesos

Entra el primer proceso de listos a ejecución El proceso cumplió su tiempo en CPU y paso a terminado

CORRIDA DE ESCRITORIO PRIMERO EL MAS CORTOYa se agregaron los procesos se ordenaron por tiempo en CPU y se mandaron a listos

Page 16: Simulador de Procesos

´

CORRIDA DE ESCRITORIO ROUND ROBIN como entran los procesos así pasan a lista de listos el primero proceso pasa a ejecución

Todos pasan por el mismo procedimiento y cuando el tiempo en CPU se agota se termina el algoritmo.

Page 17: Simulador de Procesos

Primer proceso acaba su quantum, cambia TCPU termina otro quantum Pro. El que sigue

Termina el primer proceso pasa a terminado Termina el otro proceso pasa a terminado

Terminan todos los proceso nótese que el tiempo en CPU de todos llego a cero

CORRIDA DE ESCRITORIO ROUND ROBIN CON PRIORIDAD Y RETROALIMENTACION

Page 18: Simulador de Procesos

Como se puede apreciar este método hace lo mismo que el round robín pero cada vez que un quantum de cada proceso termina se le aumenta 1 a la prioridad de ese proceso