private void setActual() { if (ProcesosListos.Count > 0) { Quantum = 0; ProcesoActual = ProcesosListos.Dequeue(); if (Memoria.getSizeProceso(ProcesoActual.Numero) < ProcesoActual.Tamano / (double)MAX_MARCO) { List <clsMarco> Virtual = MemoriaVirtual.getProcess(ProcesoActual.Numero); if (Memoria.canAccess(Virtual.Count * MAX_MARCO)) { foreach (clsMarco M in Virtual) { Memoria.addMarco(MemoriaVirtual.removeMarco(M.ID)); } } else { int LeftVirtual = 0, NumProceso = 0; List <int> Procesos = Memoria.getDistinctProcess().ToList(); while (LeftVirtual < Virtual.Count) { List <clsMarco> Principal = Memoria.getProcess(Procesos[NumProceso]); int len = Principal.Count - 1; if (len > 0 && Principal[len].Proceso != ProcesoActual.Numero) { clsMarco M = Memoria.removeMarco(Principal[len].ID); Memoria.addMarco(MemoriaVirtual.removeMarco(Virtual[LeftVirtual].ID)); MemoriaVirtual.addMarco(M); LeftVirtual++; } if (++NumProceso >= Procesos.Count) { NumProceso = 0; } } } pnlPaginas.Invalidate(); } if (ProcesoActual.Respuesta == -1) { ProcesoActual.Respuesta = Counter - ProcesoActual.Llegada; } ProcesoActual.Estado = "En Ejecucion"; Memoria.changeStatus(ProcesoActual.Numero, 2); } else { ProcesoActual = null; } }
private void Procesar() { while (ProcesosNuevos.Count > 0 && Memoria.canAccess(ProcesosNuevos.First().Tamano)) { clsProceso P = ProcesosNuevos.Dequeue(); P.Llegada = Counter; P.Estado = "Listo"; ProcesosListos.Enqueue(P); Memoria.addProcess(P); CountProcesos++; dgSiguiente.DataSource = SetSiguiente(ProcesosNuevos); } if (ProcesoActual != null && ProcesoActual.TR > 0) { lblCounter.Text = (++Counter).ToString(); txtTR.Text = (--ProcesoActual.TR).ToString(); txtTT.Text = (ProcesoActual.TME - ProcesoActual.TR).ToString(); lblQuantum.Text = (++Quantum).ToString(); } else if (ProcesoActual != null) { AddConcluido(); pnlPaginas.Invalidate(); } else if (ProcesosListos.Count > 0) { setActual(); pnlPaginas.Invalidate(); } else { lblCounter.Text = (++Counter).ToString(); } if (ProcesosListos.Count + ProcesosNuevos.Count + ProcesosBloqueados.Count + ProcesosSuspendidos.Count == 0 && ProcesoActual == null) { timer1.Stop(); MessageBox.Show("Se han concluido todos los procesos", "Concluido", MessageBoxButtons.OK, MessageBoxIcon.Information); } lblCounterLote.Text = ProcesosNuevos.Count.ToString(); lblSuspendidos.Text = ProcesosSuspendidos.Count.ToString(); setData(ProcesoActual); ProcessBloqueados(); if (Quantum >= MAX_QUANTUM) { ProcesoActual.Estado = "Listo"; ProcesosListos.Enqueue(ProcesoActual); Memoria.changeStatus(ProcesoActual.Numero, 1); setActual(); } }
private void ProcessBloqueados() { ProcesosBloqueados.Select(c => { c.Bloqueado++; return(c); }).ToList(); if (ProcesosBloqueados.Count > 0 && ProcesosBloqueados.First().Bloqueado > 9) { clsProceso Unblock = ProcesosBloqueados.Dequeue(); ProcesosListos.Enqueue(Unblock); Memoria.changeStatus(Unblock.Numero, 1); } dgBloqueados.DataSource = SetBloqueados(ProcesosBloqueados); }
private void AddConcluido() { if (ProcesoActual == null) { return; } ProcesoActual.Estado = "Concluido"; ProcesoActual.Finalizacion = Counter; ProcesoActual.Concluido = true; Memoria.removeProcess(ProcesoActual.Numero); Concluidos.Add(ProcesoActual); CountProcesos--; ProcesoActual = null; }
private void setData(clsProceso P) { if (P != null) { txtOp.Text = P.Operacion; txtNumero.Text = P.Numero.ToString(); txtTME.Text = P.TME.ToString(); txtTT.Text = (P.TME - P.TR).ToString(); txtTR.Text = (P.TR).ToString(); lblQuantum.Text = Quantum.ToString(); } else { txtOp.Text = ""; txtNumero.Text = ""; txtTME.Text = ""; txtTT.Text = ""; txtTR.Text = ""; lblQuantum.Text = ""; } dgActual.DataSource = SetListos(ProcesosListos); dgConcluidos.DataSource = SetConcluidos(Concluidos); DrawPages(); }
private void PressKey(Keys K) { switch (K) { case Keys.I: //Interrupcion if (timer1.Enabled && ProcesoActual != null) { ProcesoActual.Bloqueado = 0; ProcesoActual.Estado = "Bloqueado"; ProcesosBloqueados.Enqueue(ProcesoActual); Memoria.changeStatus(ProcesoActual.Numero, 3); setActual(); setData(ProcesoActual); } break; case Keys.E: //Error if (timer1.Enabled && ProcesoActual != null) { ProcesoActual.Resultado = "Error"; ProcesoActual.Servicio = ProcesoActual.TME - ProcesoActual.TR; ProcesoActual.TR = 0; Procesar(); } break; case Keys.P: //Pausa timer1.Stop(); lblTitle.Text = "Procesos en Pausa"; break; case Keys.C: //Continuar timer1.Start(); lblTitle.Text = "Procesos en Ejecución"; break; case Keys.N: //Nuevo if (timer1.Enabled) { ProcesosNuevos.Enqueue(new clsProceso(R)); dgSiguiente.DataSource = SetSiguiente(ProcesosNuevos); Procesar(); } break; case Keys.T: //Tabla BCP if (timer1.Enabled) { timer1.Stop(); List <clsProceso> BCP = new List <clsProceso>(); BCP.AddRange(Concluidos); if (ProcesoActual != null) { BCP.Add(ProcesoActual); } BCP.AddRange(ProcesosListos); BCP.AddRange(ProcesosBloqueados); BCP.AddRange(ProcesosNuevos); BCP.AddRange(ProcesosSuspendidos); foreach (clsProceso p in BCP) { if (!p.Concluido) { p.Finalizacion = Counter; p.Servicio = p.TME - p.TR; } } frmConcluido Ventana = new frmConcluido(Counter, BCP, false); this.Hide(); Ventana.ShowDialog(); this.Show(); dgActual.Focus(); timer1.Start(); } break; case Keys.M: //Tabla paginas if (timer1.Enabled) { timer1.Stop(); frmTablaPaginas Paginas = new frmTablaPaginas(Memoria, MemoriaVirtual); this.Hide(); Paginas.ShowDialog(); this.Show(); timer1.Start(); } break; case Keys.S: //Suspendido if (ProcesosBloqueados.Count > 0) { clsProceso Suspendido = ProcesosBloqueados.Dequeue(); Memoria.removeProcess(Suspendido.Numero); MemoriaVirtual.removeProcess(Suspendido.Numero); Suspendido.Estado = "Suspendido"; ProcesosSuspendidos.Enqueue(Suspendido); pnlPaginas.Invalidate(); GuardarSuspendidos(); } break; case Keys.R: //Regresa Suspendido if (ProcesosSuspendidos.Count > 0 && Memoria.canAccess(ProcesosSuspendidos.First().Tamano)) { clsProceso Suspendido = ProcesosSuspendidos.Dequeue(); Memoria.addProcess(Suspendido, 3); Suspendido.Estado = "Bloqueado"; ProcesosBloqueados.Enqueue(Suspendido); GuardarSuspendidos(); } break; case Keys.U: //Memoria Virtual if (timer1.Enabled) { foreach (int i in Memoria.getDistinctProcess()) { List <clsMarco> Virtual = Memoria.getProcess(i); int len = Virtual.Count - 1; if (len > 0 && Virtual[len].Estatus != 2 && MemoriaVirtual.canAccess(1)) { MemoriaVirtual.addMarco(Memoria.removeMarco(Virtual[len].ID)); } } } pnlPaginas.Invalidate(); break; } }