コード例 #1
0
 def do_carrega(self, arg):
     """Carrega um arquivo trace"""
     trace = open(arg)
     self.total, self.virtual = map(int, trace.readline().split())
     self.memoria_fisica = Memoria(self.total, 'mem')
     self.memoria_virtual = Memoria(self.virtual, 'vir')
     for line in trace.readlines():
         info = match(r"(\d+) (\w+) (\d+) (\d+) (.+)", line)
         processo = dict(t0=int(info.group(1)), nome=info.group(2), tf=int(info.group(3)), b=int(info.group(4)),
                         posicao_tempo=[])
         for info in [match(r"(\d+) (\d+)", palavra) for palavra in findall(r"\d+ \d+", info.group(5))]:
             processo["posicao_tempo"].append([int(info.group(1)), int(info.group(2))])
         self.processos.append(processo)
     trace.close()
     self.gerenciador = Gerenciador(self.memoria_fisica, self.memoria_virtual)
コード例 #2
0
class Simulador(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.prompt = '[Ep2]: '
        self.total = None
        self.virtual = None
        self.memoria_fisica = None
        self.memoria_virtual = None
        self.processos = []
        self.inicio = 0
        self.gerenciador = None
        self.semaforo = Semaphore(1)

    def espere(self, t):
        s = t - int(time() - self.inicio)
        if s > 0:
            sleep(s)

    def processe(self, i, processo):
        # O processo fica dormindo até a hora de começar
        self.espere(processo["t0"])
        # O processo faz a solicitação de memória
        # Só um processo pode chamar a função fit por vez, controle de concorrência da memória implementado
        self.semaforo.acquire()
        base, tamanho_alocado = self.gerenciador.fit(processo["nome"], processo["b"])
        self.memoria_virtual.escreve(base, bytearray([i] * tamanho_alocado))
        self.semaforo.release()
        print processo["nome"]

        # Faz o acesso a memória
        for p, t in processo["posicao_tempo"]:
            self.espere(t)
            self.semaforo.acquire()
            print "Faz acesso a posição %d(%d) escrevendo %d" % (p, self.gerenciador.traduz_endereco(p + base), i)
            # self.gerenciador.traduz_endereco retorna a primeira posição do quadro da memória física
            self.memoria_fisica.escreve(self.gerenciador.traduz_endereco(p + base), bytearray([i] * 16))
            self.semaforo.release()

        # Esperar até a hora que o processo finaliza
        self.espere(processo["tf"])
        self.semaforo.acquire()
        self.gerenciador.remova(processo["nome"])
        self.semaforo.release()
        print "Tchau processo %s" % processo["nome"]

    def do_carrega(self, arg):
        """Carrega um arquivo trace"""
        trace = open(arg)
        self.total, self.virtual = map(int, trace.readline().split())
        self.memoria_fisica = Memoria(self.total, 'mem')
        self.memoria_virtual = Memoria(self.virtual, 'vir')
        for line in trace.readlines():
            info = match(r"(\d+) (\w+) (\d+) (\d+) (.+)", line)
            processo = dict(t0=int(info.group(1)), nome=info.group(2), tf=int(info.group(3)), b=int(info.group(4)),
                            posicao_tempo=[])
            for info in [match(r"(\d+) (\d+)", palavra) for palavra in findall(r"\d+ \d+", info.group(5))]:
                processo["posicao_tempo"].append([int(info.group(1)), int(info.group(2))])
            self.processos.append(processo)
        trace.close()
        self.gerenciador = Gerenciador(self.memoria_fisica, self.memoria_virtual)

    def do_espaco(self, arg):
        self.gerenciador.faz_fit(arg)

    def do_substitui(self, arg):
        self.gerenciador.faz_substituicao(arg)

    def do_executa(self, arg):
        print "executando intervalo %s" % arg
        self.inicio = time()
        for i, processo in enumerate(self.processos):
            Thread(target=self.processe, args=(i, processo)).start()
        while active_count() > 1:
            relogio = int(time() - self.inicio + 1)
            for i in range(len(self.gerenciador.contador)):
                if self.gerenciador.r_m[i] & 2 == 2:  # só vai incrementar o contador da página i se r for 1
                    self.gerenciador.contador[i] += 1
            if relogio % int(arg):  # De tempos em tempos eu zero o bit de referencia
                for i in range(len(self.gerenciador.r_m)):
                    self.gerenciador.r_m[i] &= 1
            print('-----------------------------memória física------------------------')
            print ":".join("{:02x}".format(ord(c)) for c in self.memoria_fisica.le(0, self.total))
            print('-----------------------------memória virtual------------------------')
            print ":".join("{:02x}".format(ord(c)) for c in self.memoria_virtual.le(0, self.virtual))

            lista = self.gerenciador.registro_zero
            print 'nome do processo: %s\nposição inicial: %d\ntamanho: %d\n\n' % (
                lista.valor['processo'], lista.valor['posicao inicial'], lista.valor['tamanho'])
            lista = lista.proximo
            while lista != self.gerenciador.registro_zero:
                print 'nome do processo: %s\nposição inicial: %d\ntamanho: %d\n\n' % (
                    lista.valor['processo'], lista.valor['posicao inicial'], lista.valor['tamanho'])
                lista = lista.proximo
            print "Relógio: %d" % relogio
            sleep(1)

    def do_sai(self, arg):
        return True