-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProcesador.rb
149 lines (130 loc) · 3.25 KB
/
Procesador.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
require_relative 'Evento'
require_relative 'Array'
class Procesador
attr_accessor :tiempo, :tInicio, :tAnterior, :longAcum, :tServidor, :nTrabajos, :llegadas
attr_accessor :salidas, :listaEventos
def initialize
@tiempo = 0 #tiempo total
@tInicio = 0 #tiempo de inicio del servicio
@tAnterior = 0 #tiempo del evento anterior
@longAcum = 0 #longitud acumulada de trabajos
@tServidor = 0 #tiempo acumulado del servidor
@nTrabajos = 0 #numero de trabajos
@llegadas = 0 #contador de llegadas
@salidas = 0 #contador de salidas
@listaEventos = [] #lista de eventos
end
def self.run(procesadores, tiempo)
procesadores.each do |procesador|
procesador.simulate tiempo if procesador.tareas_en_fila?
end
end
def self.tareas_pendientes?(procesadores)
procesadores.each do |procesador|
return true if procesador.nTrabajos > 0
end
return false
end
#
# metodo que inicia la simulacion
#
def simulate(tiempo)
evento = @listaEventos.first
if evento.tiempo <= tiempo
evento = @listaEventos.shift
if evento.tipo == "llegada"
procesa_llegada evento.tiempo
# puts "Llegada del mensaje #{@llegadas} al sistema en T=#{@tiempo} --- Hay #{@nTrabajos} Paquetes en Sistema"
else
#procesamos la salida
procesa_salida evento.tiempo
# puts "Salida del mensaje #{@salidas} al sistema en T=#{@tiempo} --- Hay #{@nTrabajos} Paquetes en Sistema"
end
# puts @tiempo
end
end
def utilizacion
if @tiempo > 0
@tServidor / @tiempo
else
0
end
end
def mensajes_promedio
if @tiempo > 0
@longAcum / @tiempo
else
0
end
end
def tiempo_promedio_en_sistema
if @salidas > 0
(mensajes_promedio * @tiempo) / @salidas
else
0
end
end
def flujo_salida
if @tiempo > 0
@salidas / @tiempo
else
0
end
end
#
#metodo que crea las llegadas
#
def agregar_evento(evento)
@listaEventos.insertar_evento_en_orden evento
end
#
#metodo que procesa las llegadas
#
def procesa_llegada(tEvento)
actualiza_tiempos tEvento
@nTrabajos+=1
@llegadas+=1
end
#
#metodo que procesa las salidas
#
def procesa_salida(tEvento)
actualiza_tiempos tEvento
intServ = @tiempo - @tInicio
@tInicio = @tiempo
@tInicio = [@tiempo, @listaEventos[0].tiempo].max if @listaEventos.size > 0
@tServidor += intServ
@salidas+=1
@nTrabajos-=1
end
#
#metodo que actualiza tiempos
#
def actualiza_tiempos(tEvento)
@tiempo = tEvento
intervalo = tEvento - @tAnterior
@tAnterior = tEvento
@longAcum += (@nTrabajos * intervalo)
end
def salida_maxima
return @listaEventos.last.tiempo if @listaEventos.last
return 0
end
def tareas_en_fila?
@listaEventos.any?
end
def tiempo_paretofractal(tiempo)
tiempo_de_fila(tiempo) + tiempo_procesamiento(tiempo)
end
def tiempo_de_fila(tiempo)
n = ((@listaEventos.tamano_en_tiempo tiempo)/2)
n*0.000342291+((600*(n**0.8))/(0.05**(1/1.58)))
end
def tiempo_procesamiento(tiempo)
if @listaEventos.any?
@listaEventos.primero_despues_de_tiempo(tiempo).runtime*((0.05**(-1/1.58))-1)
else
0
end
end
end