You are on page 1of 17

OBJETIVO DEL TRABAJO

En el siguiente trabajo se presenta un simulador de planificacin de procesos con tres algoritmos de planificacin: 1) Primero el mas corto,2) Round Robn, 3) Round Robn con prioridad y retroalimentacin. El objetivo en general del simulador es demostrar fsicamente un ejemplo de cmo los procesos entran, se ejecutan y terminan con diferentes algoritmos, lo que se pretende es simular como los procesos se estn procesando internamente en el computador, tambin se podr observar como cada algoritmo tiene una manera diferente de tratarlos procesos.

FUNCIONAMIENTO
El simulador se hizo bajo el lenguaje de programacin 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 cdigo que le pertenezca a cada cierto elemento, explicando dicha parte de cdigo y al final se adjuntara el cdigo completo del programa. 1) Forma 2) Botn 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) Botn para ejecutar primero el mas corto 8) Botn de Round Robn 9) Botn de Round Robn con prioridad y retroalim. 10) Caja de texto para insertar quantum 11) Lista con los procesos listos para ejecutarse 12) Lista para procesos en ejecucin 13) Lista para procesos terminados 14) Botn para salir 1)Forma La 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 cdigo que se encuentra en la forma
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; } }

En esta parte del cdigo que le pertenece a la forma se crean las listas asignndoles nombres a cada una de ellas tambin se crea una clase donde irn todos los datos de cada uno de los procesos: nombre, tiempo de llegada, tiempo CPU y prioridad.

2) Botn para agregar proceso Este botn sirve para crear un proceso con cada uno de los datos, al presionarse el botn 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 botn 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 automticamente. Se puede dejar de agregar procesos cuando el usuario lo desee. Parte del cdigo que se encuentra en el botn
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 cdigo 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), tambin hay una condicin que le sirve a primero el mas corto como este algoritmo no ocupa quantum la condicin dice que si en la caja del quantum no hay nada por default ser 0, y se muestra tambin como se agrega cada dato del proceso a su respectiva lista. 3) Lista con el nombre de cada proceso En 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 botn agregar proceso. 4) Lista con el tiempo de llegada de cada proceso En esta lista se muestra el tiempo de llegada de cada proceso ntese 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 habrn llegado as no ahorramos problemas y es mas eficaz el programa. 5) Lista con el tiempo en CPU de cada proceso En 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 proceso En esta lista se muestra la prioridad de cada proceso, esta prioridad es generada aleatoriamente. 7) Botn para ejecutar primero el mas corto Este botn lo que hace primeramente ordena los elementos que estn en la lista de procesos por tiempo en CPU y hace que se visualice en la forma si ya estn ordenados los deja como estaban, enseguida ya que estn ordenados pasa todos los procesos a la lista de listos ya que todos ya haban llegado entonces ya que todos estn en la lista de listos pasa el primero proceso a ejecucin 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 ejecucin queda baca uno de los procesos de la lista de

listos se pasa a ejecucin comenzando el conteo del contador nuevamente y restndose 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 cdigo que pertenece al botn
private 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 ejecucin 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; } } 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 cdigo 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 ejecucin 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 dems procesos hasta que la lista de terminados tenga la misma cantidad de procesos que la lista de procesos. 8) Botn de Round Robn Como el round robn se basa en el tiempo de llegada y al momento de agregar procesos por default ya estn 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 ejecucin 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 estn en la caja de terminados el trabajo de round robn ha terminado. Parte del cdigo que pertenece a round robin
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; } } 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) Botn de Round Robn con prioridad y retroalim. prcticamente este algoritmos es igual al round robn la nica diferencia es que para que los procesos pasen a la lista de listos al apretar el botn los procesos se ordenan por prioridad y as es como pasan, el primer proceso en la lista de listos pasa a ejecucin 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 ejecucin y se hace todo lo anterior con este, ya que todos estn en terminados quiere decir que su tiempo en CPU llego a 0 pero la prioridad aumento dependiendo de cuantas veces pasaron a ejecucin. parte de cdigo para el botn

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 ejecucin 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 ejecucin 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); lstTCP.Items[C] = lista[C].Tiempocpu;

} si no compara si el queantum llego a 0 y si es asi lo de ejecucin 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 cdigo 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 cdigo se explica cada parte

10) Caja de texto para insertar quantum Es donde se pone el quantum para los algoritmos de round Robn y Round Robn con prioridad y retroalimentacin. NOTA se debe insertar primero el quantum antes de agregar procesos. 11) Lista con los procesos listos para ejecutarse Se muestran los procesos que estn listos para se ejecucin 12) Lista para procesos en ejecucin Se muestra el proceso que esta en ejecucin 13) Lista para procesos terminados Se muestran los procesos que estn terminados 14) Botn para salir Cierra la forma Cdigo 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)); 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--; 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; } } 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; } } } 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]); 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 = ""; } } } }

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

Entra el primer proceso de listos a ejecucin

El proceso cumpli su tiempo en CPU y paso a terminado

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

CORRIDA DE ESCRITORIO ROUND ROBIN como entran los procesos as pasan a lista de listos

el primero proceso pasa a ejecucin

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 ntese que el tiempo en CPU de todos llego a cero

CORRIDA DE ESCRITORIO ROUND ROBIN CON PRIORIDAD Y RETROALIMENTACION

Como se puede apreciar este mtodo hace lo mismo que el round robn pero cada vez que un quantum de cada proceso termina se le aumenta 1 a la prioridad de ese proceso

You might also like