Esempio n. 1
0
    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])
Esempio n. 2
0
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()