예제 #1
0
    def liberarMemoria3ProcessosIndice1TamanhoTotalProcessoTest():
        print("\nliberarMemoria3ProcessosIndice1TamanhoTotalProcessoTest")
        # Configuração
        memoriaPrimaria = MemoriaPrimaria()
        mapaBits = MapeamentoEncadeadoBits()
        caminhoDisco = "discorepositorio.csv"

        processo = MemoriaSecundaria.buscarProcessoDisco(caminhoDisco)
        processo.bitR = 0
        processo.bitM = 0
        posicaoInicial = mapaBits.indiceMemoriaLivre
        memoriaPrimaria.adicionarProcessoMemoria(processo, posicaoInicial)

        segmento = Segmento()
        segmento.processo = processo
        segmento.posicaoInicial = posicaoInicial
        segmento.quantidadePosicoes = processo.tamanhoProcesso
        segmento.definirClasseSubstituicaoPagina()

        mapaBits.adicionarSegmento(segmento)

        processo1 = MemoriaSecundaria.buscarProcessoDisco(caminhoDisco)
        processo1.bitR = 1
        processo1.bitM = 1
        posicaoInicial = mapaBits.indiceMemoriaLivre
        memoriaPrimaria.adicionarProcessoMemoria(processo1, posicaoInicial)

        segmento1 = Segmento()
        segmento1.processo = processo1
        segmento1.posicaoInicial = posicaoInicial
        segmento1.quantidadePosicoes = processo1.tamanhoProcesso
        segmento1.definirClasseSubstituicaoPagina()

        mapaBits.adicionarSegmento(segmento1)

        processo2 = MemoriaSecundaria.buscarProcessoDisco(caminhoDisco)
        processo2.bitR = 0
        processo2.bitM = 0
        posicaoInicial = mapaBits.indiceMemoriaLivre
        memoriaPrimaria.adicionarProcessoMemoria(processo2, posicaoInicial)

        segmento2 = Segmento()
        segmento2.processo = processo2
        segmento2.posicaoInicial = posicaoInicial
        segmento2.quantidadePosicoes = processo2.tamanhoProcesso
        segmento2.definirClasseSubstituicaoPagina()

        mapaBits.adicionarSegmento(segmento2)

        # Execução
        memoriaPrimaria.exibirMemoriaPrimariaTamanhoTotalProcesso()

        # OBSERVAR RETORNO DO -1 PARA BUSCA DA CLASSE
        indiceProcessoASerRemovido = mapaBits.buscarPosicaoInicialProcessoPelaClasseSubstituicao(
            0)
        memoriaPrimaria.liberarMemoria(indiceProcessoASerRemovido)

        # Validação
        memoriaPrimaria.exibirMemoriaPrimariaTamanhoTotalProcesso()
    def adicionarSegmentoTamanhoPaginaTest():
        print("adicionarSegmentoTamanhoPaginaTest")
        # Configuração
        tamanhoPagina = 200
        processo = Processo()
        processo.tamanhoProcesso = 150

        processo1 = Processo()
        processo1.tamanhoProcesso = 120

        processo2 = Processo()
        processo2.tamanhoProcesso = 300

        mapeamentoEncadeadoBits = MapeamentoEncadeadoBits()

        # Execução
        segmento = Segmento()
        segmento.processo = processo
        segmento.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento.quantidadePosicoes = tamanhoPagina

        mapeamentoEncadeadoBits.adicionarSegmento(segmento)

        segmento1 = Segmento()
        segmento1.processo = processo1
        segmento1.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento1.quantidadePosicoes = tamanhoPagina

        mapeamentoEncadeadoBits.adicionarSegmento(segmento1)

        segmento2 = Segmento()
        segmento2.processo = processo2
        segmento2.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento2.quantidadePosicoes = tamanhoPagina

        mapeamentoEncadeadoBits.adicionarSegmento(segmento2)

        # Validação
        mapeamentoEncadeadoBits.exibirMapaBits()
    def adicionarSegmentoVericarIndiceMemoriaLivreAtualizadoTest():
        print("\nadicionarSegmentoVericarIndiceMemoriaLivreAtualizadoTest")
        # Configuração
        processo = Processo()
        processo.tamanhoProcesso = 255

        processo1 = Processo()
        processo1.tamanhoProcesso = 350

        processo2 = Processo()
        processo2.tamanhoProcesso = 500

        mapeamentoEncadeadoBits = MapeamentoEncadeadoBits()

        # Execução
        segmento = Segmento()
        segmento.processo = processo
        segmento.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento.quantidadePosicoes = processo.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento)

        segmento1 = Segmento()
        segmento1.processo = processo1
        segmento1.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento1.quantidadePosicoes = processo1.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento1)

        segmento2 = Segmento()
        segmento2.processo = processo2
        segmento2.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento2.quantidadePosicoes = processo2.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento2)

        # Validação
        mapeamentoEncadeadoBits.exibirMapaBits()
    def adicionarSegmentoTest():
        print("\nadicionarSegmentoTest")
        # Configuração
        processo = Processo()
        processo.tamanhoProcesso = 255

        mapeamentoEncadeadoBits = MapeamentoEncadeadoBits()

        # Execução
        segmento = Segmento()
        segmento.processo = processo
        segmento.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento.quantidadePosicoes = processo.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento)

        # Validação
        mapeamentoEncadeadoBits.exibirMapaBits()
    def removerSegmentoIndice3Test():
        print("\nremoverSegmentoIndice3Test")
        # Configuração
        processo = Processo()
        processo.tamanhoProcesso = 150

        processo1 = Processo()
        processo1.tamanhoProcesso = 120

        processo2 = Processo()
        processo2.tamanhoProcesso = 300

        processo3 = Processo()
        processo3.tamanhoProcesso = 650

        mapeamentoEncadeadoBits = MapeamentoEncadeadoBits()

        segmento = Segmento()
        segmento.processo = processo
        segmento.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento.quantidadePosicoes = processo.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento)

        segmento1 = Segmento()
        segmento1.processo = processo1
        segmento1.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento1.quantidadePosicoes = processo1.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento1)

        segmento2 = Segmento()
        segmento2.processo = processo2
        segmento2.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento2.quantidadePosicoes = processo2.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento2)

        segmento3 = Segmento()
        segmento3.processo = processo3
        segmento3.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento3.quantidadePosicoes = processo3.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento3)

        # Execução
        mapeamentoEncadeadoBits.exibirMapaBits()
        mapeamentoEncadeadoBits.removerSegmento(3)

        # Validação
        mapeamentoEncadeadoBits.exibirMapaBits()
    def popularMapaBits(cls, listaTamanhoProcesso):
        processo = Processo()
        processo.bitR = 0
        processo.bitM = 0
        processo.tamanhoProcesso = listaTamanhoProcesso[0]

        processo1 = Processo()
        processo1.bitR = 0
        processo1.bitM = 0
        processo1.tamanhoProcesso = listaTamanhoProcesso[1]

        processo2 = Processo()
        processo2.bitR = 0
        processo2.bitM = 1
        processo2.tamanhoProcesso = listaTamanhoProcesso[2]

        processo3 = Processo()
        processo3.bitR = 1
        processo3.bitM = 1
        processo3.tamanhoProcesso = listaTamanhoProcesso[3]

        processo4 = Processo()
        processo4.bitR = 1
        processo4.bitM = 0
        processo4.tamanhoProcesso = listaTamanhoProcesso[4]

        mapeamentoEncadeadoBits = MapeamentoEncadeadoBits()

        segmento = Segmento()
        segmento.processo = processo
        segmento.definirClasseSubstituicaoPagina()
        segmento.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento.quantidadePosicoes = processo.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento)

        segmento1 = Segmento()
        segmento1.processo = processo1
        segmento1.definirClasseSubstituicaoPagina()
        segmento1.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento1.quantidadePosicoes = processo1.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento1)

        segmento2 = Segmento()
        segmento2.processo = processo2
        segmento2.definirClasseSubstituicaoPagina()
        segmento2.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento2.quantidadePosicoes = processo2.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento2)

        segmento3 = Segmento()
        segmento3.processo = processo3
        segmento3.definirClasseSubstituicaoPagina()
        segmento3.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento3.quantidadePosicoes = processo3.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento3)

        segmento4 = Segmento()
        segmento4.processo = processo4
        segmento4.definirClasseSubstituicaoPagina()
        segmento4.posicaoInicial = mapeamentoEncadeadoBits.indiceMemoriaLivre
        segmento4.quantidadePosicoes = processo4.tamanhoProcesso

        mapeamentoEncadeadoBits.adicionarSegmento(segmento4)

        return mapeamentoEncadeadoBits
예제 #7
0
 def __init__(self, tamanhoPagina=None):
     self._mapaBits = MapeamentoEncadeadoBits()
     self._tamanhoPagina = tamanhoPagina
예제 #8
0
class GerenciadorMemoria:
    """ Description	"""

    __slots__ = ["_mapaBits", "_tamanhoPagina"]

    def __init__(self, tamanhoPagina=None):
        self._mapaBits = MapeamentoEncadeadoBits()
        self._tamanhoPagina = tamanhoPagina

    def adicionarProcessoMemoriaPrimaria(self, memoriaPrimaria, processo):

        if (self._tamanhoPagina == None):
            espacoOcupadoProcesso = processo.tamanhoProcesso
        else:
            espacoOcupadoProcesso = self._tamanhoPagina

        posicaoInicial = self._mapaBits.indiceMemoriaLivre
        memoriaPrimaria.adicionarProcessoMemoria(processo, posicaoInicial,
                                                 espacoOcupadoProcesso)

        segmento = Segmento()
        segmento.processo = processo
        segmento.posicaoInicial = posicaoInicial
        segmento.quantidadePosicoes = espacoOcupadoProcesso

        self._mapaBits.adicionarSegmento(segmento)

    def liberarEspacoMemoriaPrimaria(self,
                                     memoriaPrimaria,
                                     espacoASerLiberado,
                                     processo=None):
        if (processo != None):
            if (self._tamanhoPagina == None):
                tamanhoPaginaProcessoASerRemovido = processo.tamanhoProcesso

            else:
                tamanhoPaginaProcessoASerRemovido = self._tamanhoPagina

            indiceProcessoASerRemovido = memoriaPrimaria.buscarIndicePorProcesso(
                processo)
            memoriaPrimaria.liberarMemoria(indiceProcessoASerRemovido,
                                           tamanhoPaginaProcessoASerRemovido)

            indiceSegmentoASerRemovido = self._mapaBits.buscarIndiceSegmentoPorIdProcesso(
                processo.idProcesso)
            self._mapaBits.removerSegmento(indiceSegmentoASerRemovido)

        else:
            listaProcessosRemovidos = []
            quantidadePosicoesOcupadasMemoria = len(
                memoriaPrimaria.posicoesMemoria)
            tamanhoMaxMemoria = memoriaPrimaria.tamanhoMemoria

            # REMOVER USANDO ALGORÍTIMO DE SUBSTITUIÇÃO DE PÁGINA LRU
            while (quantidadePosicoesOcupadasMemoria + espacoASerLiberado >
                   tamanhoMaxMemoria):

                indicePosicaoInicialProcessoASerRemovidoMemoria = self._buscarPaginaASerRemovidaPorClasse(
                )
                if (indicePosicaoInicialProcessoASerRemovidoMemoria != -1):
                    idProcessoASerRemovido = memoriaPrimaria.posicoesMemoria[
                        indicePosicaoInicialProcessoASerRemovidoMemoria].idProcesso
                    if (self._tamanhoPagina == None):
                        tamanhoPaginaProcessoASerRemovido = memoriaPrimaria.posicoesMemoria[
                            indicePosicaoInicialProcessoASerRemovidoMemoria].tamanhoProcesso
                    else:
                        tamanhoPaginaProcessoASerRemovido = self._tamanhoPagina

                    processoRemovido = memoriaPrimaria.liberarMemoria(
                        indicePosicaoInicialProcessoASerRemovidoMemoria,
                        tamanhoPaginaProcessoASerRemovido)
                    listaProcessosRemovidos.append(processoRemovido)

                    indiceSegmentoASerRemovido = self._mapaBits.buscarIndiceSegmentoPorIdProcesso(
                        idProcessoASerRemovido)
                    self._mapaBits.removerSegmento(indiceSegmentoASerRemovido)

                    quantidadePosicoesOcupadasMemoria = len(
                        memoriaPrimaria.posicoesMemoria)

                else:
                    print(
                        "Não foram encontradas paginas com classes de substituição definidas."
                    )

            return listaProcessosRemovidos

        # Fim de remover segmento

    def atualizarTempoVidaProcesso(self, memoriaPrimaria, processoAtual):
        indiceProcessoBuscado = memoriaPrimaria.buscarIndicePorProcesso(
            processoAtual)
        if (indiceProcessoBuscado != -1):
            memoriaPrimaria.posicoesMemoria[
                indiceProcessoBuscado].tempoVida = processoAtual.tempoVida

    def atualizaBitsReferenciaModificacaoMemoriaPrimaria(
            self, memoriaPrimaria, processoAtual):
        indiceProcessoBuscado = memoriaPrimaria.buscarIndicePorProcesso(
            processoAtual)
        if (indiceProcessoBuscado != -1):
            memoriaPrimaria.posicoesMemoria[indiceProcessoBuscado].bitR = 1
            memoriaPrimaria.posicoesMemoria[indiceProcessoBuscado].bitM = 1

    def atualizaBitsReferenciaNaoModificacaoMemoriaPrimaria(
            self, memoriaPrimaria, processoAtual):
        indiceProcessoBuscado = memoriaPrimaria.buscarIndicePorProcesso(
            processoAtual)
        if (indiceProcessoBuscado != -1):
            memoriaPrimaria.posicoesMemoria[indiceProcessoBuscado].bitR = 1
            memoriaPrimaria.posicoesMemoria[indiceProcessoBuscado].bitM = 0

    def atualizarBitRProcessosNaoReferenciados(self):
        self._mapaBits.atualizarbitRParaProcessosNaoReferenciados()

    def exibirMapaBits(self):
        self._mapaBits.exibirMapaBits()

    def _buscarPaginaASerRemovidaPorClasse(self):
        self._mapaBits.atualizarClassesSubstituicaoPagina()

        posicaoInicialProcessoBuscado = -1
        for i in range(0, 3):
            posicaoInicialProcessoBuscado = self._mapaBits.buscarPosicaoInicialProcessoPelaClasseSubstituicao(
                i)
            if (posicaoInicialProcessoBuscado != -1):
                return posicaoInicialProcessoBuscado

        return posicaoInicialProcessoBuscado

    @property
    def tamanhoPagina(self):
        return self._tamanhoPagina

    @tamanhoPagina.setter
    def tamanhoPagina(self, tamanhoPagina):
        self._tamanhoPagina = tamanhoPagina