def __init__(self, duracaoSimulacao, numMaximoDeJobs, listaDeJobs, instantesDeSubmissao, tamanhoDaMemoria, tamanhoDoDisco, tAcessoAoDisco, nomeDosArquivos, timeSliceProcessador, dispositivos): # Parâmetros de simulação self.instanteAtual = 0 self.quantidadeDeJobsAlocados = 0 self.duracao = duracaoSimulacao self.numMaximoDeJobs = numMaximoDeJobs # Os jobs que chegam não necessariamente serão submetidos # Caso ultrapasse o limite de jobs, os mesmos terão de esperar self.jobs = montarTabelaDeJobs(listaDeJobs) self.instantesDeSubmissao = instantesDeSubmissao # Lista com os índices dos jobs que já foram submetidos self.jobsSubmetidos = [] # Lista com os índices dos jobs que já foram submetidos e finalizados self.jobsFinalizados = [] for job in self.jobs: segmentosAtivos = [ 0 ] # Por convenção, o segmento raiz sempre deve estar ativo segmAtual = 0 while True: if (len(job.arvore[segmAtual][1]) == 0): # Não há mais nós filho break else: # Sorteia um nó filho e adiciona à lista de ativos segmAtual = random.choice(job.arvore[segmAtual][1]) segmentosAtivos.append(segmAtual) job.definirSegmentosAtivos(segmentosAtivos) # Calculando, para cada segmento de cada job, os instantes em que ocorre E/S ou acesso ao disco # instantesDeES[nomeDoJob] = [(instante, nomeDoDispositivo)] self.instantesDeES = {} # instantesDeAcessoAoDisco[nomeDoJob] = [(instante, nomeDoArquivo)] self.instantesDeAcessoAoDisco = {} for job in self.jobs: # A base de tempo deve ser atualizada quando se salta de um segmento para outro baseDeTempo = 0 self.instantesDeES[job.nome] = [] self.instantesDeAcessoAoDisco[job.nome] = [] for s in job.segmentosAtivos: duracaoSegm = job.listaSegmentos[s].tCPU # Requisições de entrada e saída dispositivoES = job.listaSegmentos[s].nomeE_S qtdES = job.listaSegmentos[s].qtdE_S if (dispositivoES != 'Nenhum'): for n in range(qtdES): instanteCorrigido = int(baseDeTempo + ((n + 1) * (duracaoSegm / (qtdES + 1)))) self.instantesDeES[job.nome].append( (instanteCorrigido, dispositivoES)) # Requisições de acesso ao disco for k in range(job.listaSegmentos[s].qtdArquivos): # Primeiro aplica-se a correção da base de tempo for i in range(len( job.listaSegmentos[s].instantesDeAcesso)): job.listaSegmentos[s].instantesDeAcesso[ i] += baseDeTempo # Depois os valores são inseridos no dicionário for instante in job.listaSegmentos[s].instantesDeAcesso: self.instantesDeAcessoAoDisco[job.nome].append( (instante, job.listaSegmentos[s].nomeDosArquivos[k])) baseDeTempo += duracaoSegm # Agora irei juntar os instantes e gerar listas de momentos de interrupção de processamento # interrupcoes[nomeDoJob] = [(t, 'D' para disco 'ES' para E/S, dispositivo/nomeDoArquivo)] self.interrupcoes = {} for job in self.jobs: self.interrupcoes[job.nome] = [] # Interrupções de E/S for IES in self.instantesDeES[job.nome]: self.interrupcoes[job.nome].append((IES[0], 'ES', IES[1])) # Interrupções de acesso ao disco for ID in self.instantesDeAcessoAoDisco[job.nome]: self.interrupcoes[job.nome].append((ID[0], 'D', ID[1])) self.interrupcoes[job.nome].sort(key=lambda tup: tup[0]) # print('Interrupções ordenadas por instante:') # print(self.interrupcoes) # Instanciando os demais componentes self.memoria = RAM(tamanho=tamanhoDaMemoria) self.disco = HD(tamanho=tamanhoDoDisco, numCiclos=tAcessoAoDisco, listaDeNomes=nomeDosArquivos) self.processador = CPU(timeSlice=timeSliceProcessador) self.GD = DeviceManager(dispositivos=dispositivos) # Criando o log de simulação self.log = texttable.Texttable(max_width=100) self.log.add_row(['Instante', 'Tags', 'Tipo', 'Mensagem']) self.log.set_cols_align(['c', 'c', 'c', 'c']) self.log.set_cols_width([7, 15, 5, 80])
from jobs import Job, Segmento, lerJobDoArquivo, montarTabelaDeJobs listaDeNomes = ['A.txt', 'B.txt', 'C.txt'] tabelaDeJobs = montarTabelaDeJobs(listaDeNomes=listaDeNomes) tabelaDeJobs[0].definirSegmentosAtivos([0, 1, 3]) tabelaDeJobs[1].definirSegmentosAtivos([0, 2, 6]) tabelaDeJobs[2].definirSegmentosAtivos([0, 1, 3, 5, 7]) for job in tabelaDeJobs: job.mostrarRequisitosDoJob() job.mostrarArvore()