Algoritmo Round Robin en Python
El siguiente articulo trata de como es el algoritmo de planificación Round Robin en python.
Siguiendo con el articulo de la explicacion de round robin
El siguiente código correspondería a la simulación de la planificación de procesos con round robin.
Dicho script solicita el numero de procesos, el tiempo de llegada, ráfaga y quantum para calcular el tiempo de finalizacion, espera de cada proceso.
El siguiente algoritmo esta hecho con licencia GPL V3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class proceso(object): | |
def __init__(self,id,rafaga,llegada): | |
self.id=id | |
self.rafaga = rafaga | |
self.llegada = llegada | |
self.rafagatmp = rafaga | |
self.espera =0 | |
self.retorno =0 | |
self.finalizacion=0 | |
print("***********************************************") | |
print("************** Simulacion ROUND ROBIN *********") | |
print("***********************************************") | |
print("***********************************************") | |
print("*+-------------------------------------------+*") | |
print("*| By FuriosoJack |*") | |
print("*+-------------------------------------------+*") | |
print("***********************************************") | |
print() | |
print() | |
try: | |
#if(True): | |
print("Ingrese el numero de procesos") | |
nnumeros = int(input(">")) | |
if(nnumeros >0): | |
listadeprocesos = [] | |
for i in range(nnumeros): | |
tmpllegada = -1 | |
print("################### Proceso "+ str(i+1)+ " ###############") | |
while(tmpllegada <0): | |
print("Ingrese el tiempo de llegada del proceso") | |
tmpllegada = int(input(">")) | |
rafagatmp =0 | |
while(rafagatmp <1): | |
print("Ingrese la rafaga del proceso>") | |
rafagatmp = int(input(">")) | |
#en el arreglo el primer item es el "id del proceso", luego la rafaga y ultimo la llegada | |
listadeprocesos.append(proceso((i+1),rafagatmp,tmpllegada)) | |
print("################### Fin del procesos ###############") | |
print() | |
print() | |
print() | |
print() | |
print("Procesoss creados Con exito!!") | |
print() | |
quantum =0 | |
swi = False | |
while(quantum <1): | |
print("Ingrese el Quantum") | |
quantum = int(input(">")) | |
quantumtmp = quantum | |
#metodo para ordenar los procesos por tiempo de llegada | |
def ordenaInsersion(lista): | |
for i in range(1,len(lista)): | |
j = i | |
while j > 0 and lista[j].llegada < lista[j-1].llegada: | |
lista[j], lista[j-1] = lista[j-1], lista[j] | |
j=j-1 | |
return lista | |
listadeprocesos = ordenaInsersion(listadeprocesos) #lista queda ordenada por tiempo de llegada | |
print("[+] Se ordeno lista de procesos por tiempo de llegada") | |
procesosEspejo = len(listadeprocesos) #es la variable que controla los procesos que hacen falta por terminar | |
tiempo = 0 | |
procesosCola=[] | |
procesoEjecusion = None #variable que corresponde al proceso que altumanete se encuentra en ejecusion | |
nproceso = 0 #variable utilizada para pasar al siguiente | |
print("[+] Se establecieron varibles para el funcionamiento") | |
print("@@@@@@@ Incicio del Algortimo @@@@@@@@") | |
sw = True #Variable de control | |
while(procesosEspejo>0): | |
print("---------------- Tiempo ["+str(tiempo)+"] ---------------") | |
if(len(listadeprocesos) > nproceso and tiempo >= listadeprocesos[nproceso].llegada): | |
print("[+]El proceso "+str(listadeprocesos[nproceso].id)+" se ingreso a la cola de listos") | |
procesosCola.append(listadeprocesos[nproceso]) | |
nproceso = nproceso +1 | |
else: | |
if nproceso>0 or len(procesosCola) > 0: | |
if(procesoEjecusion == None): | |
procesoEjecusion = procesosCola.pop(0) | |
sw = True | |
print("[+] Se saca el proceso "+str(procesoEjecusion.id)+" de la cola y se ejecuta.") | |
else: | |
if(sw): | |
if(procesoEjecusion.rafagatmp >=quantum): | |
procesoEjecusion.rafagatmp = procesoEjecusion.rafagatmp - quantum | |
print("[+] Se resta " +str(quantum)+ " a la rafaga del proceso "+str(procesoEjecusion.id)) | |
tiempo = tiempo + quantum | |
print("[+] Se aumenta" + str(quantum) +" al tiempo") | |
else: | |
tiempo = tiempo + procesoEjecusion.rafagatmp | |
print("[+] Se aumenta " + str(procesoEjecusion.rafagatmp) +" al tiempo") | |
print("[+] Se resta "+str(procesoEjecusion.rafagatmp)+ " a la rafaga del proceso "+str(procesoEjecusion.id)) | |
procesoEjecusion.rafagatmp = 0 | |
if(procesoEjecusion.rafagatmp <1 ): | |
print("---------------- Tiempo ["+str(tiempo)+"] ---------------") | |
print("[+] El Proceso "+str(procesoEjecusion.id)+ " finalizo.") | |
procesoEjecusion.finalizacion = tiempo | |
procesoEjecusion.retorno = procesoEjecusion.finalizacion - procesoEjecusion.llegada | |
procesoEjecusion.espera = procesoEjecusion.retorno - procesoEjecusion.rafaga | |
procesosEspejo = procesosEspejo-1 | |
procesoEjecusion = None | |
else: | |
sw= False | |
else: | |
procesosCola.append(procesoEjecusion) | |
print("[+] Se agrega el proceso "+str(procesoEjecusion.id)+" que estaba en ejecusion a la cola de listos") | |
procesoEjecusion = None | |
else: | |
tiempo = tiempo +1 | |
print("@@@@@@@ Algoritmo Finalizado @@@@@@@@") | |
print("") | |
print() | |
print() | |
print("!!!!!!!!!!!!!! Resultados !!!!!") | |
totalretorno=0 | |
totalespera=0 | |
for proceso in listadeprocesos: | |
print("Proceso "+ str(proceso.id) + " Finalizo: "+str(proceso.finalizacion) + " Espera: "+str(proceso.espera)+ " Retorno: "+str(proceso.retorno)) | |
totalretorno = totalretorno + proceso.retorno | |
totalespera = totalespera + proceso.espera | |
print() | |
print("Promedio de retorno: " +str(totalretorno/len(listadeprocesos))) | |
print("Promedio de espera: " +str(totalespera/len(listadeprocesos))) | |
else: | |
print("No es valido") | |
except Exception as e: | |
print(e) |