Topología en estrella Topología en estrella Diagrama de sucesos. Modelo Dinámico C2 Tllegadas 1 2 3 C1 Tservicio NodoInicio C1: M.libre() == true C2: Q.vacia() == false C2 4 5 6 C1 Tservicio SWITCH C2 7 Tservicio 9 10 8 NodoFin C1 Topología en estrella Diagrama de clases. Modelo Estático. NodoInicio MachineShop Machine Queue NodoFin Arrivals Job Topología en estrella public class Main { public static void main (String[] args) { double tiempollegadas= Float.valueOf(args[1]).floatValue(); int semilla= Integer.valueOf(args[0]).intValue(); MachineShop m = new MachineShop(tiempollegadas,semilla); m.Await(); synchronized(m.cerrojo) { try { m.cerrojo.wait(); } catch (InterruptedException e) { System.out.println(e.getMessage()); System.exit(1); } } System.exit(0); } } Topología en estrella public class MachineShop extends SimulationProcess { public MachineShop (double tLlegadas, int sem ) { tiempoLlegadas=tLlegadas; semilla=sem; } public void run () { try { Arrivals A = new Arrivals(tiempoLlegadas,semilla); for (int id=0;id<NHOSTS;id++) // creo diez maquinas con el t de servicio e identinficador MachineShop.Hosts[id] = new Machine(SERVICETIME,id); A.Activate(); // Inicio el proceso que genera los paquetes de llegada Scheduler.startSimulation(); while (ErasedJobs < FINALSIMULACION) { Hold(1000); } Scheduler.stopSimulation(); A.terminate(); Topología en estrella public class Arrivals extends SimulationProcess { public Arrivals (double mean,int seed ) { InterArrivalTime = new ExponentialStream(mean,seed); NodoInicial = new UniformStream(0.0,10.0,seed); NodoFinal = new UniformStream(0.0,10.0,seed); } Topología en estrella Continuación Arrivals public void run () { for (;;) { try { int nodoIni,nodoFin; double d; d=InterArrivalTime.getNumber(); Hold(d); d=NodoInicial.getNumber(); nodoIni= (int) Math.floor(d); do { d=NodoFinal.getNumber(); nodoFin= (int) Math.floor(d); } while (nodoIni==nodoFin); Job work = new Job(nodoIni,nodoFin); MachineShop.Hosts[nodoIni].Request(work); } catch (...) {} Topología en estrella public class Job { public Job (int nodoIni,int nodoFin) { ResponseTime = 0.0; ArrivalTime = Scheduler.CurrentTime(); MachineShop.TotalJobs++; nodoInicial=nodoIni; nodoFinal=nodoFin; } public void finished () { MachineShop.ErasedJobs++; if ( MachineShop.TotalJobs > MachineShop.TRANSITORIO) { // al superar el transitorio guardo los datos ResponseTime = Scheduler.CurrentTime() ­ ArrivalTime; MachineShop.TotalResponseTime += ResponseTime; MachineShop.meanDelay.setValue( ResponseTime ); } } Topología en estrella public class Machine extends SimulationProcess { public Machine (double service_time, int id) { serviceTime=service_time; working = false; J = null; idHost=id; Q=new Queue(); processedJobs=0; } Topología en estrella public class Machine extends SimulationProcess { public void run () { for (;;) { working = true; while (!Q.IsEmpty()) { try { Hold(serviceTime); // esta en el servidor sirviendose J = Q.Dequeue(); // sale de la cola processedJobs++; if (J.HostInicial()== HostNum()) { MachineShop.Hosts[MachineShop.SWITCH].Request(J); } else if (HostNum()== MachineShop.SWITCH) MachineShop.Hosts[J.HostFinal()].Request(J); else J.finished(); catch (SimulationException e){} catch (RestartException e) {} } //end while Topología en estrella public class Machine extends SimulationProcess { working = false; try {Cancel();} catch (RestartException e) {} } } public void Request (Job trabajo) { Q.Enqueue(trabajo); if (! working) { try {Activate();} catch (SimulationException e) {} catch (RestartException e) {} } } Topología en anillo Topología en anillo Diagrama de sucesos. Modelo Dinámico Tllegadas 1 C2 C1 2 3 Tservicio 4 C3 C1: M.libre() == true C2: Q.vacia() == false C3: Si HostFinal()!=HostNum() Topología en anillo Diagrama de clases. Modelo Estático. Siguiente MachineShop Machine NodoInicio Queue NodoFin Arrivals Job Topología en anillo public class Main { public static void main (String[] args) { double tiempollegadas= Float.valueOf(args[1]).floatValue(); int semilla= Integer.valueOf(args[0]).intValue(); MachineShop m = new MachineShop(tiempollegadas,semilla); m.Await(); synchronized(m.cerrojo) { try { m.cerrojo.wait(); } catch (InterruptedException e) { System.out.println(e.getMessage()); System.exit(1); } } System.exit(0); } } Topología en anillo public class MachineShop extends SimulationProcess { public MachineShop (double tLlegadas, int sem ) { tiempoLlegadas=tLlegadas; semilla=sem; } public void run () { try { Arrivals A = new Arrivals(tiempoLlegadas,semilla); for (int id=0;id<NHOSTS;id++) MachineShop.Hosts[id] = new Machine(SERVICETIME,id); A.Activate(); Scheduler.startSimulation(); while (ErasedJobs < FINALSIMULACION) { Hold(1000); } Scheduler.stopSimulation(); A.terminate(); Topología en anillo public class Arrivals extends SimulationProcess { public Arrivals (double mean,int seed ) { InterArrivalTime = new ExponentialStream(mean,seed); NodoInicial = new UniformStream(0.0,10.0,seed); Recorrido = new ExponentialStream(MachineShop.NHOSTS/2.0,seed); } Topología en anillo public void run () { for (;;) { try { int recorri,nodoIni,nodoFin; double d; d=InterArrivalTime.getNumber(); Hold(d); d=NodoInicial.getNumber(); nodoIni= (int) Math.floor(d); do { d=Recorrido.getNumber(); recorri= (int) Math.rint(d); //tambien puedo usar rint nodoFin= (nodoIni+recorri) % MachineShop.NHOSTS; } while (recorri<1 || (nodoIni==nodoFin)); Job work = new Job(nodoIni,nodoFin); MachineShop.Hosts[nodoIni].Request(work); } catch (SimulationException e) {...} } Topología en anillo public class Job { public Job (int nodoIni,int nodoFin) { ResponseTime = 0.0; ArrivalTime = Scheduler.CurrentTime(); MachineShop.TotalJobs++; nodoInicial=nodoIni; nodoFinal=nodoFin; } public void finished () { MachineShop.ErasedJobs++; if ( MachineShop.TotalJobs > MachineShop.TRANSITORIO) { ResponseTime = Scheduler.CurrentTime() ­ ArrivalTime; MachineShop.TotalResponseTime += ResponseTime; MachineShop.meanDelay.setValue( ResponseTime ); } } Topología en anillo public class Machine extends SimulationProcess { public Machine (double service_time, int id){ serviceTime=service_time; working = false; J = null; idHost=id; Q=new Queue(); processedJobs=0; } Topología en anillo public class Machine extends SimulationProcess { public void run () { for (;;) { working = true; while (!Q.IsEmpty()) { try { Hold(serviceTime); // esta en el servidor sirviendose J = Q.Dequeue(); processedJobs++; } catch (...) {} if (J.HostFinal()!= HostNum()) MachineShop.Hosts[( (HostNum()+1) % MachineShop.NHOSTS)].Request(J) else J.finished(); } working = false; try { Cancel();} catch (RestartException e) {} } Topología en anillo public class Machine extends SimulationProcess { public void Request (Job trabajo) { Q.Enqueue(trabajo); if (! working) { try { Activate(); } catch (...) {} } }