Exemple #1
0
	def calcular_cuantos(self):

		cola = Cola()
		lista = self.listos.listar()

		medio = sum(p.tiempo for p in lista) / len(lista)

		proceso = self.listos.atender()

		while proceso:

			dist = proceso.tiempo - medio
			cuanto = medio

			if dist > 0:

				if dist > medio * 0.5:
					cuanto = medio * 1.3
				else:
					cuanto = medio
			else:

				if dist < medio*-0.5:
					cuanto = proceso.tiempo
				else:
					cuanto = proceso.tiempo*0.8

			proceso.cuanto = int(round(cuanto))

			cola.insertar(proceso)
			proceso = self.listos.atender()

		self.listos = cola
Exemple #2
0
	def __init__(self):

		self.listos = Cola()
		self.suspendidos = Cola()
		self.bloqueados = Cola()

		self.cuanto_suspendido = 3
		self.contador_suspendido = 3
Exemple #3
0
	def plan_listo(self, proceso_actual):
		
		asignar_nuevo = False

		cola_aux = Cola()
		
		proceso = self.listos.atender()

		if proceso and (proceso.tiempo < proceso_actual.tiempo):
			asignar_nuevo = True

		while (proceso):
			cola_aux.insertar(proceso)
			proceso = self.listos.atender()

		self.listos = cola_aux

		return asignar_nuevo
Exemple #4
0
	def plan_bloqueados(self):

		if self.bloqueados.vacia():
			return

		cola = Cola()

		proceso = self.bloqueados.atender()

		while proceso:

			if proceso.solicitar_desbloqueo():
				self.agregar_listo(proceso)
				proceso.estado = LISTO

				self.vista.informar_desbloqueado(proceso.nombre)

			else:
				cola.insertar(proceso)

			proceso = self.bloqueados.atender()

		self.bloqueados = cola
Exemple #5
0
	def agregar_ordenado(self, proceso):

		cola = Cola()

		cola = Cola()
		p = self.listos.atender()

		while p:
			if proceso.tiempo < p.tiempo:
				break

			cola.insertar(p)
			p = self.listos.atender()

		cola.insertar(proceso)

		while p:
			cola.insertar(p)
			p = self.listos.atender()

		self.listos = cola
Exemple #6
0
class Planificador():
	
	def __init__(self):

		self.listos = Cola()
		self.suspendidos = Cola()
		self.bloqueados = Cola()

		self.cuanto_suspendido = 3
		self.contador_suspendido = 3

	def planificar_pre(self, procesador):
		
		asignar_nuevo = False
		proceso_actual = procesador.proceso_asignado

		self.plan_bloqueados()
		self.plan_suspendidos()

		if proceso_actual:
			estado = proceso_actual.estado

			if estado != LISTO:
				asignar_nuevo = True

				if estado == SUSPENDIDO:
					self.suspendidos.insertar(proceso_actual)

				elif estado == BLOQUEADO:

					self.bloqueados.insertar(proceso_actual)
					self.vista.informar_bloqueado()

				elif estado == TERMINADO:
					proceso_actual.tiempo = -1
		else:
			asignar_nuevo = True

		if asignar_nuevo:
			self.asignar_nuevo(procesador)

	def planificar_post(self, procesador):
		
		proceso_actual = procesador.proceso_asignado

		if proceso_actual:
			estado = proceso_actual.estado

			suspendido = self.plan_listo(proceso_actual)

			if estado == LISTO:
				if suspendido:
					proceso_actual.estado = SUSPENDIDO

	def plan_bloqueados(self):

		if self.bloqueados.vacia():
			return

		cola = Cola()

		proceso = self.bloqueados.atender()

		while proceso:

			if proceso.solicitar_desbloqueo():
				self.agregar_listo(proceso)
				proceso.estado = LISTO

				self.vista.informar_desbloqueado(proceso.nombre)

			else:
				cola.insertar(proceso)

			proceso = self.bloqueados.atender()

		self.bloqueados = cola

	def plan_suspendidos(self):
		
		if not self.suspendidos.vacia():

			if self.contador_suspendido == 0:
				
				p = self.suspendidos.atender()
				p.estado = LISTO
				
				self.agregar_ordenado(p)
				self.contador_suspendido = self.cuanto_suspendido

				self.vista.informar_entra_listo()

			else:
				self.contador_suspendido -= 1

	def asignar_nuevo(self, procesador):

		self.vista.informar_removido_actual()

		procesador.proceso_asignado = self.obtener_proceso()

		if procesador.proceso_asignado: 
			procesador.proceso_asignado.estado = LISTO
			self.vista.informar_nuevo()

	def agregar_listo(self, proceso):
		self.listos.insertar(proceso)
		self.vista.informar_entra_listo()

	def obtener_proceso(self):
		
		proceso = None

		if not self.listos.vacia():
			proceso =  self.listos.atender()

		elif not self.suspendidos.vacia():

			self.contador_suspendido = self.cuanto_suspendido
			self.listos.insertar(self.suspendidos.atender())
			
			self.vista.informar_entra_listo()

			proceso = self.listos.atender()

		return proceso	

	def plan_listo(self, proceso_actual):
		return False

	def asignar_vista(self, vista):
		self.vista = vista

	def agregar_proceso(self, nombre, tiempo, sistema, recursos, **kwargs):

		p = Proceso(nombre, tiempo, sistema, recursos)

		self.agregar_listo(p)

		return p