Reporte de FCFS PT - 1 Python
Reporte de FCFS PT - 1 Python
Python
Práctica 3 - Pt 1
Integrantes:
- Alondra Goretti Gonzalez Martinez 218534681
- Carlos Damian Garibay Vargas 217134353
Objetivo de la Actividad
El objetivo es implementar un programa en Python que contempla un diagrama en 5
estados:
● Nuevo: Procesos que se acaban de crear pero aún no han sido admitidos por
el sistema operativo en el grupo de procesos ejecutables.
● Listos: Procesos que están preparados para ejecutarse, en cuanto sea su
turno.
● Ejecución: Proceso que está actualmente en ejecución.
● Bloqueado: Proceso que no se puede ejecutar hasta que se produzca cierto
suceso, como la terminación de una operación de E/S.
● Terminado: Un proceso que ha sido excluido por el sistema operativo del
grupo de procesos activos, bien porque se detuvo o porque fue abandonado
por alguna razón.
Problemas y Soluciones
El programa se realizó en base a la práctica 2, por lo que el llevar a cabo los
procesos fue algo relativamente sencillo. El desafío más grande fue que el programa
siguiera la lógica “First Come First Input” la cual debe continuar en base a los
comandos (teclas) escritos por el usuario durante la ejecución del programa.
CÓDIGO RTF/TXT:
import os
import time
import random
from pynput import keyboard as kb
from proceso import Proceso
tecla2 = ''
cont_null = 0
lista_nuevos = []
lista_listos = [] # \
lista_ejecucion = [] # --- Entre los 3 estados debe haber maximo 4
procesos en memoria
lista_bloqueados = [] # /
listaAux = []
id_usados = []
operador = ['+','-','*','/','%']
contador_global = 0
contadorTiempoTrascurrido = 0
contadorTiempoBloqueado = 0
contador_procesos = 0
id_operacion = 1
tiempoEntradaEjecucion = 0
tiempoRespuesta = 0
tiempoEspera = 0
tiempoServicio = 0
def funcionOperacion(operador):
proceso.numero1 = random.randint(-100, 100)
proceso.numero2 = random.randint(-100, 100)
proceso.cadena_operacion = '{} {} {}'.format(proceso.numero1, operador,
proceso.numero2)
procesos.append(proceso.cadena_operacion)
listaAux.append(proceso.cadena_operacion)
#-----------Tabla de procesos------------
def imprimirTablaProcesos():
if proc_terminados[k][3] == proc_terminados[k][4]: # Si el
proceso terminó de forma correcta, TS = TME
tiempoServicio = proc_terminados[k][3]
elif proc_terminados[k][3] > proc_terminados[k][4]: # Si el
proceso no terminó de manera correcta, TS = TT
tiempoServicio = proc_terminados[k][4]
tiempoProcesos[j].append(tiempoServicio)
os.system("cls")
print('\t\tTABLA DE PROCESOS\n')
if tiempoProcesos[i][3] == proc_terminados[k][0]:
if proc_terminados[k][2] == 'ERROR!':
print('Tipo finalizacion: Erronea\n')
print(f'Operacion: {tiempoProcesos[i][0]} = ERROR!')
else:
print('Tipo finalizacion: Normal\n')
print(f'Operacion: {tiempoProcesos[i][0]} =
{tiempoProcesos[i][1]}')
print(f'TME: {tiempoProcesos[i][2]}')
print(f'Tiempo de Llegada: {tiempoProcesos[i][4]}')
print(f'Tiempo de Finalizacion: {tiempoProcesos[i][6]}')
print(f'Tiempo de Retorno: {tiempoProcesos[i][7]}')
print(f'Tiempo de Respuesta: {tiempoProcesos[i][8]}')
print(f'Tiempo de Espera: {tiempoProcesos[i][10]}')
print(f'Tiempo de Servicio: {tiempoProcesos[i][9]}')
def pulsa2(letra):
if letra == kb.KeyCode.from_char('c'):
return False
def pulsa(tecla):
global tecla2
tecla2 = ''
tecla2 = tecla
return tecla2
proceso = Proceso()
#?Validacion de la operacion
while True:
proceso.operacion = random.choice(operador)
if proceso.operacion == "+":
funcionOperacion('+')
proceso.resultado_operacion = proceso.numero1 + proceso.numero2
procesos.append(proceso.resultado_operacion)
listaAux.append(proceso.resultado_operacion)
break
while True:
if proceso.numero2 == 0:
proceso.numero2 = random.randint(-100, 100)
else:
break
listaAux.append(proceso.cadena_operacion)
listaAux.append(proceso.resultado_operacion)
break
while True:
if proceso.numero2 == 0:
proceso.numero2 = random.randint(-100, 100)
else:
break
listaAux.append(proceso.cadena_operacion)
listaAux.append(proceso.resultado_operacion)
break
#?INGRESO DEL ID
proceso.id_programa = id_operacion
procesos.append(proceso.id_programa)
listaAux.append(proceso.id_programa)
id_operacion = id_operacion + 1
#?TIEMPO TRANSCURRIDO
tiempo_transcurrido = 0
procesos.append(tiempo_transcurrido)
tiempoLlegada = contador_global
tiempoProcesos[proc].append(contador_global) #Los primeros 4 procesos
tienen 0 en tiempo de llegada
del lista_nuevos[0:4]
longitudLista = len(lista_nuevos)
tiempoLlegada = contador_global
tiempoProcesos[proc].append(contador_global) #Los primeros procesos
tienen 0 en tiempo de llegada
del lista_nuevos[0:len(lista_nuevos)]
os.system("pause")
#Impresion de datos
i = 0
contadorTiempoTrascurrido = 0
tiempoRestante = 1
os.system("cls")
print('----------Contador Global----------')
print(contador_global)
print('------------Cola de Listos------------')
if len(lista_listos) == 0:
pass
else:
for j in range(1, len(lista_listos)): #Recorrer los procesos
de listos
print(f'ID: {lista_listos[j][3]} TME: {lista_listos[j][2]}
TT: {lista_listos[j][4]}', end=' |')
if len(lista_ejecucion) == 0:
lista_ejecucion.append(lista_listos[0])
if tiempoProcesos[j][3] == lista_ejecucion[0][3]: #
Comparar indices para saber si es el mismo proceso
tiempoEntradaEjecucion = contador_global
tiempoProcesos[j].append(tiempoEntradaEjecucion)
else:
pass
else:
lista_ejecucion[0] = lista_listos[0] # Pasa proceso de listos
a ejecucion
if tiempoProcesos[j][3] == lista_ejecucion[0][3]: #
Comparar indices para saber si es el mismo proceso
if lista_ejecucion[0][4] == 0: #Si el tiempo
transcurrido es 0 (Es la primera vez en Ejecucion)
tiempoEntradaEjecucion = contador_global
tiempoProcesos[j].append(tiempoEntradaEjecucion)
else:
pass
print('\n-------Proceso en Ejecucion----------')
if lista_ejecucion[0][3] == 0:
pass
else:
print("Operacion: {} \nTME: {} \nId: {} \nTiempo trascurrido: {}
\nTiempo restante: {}".format(lista_ejecucion[0][0], lista_ejecucion[0][2],
print('-----------Cola de Bloqueados-----------')
if len(lista_bloqueados) > 0:
if proc[5] == 9:
lista_listos.append(proc)
del lista_bloqueados[0]
proc[6] += proc[5] # El contador actual se suma al
acumulador (Sirve para tiempo de espera)
proc[5] = 0
print('--------Procesos Terminados--------')
if len(proc_terminados) >= 0:
if len(lista_nuevos) == 0:
else:
if lista_ejecucion[0][3] == 0: # proceso_null
pass
else:
lista_listos.append(lista_nuevos[0]) # Pasa proceso de
listos a ejecucion
if lista_ejecucion[0][3] == 0:
pass
else:
for j in range(0, len(tiempoProcesos)):
if tiempoProcesos[j][3] ==
lista_listos[len(lista_listos)-1][3]:
tiempoLlegada = contador_global
tiempoProcesos[j].append(tiempoLlegada) #
Tiempo de llegada a partir del proceso 5
del lista_nuevos[0]
del lista_listos[0]
listaAux = []
listaAux.extend([lista_ejecucion[0][3],lista_ejecucion[0][0],lista_ejecucion[
0][1], lista_ejecucion[0][2], lista_ejecucion[0][4]]) #Se agregan los datos
a listaAux
proc_terminados.append(listaAux)
print("Id: {} \tOperacion: {} \tResultado: {}
\t".format(listaAux[0],listaAux[1],listaAux[2]))
tiempoRestante -= 1
for j in range(0, len(tiempoProcesos)):
if tiempoProcesos[j][3] ==
proc_terminados[len(proc_terminados)-1][0]:
tiempoFinalizacion = contador_global
tiempoProcesos[j].append(tiempoFinalizacion) #Tiempo de
finalizacion
else:
tiempoRestante -= 1
contadorTiempoTrascurrido += 1
lista_listos[0][4] = contadorTiempoTrascurrido #
Actualizar el TR
contador_global += 1
#?----------------------------------LISTENER---------------------------------
-
escuchador = kb.Listener(pulsa)
escuchador.start()
if tecla2 == kb.KeyCode.from_char('i'):
if len(lista_listos) == 0: # Si no hay
nada en lista_listos
proceso_null[4] = lista_bloqueados[0][5] # Iguala el
tiempo
lista_listos.append(proceso_null) # Agrega el
proceso null
longitudLista += 1
lista_bloqueados.append(procesoActual)
if tecla2 == kb.KeyCode.from_char('e'):
listaAux = []
listaAux.extend([lista_ejecucion[0][3],lista_ejecucion[0][0],'ERROR!',
lista_ejecucion[0][2], lista_ejecucion[0][4]]) # Se agregan los datos a
listaAux
proc_terminados.append(listaAux)
if tiempoProcesos[j][3] ==
proc_terminados[len(proc_terminados)-1][0]:
tiempoFinalizacion = contador_global
tiempoProcesos[j].append(tiempoFinalizacion) #Tiempo de
finalizacion
if len(lista_nuevos) == 0:
if tecla2 == kb.KeyCode.from_char('p'):
tecla2 = ''
letra = ''
tecla2 = ''
i += 1
os.system("pause")
imprimirTablaProcesos()
Indicaciones:
● Ingresar el número de procesos
● Proceso en Ejecución:
Se muestra el ID del proceso, la operación con los valores brindados por la librería
“random”, tiempo transcurrido y restante.
● Proceso Interrumpido:
● Proceso Pausado: