Baixe o app para aproveitar ainda mais
Prévia do material em texto
Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 Aula 09 Capítulo 9 – Gerência de Memória • 9.1 Conceitos Básicos • 9.2 Swapping • 9.3 Alocação de memória contígua • 9.4 Paginação • 9.5 Segmentação • 9.6 Segmentação com paginação Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1 Conceitos básicos • Memória - fundamental para a operação de um Sistema de Computação Moderno. • Memória – consiste em um grande vetor de palavras ou bytes, cada qual com seu próprio endereço. • Na multiprogramação, diversos processos são executados simultaneamente, através da divisão do tempo do processador. Para que isso possa acontecer, os programas precisam estar na memória, prontos para executar. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • É função da gerência de memória do sistema prover os mecanismos necessários para que diversos processos compartilhem a memória e forma segura e eficiente. • A CPU busca instruções da memória conforme o contador de programa(PC). Essas instruções podem ocasionar carregamento adicional e o armazenamento em endereços de memória específicos. 9.1 Conceitos básicos Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.1 Associação de endereços • Em geral, um programa reside em disco como um arquivo executável binário. • O programa deve ser levado à memória e colocado em um processo para ser executado. • Dependendo do tipo de gerência de memória em uso, o processo pode ser movido entre o disco e a memória durante a execução. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.1 Associação de endereços • Então é constituída uma fila de entrada que consiste em um conjunto de processos no disco que está esperando para ser colocado em memória para execução. • O procedimento normal é selecionar um dos processos na fila de entrada e carregá-lo para a memória. À medida que o processo é executado, ele acessa instruções e dados da memória. Por fim, o processo termina e seu espaço é liberado. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.1 Associação de endereços • Na maioria dos casos, um programa de usuário passará por várias etapas – algumas podendo ser opcionais – antes de ser executado. • Os endereços podem ser representados de diferentes maneiras durante essas etapas. – Programa-fonte – endereço simbólico (contador). – Compilação associa endereço simbólico em endereço relocáveis (14 bytes a partir do início deste módulo). – Carregador ou linkeditor associa os endereços relocáveis aos endereços absolutos (74014). Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.1 Associação de endereços • A associação de instruções e dados aos endereços de memória pode ser feita em qualquer etapa da vida de um programa. – Tempo de compilação – Tempo de carga – Tempo de execução Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.1 Associação de endereços – Tempo de compilação – Se a posição de memória onde o processo residirá for conhecida em tempo de compilação, então, o código absoluto poderá ser gerado. – Os programas de formato .COM do MS-DOS são códigos absoluto associados em tempo de compilação. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.1 Associação de endereços – Tempo de Carga – Se durante a compilação não estiver determinado onde o processo residirá na memória, o compilador deverá gerar um código relocável. – Nesse caso, a associação final é retardada até o instante de carga. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.1 Associação de endereços – Tempo de execução – Se o processo puder ser movido durante sua execução de um segmento de memória para outro, a associação deverá ser retardada até o tempo de execução. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.2 Espaço de endereços lógicos e físicos • Endereço lógico: é o endereço gerado pela CPU. • Endereço físico: é o endereço carregado no registrador de endereço da memória, ou seja, visto pela unidade de memória. • Os métodos de associação de endereço em tempo de compilação e tempo de carga geram em endereços lógicos e físicos idênticos. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.2 Espaço de endereços lógicos e físicos • Mas o esquema de associação de endereços no tempo de execução resulta em diferentes endereços lógicos e físicos. • Nesse caso normalmente fazemos referência ao endereço lógico como endereço virtual. • Neste contexto, usaremos endereço lógico e endereço virtual indistintamente. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.2 Espaço de endereços lógicos e físicos • O conjunto de todos os endereços lógicos gerados por um programa é um espaço de endereços lógicos. • O conjunto de todos os endereços físicos que correspondem a esses endereços lógicos é um espaço de endereços físicos. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.2 Espaço de endereços lógicos e físicos • O mapeamento de tempo de execução dos endereços virtuais para físicos é feito pela unidade de gerenciamento de memória (MMU – Memory- Management Unit), um dispositivo de hardware. • Existem outros métodos diferentes para obter tal mapeamento, veremos adiante. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.1.2 Espaço de endereços lógicos e físicos • Esse método (MMU) requer um suporte de hardware ligeiramente diferente da configuração de hardware convencional. • O registrador de base é agora chamado de registrador de relocação. • O valor do registrador de relocação é somado a cada endereço gerado por um processo do usuário no momento em que ele é enviado para a memória. Sistemas Operacionais com Java Exemplo da Relocação dinâmica usando um registrador de relocação Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • Até agora em nossa discussão, o programa inteiro e os dados devem estar na memória física para que o processo seja executado. • O tamanho de um processo é limitado ao tamanho da memória física. • Para obter melhor utilização do espaço de memória, podemos usar a carregamento dinâmico. 9.1.3 Carregamento dinâmico Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • Com a carregamento dinâmico, uma rotina só é carregada quando é chamada. • Todas as rotinas ficam armazenadas em disco em um formato de carga relocável. • O programa principal é carregado e as rotinas são carregadas conforme houver necessidade. 9.1.3 Carregamento dinâmico Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • A vantagem do carregamento dinâmico é que uma rotina não utilizada nunca é carregada, como rotinas de erro. • Embora o tamanho total do programa possa ser grande, a parte que é usada de fato (e, portanto, carregada) pode ser muito menor. • O carregamento dinâmico não exige suporte especial do SO. 9.1.3 Carregamento dinâmico Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • O conceito de vínculo dinâmico é semelhante ao do carregamento dinâmico. • Aqui é o vínculo e não o carregamento que é adiadopara o momento da execução. • Esse recurso é usado com bibliotecas do sistema, como bibliotecas de sub-rotinas da linguagem de programação. 9.1.4 Bibliotecas de vínculo dinâmico e compartilhadas Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • Sem esse recurso, todos os programas em um sistema precisam ter uma cópia da biblioteca da linguagem (ou pelo menos das rotinas referenciadas pelo programa) incluída na imagem executável. • Com isso há um desperdício de espaço em disco e em memória principal. 9.1.4 Bibliotecas de vínculo dinâmico e compartilhadas Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • Uma biblioteca pode ser substituída por uma nova versão e todos os programas que fazem referência à biblioteca passarão a usar automaticamente a nova versão. • Sem o vínculo dinâmico, todos esses programas precisariam ser vinculados para obter acesso à nova biblioteca. 9.1.4 Bibliotecas de vínculo dinâmico e compartilhadas Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • A idéia do overlay é manter na memória apenas as instruções e dados que são necessários em determinado instante. • Quando outras instruções são necessárias, elas são carregadas em posições da memória anteriormente ocupadas por instruções que não são mais necessárias. 9.1.5 Overlay Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • Exemplo: – Considere um assembler de dois passos. Durante o passo 1, ele constrói uma tabela de símbolos; depois, durante o passo 2, ele gera código em linguagem de máquina. Podemos ser capazes de particionar esse assembler em código do passo 1, código do passo 2, a tabela de símbolos e rotinas comuns de suporte, usadas pelos passo 1 e 2. Suponha que os tamanhos desses componentes sejam os seguintes: • Passo 1 => 70KB • Passo 2 => 80KB • Tabela de símbolos => 20KB • Rotinas comuns => 30KB 9.1.5 Overlay Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 • Para carregar tudo de uma vez, precisaríamos de 200KB de memória. Se houver somente 150KB disponíveis, não poderemos executar nosso processo. • Entretanto, observe que o passo 1 e o passo 2 não precisam estar na memória ao mesmo tempo. • Assim, definimos dois overlays: o overlay A é a tabela de símbolos, rotinas comuns e passo 1; e o overlay B é a tabela de símbolos, rotinas comuns e passo 2. • Acrescentamos um controlador de overlay (exige 10KB) e começamos com a sobreposição A na memória. 9.1.5 Overlay Sistemas Operacionais com Java 9.1.5 Overlay Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.2 Swapping • Um processo precisa estar na memória para ser executado. • Contudo, um processo pode ter de ser trocado temporariamente entre a memória e um armazenamento de apoio, para depois ser trazido de volta para memória para continuar a execução. • Por exemplo, considere um ambiente de multiprogramação com um algoritmo de escalonamento de CPU Round-Robin (quantum). Sistemas Operacionais com Java 9.2 Swapping Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.3 Alocação de memória contígua • A memória principal precisa acomodar o SO e os diversos processos do usuário. • Portanto, precisamos alocar as partes da memória principal da maneira mais eficiente possível. • Nesse item vamos ver um método comum, a alocação de memória contígua. • A memória é dividida em partições: – Uma para o SO residente. – Outra para os processos do usuário. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.3.1 Proteção da memória • Antes de discutirmos mais sobre a alocação de memória, vamos discutir a questão da proteção da memória. • Proteger o SO contra processos do usuário e proteger os próprios processos do usuário uns dos outros. • Os registradores de relocação são usados para proteger acessos do usuário um do outro, e de alterarem o código e dados do SO. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.3.1 Proteção da memória • O registrador de relocação contém o valor do menor endereço físico. • O registrador de limite contém o intervalo de endereços lógicos – cada endereço lógico precisa ser menor do que o registrador limite. • A MMU mapeia o endereço lógico dinamicamente, somando o valor no registrador de relocação. Esse endereço mapeado é enviado à memória. • Veja a figura a seguir: Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.3.1 Proteção da memória Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.3.2 Alocação de memória • Um dos métodos mais simples para alocação de memória é dividi-la em várias partições de tamanho fixo. • Cada partição pode conter um processo. Então o grau de multiprogramação está limitado pelo número de partições. • Nesse método de múltiplas partições, quando uma partição está livre, um processo é selecionado da fila de entrada e é carregado na partição livre. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.3.2 Alocação de memória • Nesse esquema de partição fixa, o SO mantém uma tabela indicando quais partes da memória está disponíveis e quais estão ocupadas. • É denominado buraco, o bloco de memória disponível; buracos de vários tamanhos estão espalhados pela memória. • Quando um processo chega, ele recebe memória de um buraco grande o suficiente para acomodá-lo. Sistemas Operacionais com Java 9.3.2 Alocação de memória • O SO mantém informações sobre: – Partições alocadas – Partições livres (buracos) Silberschatz, Galvin e Gagne (c) 2003 Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.3.2 Alocação de memória • Problema de alocação de armazenamento dinâmico – Como satisfazer uma requisição de tamanho n a partir de uma lista de buracos livres? • First-fit: aloca o primeiro buraco com tamanho suficiente. • Best-fit: aloca o menor buraco com tamanho suficiente. Deve pesquisar a lista inteira, a menos que esteja ordenada por tamanho. Produz pequenos buracos não contíguo. • Worst-fit: aloca o maior buraco com tamanho suficiente. Também deve pesquisar a lista inteira, a menos que esteja ordenada por tamanho. Produz grandes buracos, que podem ser mais úteis do que os pequenos buracos. Sistemas Operacionais com Java Silberschatz, Galvin e Gagne (c) 2003 9.4 Paginação • Próxima aula... Sistemas Operacionais com Java Referências • Capítulo 9 da referência abaixo: – SILBERSCHATZ, ABRAHAM; GAGNE, GREG; GALVIN, PETER BAES. Sistemas operacionais: com java. . Rio de Janeiro: Elsevier, 2004. Silberschatz, Galvin e Gagne (c) 2003
Compartilhar