Notas da Aula 17 - Fundamentos de Sistemas Operacionais



Documentos relacionados
Arquitetura de Computadores. Sistemas Operacionais IV

Sistemas Operacionais

Disciplina: Sistemas Operacionais - CAFW-UFSM Professor: Roberto Franciscatto

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande

AULA 13 - Gerência de Memória

Sistemas Operacionais

Sistemas Operativos I

Gerenciamento de Memória

Prof.: Roberto Franciscatto. Capítulo 1.2 Aspectos Gerais

AULA 5 Sistemas Operacionais

Gerenciamento de memória

Sistemas Operacionais Arquivos. Carlos Ferraz Jorge Cavalcanti Fonsêca

Notas da Aula 15 - Fundamentos de Sistemas Operacionais

Fundamentos de Sistemas Operacionais

Organização e Arquitetura de Computadores

Memória Virtual. Prof. Dr. José Luís Zem Prof. Dr. Renato Kraide Soffner Prof. Ms. Rossano Pablo Pinto

Desenvolvimento de um Simulador de Gerenciamento de Memória

Gerenciamento de memória. Carlos Eduardo de Carvalho Dantas

Sistemas Operacionais

Infraestrutura de Hardware. Memória Virtual

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

Sistema de Arquivos. Ambientes Operacionais. Prof. Simão Sirineo Toscani

Prof. Bruno Calegaro

Fundamentos de Sistemas Operacionais

Exercícios de revisão V2. FAT: 300 GB / 2KB = 150MB X 8 bytes (64 bits / 8) = 1.2GB

Orientação a Objetos

Entendendo como funciona o NAT

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

Exercícios Gerência de Memória

Arquitetura de Rede de Computadores

SISTEMAS OPERACIONAIS CAPÍTULO 3 CONCORRÊNCIA

Sistema de Arquivos FAT

Notas da Aula 6 - Fundamentos de Sistemas Operacionais

Gerência do Sistema de Arquivos. Adão de Melo Neto

Memórias Prof. Galvez Gonçalves

Simulação do Processo de Substituição de Páginas em Gerência de Memória Virtual

Funções de um SO. Gerência de processos Gerência de memória Gerência de Arquivos Gerência de I/O Sistema de Proteção

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

Sistemas Operacionais

Memória - Gerenciamento. Sistemas Operacionais - Professor Machado

Sistemas Operacionais

Sistemas Operacionais Processos e Threads

Programação de Sistemas

SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar

BC Sistemas Operacionais Sistema de Arquivos (aula 10 Parte 2) Prof. Marcelo Z. do Nascimento

Gerenciamento de memória

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware

Organização do Curso. Instalação e Configuração. Módulo II. Pós Graduação em Projeto e Gerencia de Redes de Computadores

Gerência de Processador

Sistemas Operacionais Arquivos

ROM-BIOS Inicialização Sistemas de Arquivos Formatação

Introdução a Java. Hélder Nunes

LABORATÓRIO DE SISTEMAS OPERACIONAIS. PROFª. M.Sc. JULIANA HOFFMANN QUINONEZ BENACCHIO

Organização de Computadores 1

Arquitetura e Organização de Computadores

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Memória Cache. Prof. Leonardo Barreto Campos 1

Memória cache. Prof. Francisco Adelton

Gerenciamento Básico B de Memória Aula 07

ISO/IEC 12207: Gerência de Configuração

Curso: Redes II (Heterogênea e Convergente) Tema da Aula: Características Roteamento

Notas da Aula 4 - Fundamentos de Sistemas Operacionais

Conceitos e Gerenciamento de Memória

O texto desta seção foi publicado em o

Protocolo TCP/IP. Neste caso cada computador da rede precisa de, pelo menos, dois parâmetros configurados:

Armazenamento Secundário. SCE-183 Algoritmos e Estruturas de Dados II

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

discos impressora CPU memória AULA 04 - Estruturas de Sistemas Computacionais Operação dos sistemas de computação Controlador de disco

Arquitetura de Sistemas Operacionais

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

CAPÍTULO 2 CARACTERÍSTICAS DE E/S E PORTA PARALELA

Arquiteturas RISC. (Reduced Instructions Set Computers)

Capítulo 8: Gerenciamento de Memória

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

5 Mecanismo de seleção de componentes

Unidade 13: Paralelismo:

Disciplina: Introdução à Informática Profª Érica Barcelos

O que é um programa? Programa é uma lista de instruções que descrevem uma tarefa a ser realizada pelo computador.

Aula 26: Arquiteturas RISC vs. CISC

Para construção dos modelos físicos, será estudado o modelo Relacional como originalmente proposto por Codd.

Fundamentos de Sistemas Operacionais. Sistema de Arquivos. Prof. Edwar Saliba Júnior Março de Unidade Sistemas de Arquivos

SISTEMAS OPERACIONAIS

Curso de Instalação e Gestão de Redes Informáticas

ULA Sinais de Controle enviados pela UC

Sistemas Operacionais. Prof. André Y. Kusumoto

28/9/2010. Paralelismo no nível de instruções Processadores superescalares

Sistemas Operacionais

3. Arquitetura Básica do Computador

Sistemas Operacionais

Sistemas Operacionais. Prof. André Y. Kusumoto

Desenvolvendo Websites com PHP

FACULDADE PITÁGORAS DISCIPLINA: ARQUITETURA DE COMPUTADORES

Exercícios Gerência de Memória

Admistração de Redes de Computadores (ARC)

FACULDADE DE ENGENHARIA DE COMPUTAÇÃO. PROJETO FINAL I e II PLANO DE TRABALHO <NOME DO TRABALHO> <Nome do Aluno> <Nome do Orientador>

O que veremos nesta aula? Principais Aspectos de Sistemas Operacionais. Visão geral de um sistema computacional

1

Transcrição:

Notas da Aula 17 - Fundamentos de Sistemas Operacionais 1. Gerenciamento de Memória: Introdução O gerenciamento de memória é provavelmente a tarefa mais complexa de um sistema operacional multiprogramado. A capacidade de ter diversos processos carregados em memória principal é hoje uma necessidade na maior parte dos sistemas computacionais. No entanto, para que isso seja possível é preciso que o SO consiga dividir o uso da memória principal de forma justa e segura entre os vários processos. Em relação à segurança, este tema já foi abordado em aulas anteriores. O maior requisito neste caso é garantir que um processo não possa interferir nas informações armazenadas por outro (a menos que haja um prévio consentimento). Por esta razão, surgiu o conceito de Espaço de Endereçamento de um processo. O espaço de endereçamento, como já estudado, é um conjunto de posições de memória destinadas ao armazenamento das informações do processo. Cabe ao SO, portanto, alocar um espaço de endereçamento para cada processo e, de alguma forma, garantir a exclusividade de acesso de cada espaço de endereçamento ao seu processo dono. No Capítulo 2 foi estudada uma forma de realizar esta proteção aos espaços de endereçamento, baseada na utilização de dois registradores: o Registrador Base e o Registrador Limite. A ideia, bastante simples, é que, a cada acesso de um processo à memória principal, um circuito auxiliar com dois comparadores verificasse se o endereço requisitado é maior ou igual ao endereço base e menor que o endereço limite. Caso contrário, este circuito auxiliar deve gerar uma interrupção que fará com que o SO entre em execução para tomar alguma atitude em relação ao processo que cometeu o acesso indevido. Quando referenciado no Capítulo 2, este circuito auxiliar não foi detalhado. De fato, ele foi apresentado de uma bastante superficial. Tal circuito é parte de um componente de hardware maior conhecido como MMU (Memory Management Unit), responsável por implementar os mecanismos de hardware necessários ao gerenciamento de memória do Sistema Operacional. A MMU pode ser simples ou bastante complexa, dependendo das características do gerenciamento de memória desejado. Neste capítulo, este componente será estudado em detalhes. O gerenciamento de memória, no entanto, não se baseia exclusivamente na proteção do acesso dos processos aos espaços de endereçamento. Uma outra funcionalidade deste gerenciamento é a própria alocação de uma porção da memória física para armazenar o espaço de endereçamento de cada processo. Quando o processo é criado, o SO deve encontrar na memória principal espaço suficiente para armazenar todas as informações do novo processo. Como será visto a seguir, este não é um processo trivial. O gerenciamento de memória é ainda responsável pela manipulação de diferentes tipos de memória na máquina. Além da memória principal (memória RAM), existe a memória secundária

(representada, principalmente, pelos HDs) e a memória cache. Todas estas sofrem, em maior ou menor grau, influência do módulo de gerenciamento de memória do SO. Finalmente, a última atribuição do gerenciamento de memória do SO é definir a visão que os processos têm da memória principal. Em sistemas operacionais mais antigos, os processos tinham uma visão direta da memória principal. Quando um processo requisitava acesso a posição de memória 100, este acesso era mapeado diretamente para a centésima posição da memória física. Nos Sistemas Operacionais atuais, este mapeamento direto não é mais utilizado. Ao contrário, utiliza-se um esquema de endereçamento lógico. Quando um processo requisita acesso a posição de memória 100, este endereço lógico é traduzido para um endereço absoluto (endereço físico na memória principal). 2. Endereçamento Lógico vs. Endereçamento Físico No apêndice do livro há uma breve introdução ao processo de construção de um arquivo executável a partir do código fonte de um programa. A importância do estudo deste processo no contexto de sistemas operacionais está justamente na questão do acesso à memória principal. Na aula sobre este assunto, foram discutidos dois métodos de carregamento de um programa em memória: o carregamento absoluto e a relocação dinâmica. No carregamento absoluto, o programa define em tempo de compilação quais posições da memória principal serão utilizadas para armazenar variáveis e funções. Na relocação dinâmica, o carregador do SO é responsável por consertar os endereços de memória do programa (quando este é carregado na memória do computador), de acordo com a região na qual o SO coloca o espaço de endereçamento. Como foi discutido anteriormente, o carregamento absoluto tem uma série de desvantagens, como a necessidade da alocação de região de memória específica para o programa (que pode não estar disponível naquele momento) e a impossibilidade de execução de duas ou mais instâncias simultâneas do mesmo programa. Por outro lado, a relocação dinâmica é insere um grande overhead no carregamento de um programa para a memória da máquina, tendo consequências sérias do ponto de vista do desempenho. Embora ambas as soluções já tenham sido adotadas em vários sistemas computacionais, nenhuma delas, por si só, é realmente satisfatória. Por este motivo, os sistemas operacionais modernos passaram a adotar um esquema de endereçamento lógico, com o objetivo de solucionar de forma mais adequada este problema. A ideia do endereçamento lógico é simples: os processos acessam a memória principal como se seu espaço de endereçamento sempre estivesse localizado a partir da posição de memória 0. Na realidade, no entanto, o espaço de endereçamento de um processo pode estar em qualquer ponto da memória física. Para que isto funcione, é claro, é necessário um esquema de tradução ou mapeamento dos endereços lógicos em endereços físicos. A grande vantagem do endereçamento lógico é a possibilidade de adoção do método de carregamento absoluto sem os problemas inerentes a ele. Um programa não precisa mais ter seu espaço de

endereçamento carregado em uma região específica da memória porque, independentemente do local na qual ele é carregado, o processo o continua vendo como se este estivesse na posição 0. Um método simples de tradução de endereços lógicos para endereços físicos é a utilização dos próprios registradores base e limite. Quando um programa é carregado em memória, o SO escolhe uma região qualquer da memória principal (digamos, por exemplo, da posição 500 à posição 699). Neste caso, toda vez que este processo for colocado para execução no processador, o SO configura o registrador base para o endereço da primeira posição do espaço de endereçamento (no exemplo, posição 500), enquanto o registrador limite recebe o tamanho do espaço de endereçamento (no exemplo, 200). A cada tentativa de acesso à memória feita pelo processo, a MMU primeiramente compara o endereço lógico requisitado com o valor do registrador limite. Se este valor for maior ou igual, o processo está tentando realizar um acesso a uma posição de memória fora do seu espaço de endereçamento. Neste caso, a MMU gera uma interrupção. Caso contrário, a MMU soma o endereço lógico desejado com o valor do registrador base e passa o endereço físico resultante para o controlador da memória principal. Por exemplo, suponha que o processo deseje acessar o endereço (lógico) 123. Como 123 é menor que 200, este valor é somado com 500, resultando no endereço físico 623. Este método claramente garante que todo acesso de memória feito por um processo será necessariamente dentro de seu próprio espaço de endereçamento. Embora o método descrito atenda a dois requisitos desejáveis do gerenciamento de memória (tradução de endereços lógicos para endereços físicos e proteção no acesso ao espaço de endereçamento), ele está longe de ser a melhor solução possível. Um dos problemas que não é solucionado por este mecanismo é como dois ou mais processos podem compartilhar uma região de memória. Como citado no Capítulo 3, é comum que dois ou mais processos solicitem ao SO uma região de memória a ser compartilhada por eles para troca de informação. O método dos registradores base e limite não permite este tipo de compartilhamento, pois exige que a região de memória acessível por um processo seja contígua. Nas próximas aulas serão estudados outros mecanismos de gerenciamento de memória mais complexos que resolvem esta e outras limitações. 3. Métodos de Alocação Primitivos Além de realizar a tradução dos endereços lógicos para endereços físicos e de verificar se os endereços acessados pertencem, de fato, ao espaço de endereçamento dos processos, o gerenciamento de memória do SO tem a função de alocar o espaço de endereçamento em alguma posição da memória física. O processo de alocação consiste em escolher uma região da memória física que esteja disponível para receber o espaço de endereçamento de um processo atualmente em criação. Como será estudado, no entanto, este processo de alocação não é trivial. O método de alocação mais simples possível é o chamado Particionamento Fixo. Neste

método, o Sistema Operacional determina previamente uma divisão da memória principal em partições de tamanho fixo. O SO armazena ainda uma tabela indicando quais partições estão livres e quais estão ocupadas. Note que as partições podem ter tamanhos diferentes. A decisão de como dividir a memória principal é inteiramente dependente do SO. Os projetistas do sistema podem decidir, por exemplo, criar algumas partições maiores para comportar processos específicos com maior demanda de memória. Quando um programa deve ser carregado em memória, o SO varre a tabela de partições, procurando por uma que seja grande o suficiente para conter o espaço de endereçamento do novo processo. Caso não haja partições livres (ou pelo menos partições de tamanho suficiente para conter o espaço de endereçamento do novo processo), o SO deve postergar ou rejeitar a criação do processo. Eventualmente, mais de uma partição pode ser alocada a um processo, desde que todas sejam contíguas. O tamanho do espaço de endereçamento de um processo depende da quantidade de informação armazenada por este processo. Logo, é improvável que no particionamento prévio feito pelo SO sejam definidas partições com os exatos tamanhos dos espaços de endereçamento dos processos que serão executados no sistema. Desta forma, quase sempre que um processo tiver seu espaço de endereçamento alocado em uma partição da memória principal, haverá espaço sobrando nesta partição. Este espaço, no entanto, acabará desperdiçado, já que não é possível utilizá-lo para outro processo. A este problema, inerente ao método de particionamento fixo, dá-se o nome de Fragmentação Interna. Outro problema que ocorre com a utilização do particionamento fixo é a Fragmentação Externa. Neste caso, ao invés de posições de memória serem perdidas internamente às partições, o problema se dá com posições de memória externas às partições alocadas. Considere, por exemplo, um sistema com 100 bytes de memória, no qual o SO define 4 partições: duas partições de 20 bytes e mais duas de 30 bytes. Considere que estas partições sejam definidas exatamente nesta ordem: primeiro as duas de 20 bytes e em seguida as duas de 30 bytes. Suponha ainda que o SO já tenha alocado a primeira e a terceira partições (de 20 e 30 bytes, respectivamente). Se um novo processo a ser criado no sistema requer um espaço de endereçamento de 35 bytes o sistema não poderá alocá-lo já que as as partições restantes são de 20 e 30 bytes. Note que o tamanho total da memória livre é de 50 bytes, o que seria suficiente para comportar o novo processo. Entretanto, este espaço livre não é contíguo, não permitindo que o SO, por exemplo, alocasse ambas as partições livres ao novo processo. O não aproveitamento do espaço livre neste caso, se dá pela maneira fragmentada pela qual as alocações anteriores ocorreram. Note que a fragmentação externa pode ocorrer por dois motivos. Em primeiro lugar, ela pode ser consequência de uma política ruim de alocação de partições para processos. Por outro lado, mesmo que a política de alocação de partições seja bem feita, existe a possiblidade do surgimento de fragmentação externa quando processos terminam. Neste caso, buracos são abertos na memória quando o SO desaloca o espaço de endereçamento de um processo em término.

Não é possível corrigir o problema da fragmentação interna no particionamento fixo, já que seria necessário alterar dinamicamente os tamanhos das partições. Uma maneira de mitigar o problema é sempre alocando as menores partições disponíveis para os novos processos. Obviamente, a partição alocada precisa ser grande o suficiente para comportar o espaço de endereçamento do processo. O problema da fragmentação externa, no entanto, pode ser resolvido através da aplicação de um algoritmo de desfragmentação. O objetivo destes algoritmos é aglomerar as partições já alocadas em uma dada região da memória, fazendo com que as partições livres fiquem contíguas. A execução de tais algoritmos, entretanto, é muito custosa para o sistema, não só pelo algoritmo em si (decisão de onde colocar cada partição já alocada), mas principalmente pela necessidade de mover todo o espaço de endereçamento de um processo em execução para outra região da memória física. Na prática, portanto, é rara a aplicação deste tipo de solução. Um método mais flexível de alocação adotado pelos sistemas operacionais é o particionamento variável. Ao contrário do particionamento fixo, no qual o sistema pré-define as partições da memória principal, no caso do particionamento variável partições da memória principal são definidas dinamicamente de acordo com o tamanho dos espaços de endereçamento dos processos que se deseja criar. O SO mantém uma lista de blocos de memória principal disponíveis, inicialmente contendo um único nó (pois toda a memória principal está livre). Cada nó desta lista contém a informação da posição inicial do bloco e do seu tamanho. Quando o SO precisa alocar um novo espaço de endereçamento, ele percorre a lista procurando por um bloco que seja suficientemente grande para comportá-lo. Uma vez encontrado o bloco, o SO reserva uma parte dele (geralmente o início) para o novo espaço de endereçamento e atualiza a informação no nó da lista. Quando um processo é encerrado, seu espaço de endereçamento é desalocado através da inserção de um novo nó na lista de espaços livres representando o bloco de memória que não está mais em uso. Se o novo bloco inserido na lista for adjacente a um bloco já existente, estes serão concatenados em um único bloco. Este mecanismo garante que um processo receba uma partição do tamanho exato necessário, acabando com a possibilidade de fragmentação interna. Por outro lado, a fragmentação externa passa a ser um problema ainda maior que no particionamento fixo. Isso porque no caso do particionamento variável existe a tendência de pequenos blocos de memória ficarem ociosos, já que blocos grandes são divididos em novas alocações. Em sistemas operacionais que adotam este mecanismo de alocação, não é incomum a perda de mais de 30% do espaço disponível da memória. Por este motivo, os sistemas que adotam o particionamento variável dedicam especial atenção ao processo de escolha de um bloco livre para alocação de um novo espaço de endereçamento. Existem 4 algoritmos adotados comumente na literatura:

First-Fit: SO varre a lista de blocos livres e escolhe o primeiro bloco grande o suficiente para conter o novo espaço de endereçamento. Best-Fit: SO varre a lista de blocos livres inteira e escolhe o menor bloco que seja grande o suficiente para conter o novo espaço de endereçamento. Worst-Fit: SO varre a lista de blocos livres inteira e escolhe o maior bloco existente. Circular-Fit: igual ao First-Fit, mas varredura da lista sempre começa do ponto na qual a última havia parado. A vantagem do First-Fit é a simplicidade de implementação. Há pouco overhead no seu processamento. O Best-Fit minimiza inicialmente a fragmentação externa, já que processos são alocados no bloco que tem o tamanho mais próximo do necessário. Por outro lado, este algoritmo resulta em vários blocos pequenos demais para serem alocados por outros processos. A ideia do Worst-Fit é justamente o contrário: escolher o maior bloco livre para que o espaço que sobra da alocação ainda seja suficiente para alocar algum processo. O Circular- Fit, assim como o First-Fit, é bastante simples. A vantagem do Circular-Fit é que ele tende a espalhar os espaços alocados por toda a extensão da memória. Alguns sistemas adotam ainda uma pequena variação da alocação variável na qual é aplicado o conceito de Alinhamento. Ao invés de alocar exatamente o espaço necessário para o novo processo, neste caso é alocada uma quantidade de memória que seja múltipla de um tamanho específico de bloco definido pelo sistema. Por exemplo, suponha que o sistema use blocos de 32 bytes. Caso seja necessária a alocação de um espaço de endereçamento de 100 bytes, o sistema criará uma nova partição de 128 bytes. Neste caso, é possível haver fragmentação interna. Porém, como o tamanho de bloco é, em geral, pequeno, esta fragmentação tende a ser baixa. A utilização do alinhamento tem duas vantagens. Em primeiro lugar, alguns processadores exigem que certos tipos de dados estejam alinhados em memória. Por exemplo, um valor inteiro de dois bytes precisa ser guardado na memória começando em um endereço par (e.g., o valor pode ser armazenado nas posições 4 e 5, mas não em 5 e 6). Neste caso, se o sistema utiliza alinhamento com blocos de 2 bytes (ou qualquer valor par), é simples para os programadores atenderem a esta exigência do processador. Caso não houvesse alinhamento, seria possível que o endereço inicial do espaço de endereçamento de um processo fosse ímpar, fazendo com que, em termos de endereçamento lógico, o programa precisasse armazenar seus inteiros de dois bytes a partir de endereços ímpares. A outra vantagem do alinhamento é a redução no número de bits necessários para endereçar os blocos de memória livre armazenados na lista do SO. Por exemplo, utilizando blocos de 2 bytes, é necessário 1 bit a menos de endereço.