Gerenciamento de Memória Virtual em Sistemas Operacionais
Classificado em Computação
Escrito em em português com um tamanho de 16,5 KB
Estruturas de Hardware e Controle de Memória
- Todas as referências à memória dentro de um processo são endereços lógicos a serem traduzidos em endereços físicos durante a execução.
- Um processo pode ser dividido em várias partes (páginas ou segmentos) e não precisam ser contíguos durante a execução.
- Isto é possível pela combinação de tradução dinâmica de endereços e o uso de tabelas de página ou segmento.
Execução de um Programa e Gerenciamento de Memória
- O sistema operacional carrega para a memória principal apenas alguns fragmentos do programa, incluindo o fragmento que contém o início do programa.
- O conjunto residente do processo é a parte do processo que está, de fato, na memória principal.
- Se o processador encontra um endereço que não está na memória principal, ele gera uma interrupção.
- O sistema operacional coloca o processo interrompido em estado bloqueado.
- O fragmento do processo que causou a falha é trazido para a memória principal, para o qual o sistema operacional:
- Emite uma solicitação de leitura de E/S para o disco.
- Emite outro processo para ser executado enquanto a operação de E/S é concluída.
- Quando a transação de E/S é concluída, uma interrupção é emitida, e o sistema operacional modifica o estado do processo para Pronto.
Vantagens da Memória Virtual
- Mais processos podem ser mantidos na memória principal.
- Apenas alguns fragmentos do processo são carregados na memória principal.
- Utilização mais eficiente do processador.
Pelo menos um processo, dos muitos que estão na memória principal, estará no estado Pronto.
- É possível que um processo seja maior que a memória principal total.
- Com a paginação ou segmentação baseada em memória virtual, o programador não precisa se preocupar se seu programa é muito grande.
Tipos de Memória (Execução)
- Memória Real
- Memória Principal
- Memória Virtual
- Permite a efetiva multiprogramação.
- Remove as restrições de memória principal para o usuário.
Debulha (Thrashing)
- Se um fragmento é ejetado imediatamente antes do uso, ele deve ser trazido de volta quase imediatamente.
- Muitas trocas levam à debulha (thrashing).
- O processador consome mais tempo trocando fragmentos do que executando as instruções do usuário.
Princípio da Localidade (Proximidade)
- As referências aos dados e ao programa dentro de um processo tendem a se agrupar.
- Por curtos períodos de tempo, apenas alguns fragmentos do processo serão necessários.
- Previsões inteligentes sobre quais partes de um processo serão necessárias no futuro próximo.
Suporte Necessário para Memória Virtual
- O hardware deve suportar paginação e segmentação.
- O sistema operacional deve incluir software para gerenciar a movimentação de páginas ou segmentos entre memória principal e secundária.
Página (Page)
- Cada processo tem sua própria tabela de páginas.
- Cada entrada na tabela de páginas contém o número do quadro da página correspondente na memória principal.
- Um bit é necessário para indicar se a página está na memória principal ou não.
- Outro bit é usado para indicar se o conteúdo da página foi modificado desde que ela foi carregada na memória principal. Se não houver alteração, não é necessário atualizar a página quando ela é substituída.
Tabelas de Páginas
- Existe uma tabela de páginas por processo.
- Algumas tabelas podem ocupar uma grande quantidade de memória principal.
- As tabelas de páginas são armazenadas na memória virtual.
- Quando um processo está em execução, pelo menos parte de sua tabela de páginas deve estar na memória principal.
Buffer de Tradução de Endereços (TLB)
- Cada referência à memória pode gerar dois acessos à memória:
- Para a entrada da tabela de páginas.
- Para obter os dados desejados.
- Para resolver este problema, a maioria dos esquemas de memória virtual usa um cache de entradas especiais da tabela de páginas, chamado Buffer de Tradução de Endereços (Translation Lookaside Buffer - TLB).
- Contém as entradas da tabela de páginas usadas mais recentemente.
- Dado um endereço virtual, o processador examina a TLB.
- Se a entrada da tabela de páginas estiver presente, ele obtém o número do quadro e, assim, o endereço real.
- Se não for encontrado, o processador usa o número da página como um índice para procurar na tabela de páginas do processo.
- Se encontrar o bit de presença ativo, isso indica que a página está na memória principal e o processador pode obter o número do quadro e, portanto, o endereço físico.
- O processador atualiza a TLB.
- Por outro lado, se o bit de presença não estiver ativo, isso significa que a página não está na memória principal, o que é chamado de falha de página.
Tamanho da Página
- Quanto menor o tamanho da página, menor a fragmentação interna.
- Quanto menor a página, maior o número de páginas necessárias por processo.
- Mais páginas significam mais tabelas de páginas.
- Com quadros de página grandes, a maioria das tabelas estará na memória virtual.
- As características físicas da maioria dos dispositivos de armazenamento secundário são adequadas para tamanhos de página maiores.
- Com um tamanho de página pequeno, um maior número de páginas pode estar disponível na memória principal.
- Depois de um tempo, todas as páginas na memória contêm algumas das referências recentes do processo. Portanto, as falhas de página serão menores.
- Ao aumentar o tamanho da página, ela pode conter referências a posições distantes recentemente, aumentando o risco de falha de página.
- Tamanhos de página diferentes oferecem maior flexibilidade no uso da TLB.
- Páginas maiores podem ser atribuídas a instruções do programa.
- Páginas de tamanho pequeno podem ser atribuídas a uma pilha de execução.
Segmentação
- A segmentação permite ao desenvolvedor considerar a memória como se fosse constituída por vários espaços de endereço.
- Os segmentos podem ter tamanhos diferentes, mesmo de forma dinâmica.
- Os endereços de memória consistem no número do segmento e no deslocamento.
- Simplifica o gerenciamento de estruturas de dados em crescimento.
- Permite modificar e recompilar partes do programa de forma independente.
- Permite o compartilhamento de dados entre processos.
- Permite proteção.
Tabela de Segmentos
- Cada entrada da tabela contém o endereço inicial do segmento na memória principal e seu comprimento.
- Contém um bit, indicando que o segmento já está na memória principal.
- Contém um bit que indica se o segmento foi modificado desde que foi carregado na memória principal.
- Contém outros bits de controle: proteção ou compartilhamento.
Combinação de Paginação e Segmentação
- Aproveita as vantagens da paginação e segmentação.
- Cada segmento pode ser dividido em páginas de tamanho fixo.
- Associado a cada processo, há uma tabela de segmentos e várias tabelas de páginas.
Proteção e Compartilhamento
- Uso de um sistema de anéis de proteção.
- Anéis interiores têm mais privilégios.
- Um programa pode acessar apenas os dados dos anéis de mesmo nível ou de anéis menos privilegiados.
- Um programa pode fazer chamadas para os serviços que residem no mesmo anel ou em anéis com maiores privilégios.
Políticas do Sistema Operacional na Memória Virtual
- O projeto de gerenciamento de memória em um sistema operacional depende de três áreas:
- Se as técnicas de memória virtual são usadas ou não.
- Uso da segmentação e paginação.
- Os algoritmos para gerenciamento de memória.
Os dois primeiros itens dependem da plataforma de hardware disponível. O terceiro ponto é o domínio do software do sistema operacional.
Algoritmos para Gerenciamento de Memória
- Desempenho: visa minimizar as falhas de página.
- Quando ocorre uma falha de página, há uma sobrecarga de software.
O sistema operacional deve:
Substituir páginas.
Agendar outro processo para execução.
- A probabilidade de se referir a uma página ausente é mínima.
Política de Leitura (Fetch Policy)
- Relacionada à decisão de quando carregar uma página na memória principal.
- Paginação por Demanda
A página é trazida para a memória somente quando há uma referência a uma posição nela.
Quando um processo é executado pela primeira vez, haverá muitas falhas.
- Pré-leitura de Páginas (Page Pre-fetching)
Carrega páginas que ainda não foram referenciadas devido a uma falha de página.
Se as páginas são carregadas sequencialmente da memória secundária, é mais eficiente trazer um bloco de páginas contíguas.
- A pré-leitura de páginas não deve ser confundida com a troca (swapping). Quando um processo é descarregado da memória e passa para o estado de suspensão, todas as páginas residentes também são removidas.
Políticas de Posicionamento (Placement Policy)
- Determina onde uma parte do processo residirá na memória principal.
- Para a segmentação pura: best-fit, first-fit e next-fit.
- Na combinação de segmentação com paginação, a localização é irrelevante.
Políticas de Substituição (Replacement Policy)
- Seleciona a página a ser substituída ao carregar uma nova página.
- Objetivo: Substituir a página que tem a menor chance de ser referenciada no futuro próximo.
- Tenta prever o futuro com base no passado.
Bloqueio de Quadros (Frame Locking)
- Restrição da política de substituição.
- Quando um quadro é bloqueado, a página carregada neste quadro não pode ser substituída.
- O núcleo do sistema operacional e estruturas de controle em pontos-chave são bloqueados.
- Um bit de bloqueio é associado a cada quadro.
Algoritmos de Substituição
- Política Ótima (Optimal Policy)
- Seleciona para substituir a página que terá que esperar a maior quantidade de tempo até ser referenciada.
- O sistema operacional requer um conhecimento preciso dos eventos futuros.
- Serve como um padrão para comparar outros algoritmos.
- Política Menos Recentemente Usada (Least Recently Used - LRU).
- Substitui a página que não foi referenciada há mais tempo.
- Pelo princípio da localidade, é a página que será menos provável de ser referenciada em um futuro próximo.
- Para a execução, seria necessário identificar cada página no momento de sua última referência, o que envolve uma sobrecarga.
- Política Primeiro a Entrar, Primeiro a Sair (First-In, First-Out - FIFO).
- Trata os quadros atribuídos a um processo como um buffer circular.
- As páginas são removidas da memória de acordo com a técnica de rotação.
- Simples de implementar.
- Substitui a página que está há mais tempo na memória.
- Amplamente utilizado quando os dados são carregados e removidos várias vezes.
- Política do Relógio (Clock Policy)
- Requer um bit adicional associado a cada quadro, chamado bit de uso.
- Quando uma página é carregada pela primeira vez em um quadro na memória, o bit de uso é desmarcado (definido como 0).
- Ao se referir à página, o bit é definido como 1.
- Quando é hora de substituir uma página, o primeiro quadro encontrado com o bit de uso em 0 é substituído.
- Durante a pesquisa, todos os bits de uso que são 1 são alterados para 0.
- Páginas em Buffer.
- Usa a política FIFO.
- A página substituída é atribuída a uma das duas listas:
Páginas livres: se não tiver sido modificada.
Páginas modificadas.
- A página não é fisicamente movida da memória principal, apenas sua entrada na tabela de páginas é apagada.
Gerenciamento do Conjunto Residente
- Tamanho do Conjunto Residente.
- O sistema operacional deve decidir a quantidade de memória principal a ser atribuída a um determinado processo.
Quanto menor o número de quadros atribuídos a um processo, maior o número de processos que podem estar na memória principal.
Se houver um pequeno número de páginas, a taxa de falha de página é maior.
A alocação de memória adicional para um determinado processo não terá grandes efeitos sobre a porcentagem de falhas de página.
- Alocação Fixa.
- Atribui ao processo um número fixo de quadros.
- Se uma falha de página ocorre, uma página do processo deve ser substituída pela página necessária.
- Alocação Variável.
- Permite que o número de quadros atribuídos mude.
- Caso haja muitas falhas de página, mais quadros serão atribuídos.
Grau de Substituição
- O escopo de uma estratégia de substituição pode ser classificado como local ou global.
- Global: Considera todas as páginas da memória como candidatas à substituição.
- Local: Considera apenas as páginas do processo que causou a falha.
Controle de Carga (Load Control)
- Determina o número de processos que podem estar na memória principal.
- Pode haver poucos processos na memória; às vezes, todos podem estar bloqueados e passar muito tempo em troca (swapping).
- Por outro lado, pode haver muitos processos na memória, aumentando a possibilidade de falhas de página. O resultado é a debulha (thrashing).
Suspensão de Processos
- Se o objetivo é reduzir o grau de multiprogramação, um ou mais processos residentes na memória principal devem ser suspensos.
- Processos com menor prioridade.
- Processos com muitas falhas de página.
- Último processo ativado.
- Processo com o menor conjunto residente.
- O processo mais antigo.
- Processo com os maiores tempos de execução restantes.
Benefícios do Uso de Memória Virtual
- Melhor utilização do processador.
- Remove a limitação de tamanho no desenvolvimento de software.
- Tradução de endereço lógico em endereço real durante a execução.
Isso permite que processos estejam em qualquer posição da memória principal e mudem de localização ao longo do tempo.
- Divide um processo em fragmentos.
Não é necessário que esses fragmentos estejam localizados de forma contígua.
Não é necessário que todos os fragmentos estejam na memória principal.
- As abordagens básicas são paginação e segmentação de memória virtual.
- Um esquema de gerenciamento de memória requer suporte de hardware e software.
- Hardware: Fornece o processador.
Tradução de Endereços Virtuais.
Geração de uma interrupção quando há falha de página.
- Software: Algoritmos para o gerenciamento de memória.
- Questões de design relacionadas ao suporte de gerenciamento de memória em sistemas operacionais:
- Política de Leitura.
- Políticas de Posicionamento.
- Políticas de Substituição.
- Gerenciamento do Conjunto Residente.
- Políticas de Quitação.
- Controle de Carga.