Vous êtes sur la page 1sur 53

Sistemas Operacionais IV - Gerncia de Memria

Prof. Carlos Alberto Maziero PPGIA CCET PUCPR http://www.ppgia.pucpr.br/maziero 8 de agosto de 2007

Resumo A memria principal um componente fundamental em qualquer sistema de computao. Ela constitui o espao de trabalho do sistema, no qual so mantidos os processos, threads, bibliotecas compartilhadas e canais de comunicao, alm do prprio ncleo do sistema operacional, com seu cdigo e suas estruturas de dados. O hardware de memria pode ser bastante complexo, envolvendo diversas estruturas, como caches, unidade de gerncia, etc, o que exige um esforo de gerncia signicativo por parte do sistema operacional. Uma gerncia adequada da memria essencial para o bom desempenho de um computador. Neste captulo sero estudados os elementos de hardware que compe a memria de um sistema computacional e os mecanismos implementados ou controlados pelo sistema operacional para a gerncia da memria.

1 Estruturas de memria
Existem diversos tipos de memria em um sistema de computao, cada um com suas prprias caractersticas e particularidades, mas todos com um mesmo objetivo: armazenar dados. Observando um sistema computacional tpico, pode-se identicar vrios locais onde dados so armazenados: os registradores e o cache interno do processador (denominado cache L1), o cache externo da placa-me (cache L2) e a memria principal (RAM). Alm disso, discos rgidos e unidades de armazenamento externas (pendrives,
Copyright (c) 2007 Carlos Alberto Maziero. garantida a permisso para copiar, distribuir e/ou modicar este documento sob os termos da Licena de Documentao Livre GNU (GNU Free Documentation License), Verso 1.2 ou qualquer verso posterior publicada pela Free Software Foundation. A licena est disponvel em http://www.gnu.org/licenses/gfdl.txt.

CD-ROMs, DVD-ROMs, tas magnticas, etc) tambm podem ser considerados memria em um um sentido mais amplo, pois tambm tm como funo o armazenamento de dados. Esses componentes de hardware so construdos usando diversas tecnologias e por isso tm caractersticas distintas, como a capacidade de armazenamento, a velocidade de operao, o consumo de energia e o custo por byte armazenado. Essas caractersticas permitem denir uma hierarquia de memria, representada na forma de uma pirmide (gura 1).

Figura 1: Hierarquia de memria. Nessa pirmide, observa-se que memrias mais rpidas, como os registradores da CPU e os caches, so menores (tm menor capacidade de armazenamento), mais caras e consomem mais energia que memrias mais lentas, como a memria principal (RAM) e os discos rgidos. Alm disso, as memrias mais rpidas so volteis, ou seja, perdem seu contedo ao carem sem energia. Memrias que preservam seu contedo mesmo quando no tiverem energia so denominadas no-volteis. Outra caracterstica importante das memrias a rapidez de seu funcionamento, que pode ser detalhada em duas dimenses: tempo de acesso (ou latncia) e taxa de transferncia. O tempo de acesso caracteriza o tempo necessrio para iniciar uma transferncia de dados de/para um determinado meio de armazenamento. Por sua vez, a taxa de transferncia indica quantos bytes por segundo podem ser lidos/escritos naquele meio, uma vez iniciada a transferncia de dados. Para ilustrar esses dois conceitos complementares, a tabela 1 traz valores de tempo de acesso e taxa de transferncia de alguns meios de armazenamento usuais. Neste captulo sero estudados os mecanismos envolvidos na gerncia da memria principal do computador, que geralmente constituda por um grande espao de me2

Meio Cache L2 Memria RAM Memria ash (NAND) Disco rgido IDE

DVD-ROM

Tempo de acesso 1 ns 60 ns 2 ms 10 ms (tempo necessrio para o deslocamento da cabea de leitura e rotao do disco at o setor desejado) de 100 ms a vrios minutos (caso a gaveta do leitor esteja aberta ou o disco no esteja no leitor)

Taxa de transferncia 1 GB/s (1 ns/byte) 1 GB/s (1 ns/byte) 10 MB/s (100 ns/byte) 80 MB/s (12 ns/byte)

10 MB/s (100 ns/byte)

Tabela 1: Tempos de acesso e taxas de transferncia tpicas [PH05]. mria do tipo RAM (Random Access Memory ou memria de leitura/escrita). Tambm ser estudado o uso do disco rgido como extenso da memria principal, atravs de mecanismos de memria virtual (seo 7). A gerncia dos espaos de armazenamento em disco rgido abordada no captulo ??. Os mecanismos de gerncia dos caches L1 e L2 geralmente so implementados em hardware e so independentes do sistema operacional. Detalhes sobre seu funcionamento podem ser obtidos em [PH05].

2 Endereos, variveis e funes


Em um computador, o processador acessa endereos de memria para buscar as instrues a executar e seus operandos; acessa tambm outros endereos de memria para escrever os resultados do processamento das instrues. Esses endereos podem ser denidos explicitamente pelo programador ao escrever um programa em linguagem de mquina, como mostra o exemplo a seguir:
1

ORG 10h mov cx, 10h mov bx, 0 volta : mov [bx], 0 inc bx dec cx jnz volta

; reserva os primeiros 16 bytes ; inicializa cx ; inicializa bx para o endereo zero ; ; ; ; move zero para endereo apontado por bx incrementa bx de 1 unidade decrementa cx de 1 unidade retorna a "volta", se cx > 0

Todavia, ao escrever um programa usando uma linguagem de alto nvel, como C, C++ ou Java, o programador no dene endereos de dados ou de cdigo, mas usa apenas referncias abstratas, como variveis, funes, parmetros e valores de retorno. No h necessidade do programador denir ou manipular endereos de memria explicitamente. O trecho de cdigo em C abaixo ilustra esse conceito; nele, no so denidos

ou manipulados endereos de memria, mas apenas smbolos para referenciar posies de dados (i e soma) ou de trechos de cdigo (main, printf e exit).
#include <stdio.h>
2

int main () { int i , soma = 0 ;


7

12

for ( i =0; i < 5; i ++) { soma += i ; printf ( "i vale %d e soma vale %d\n", i, soma) ; } exit (0) ; }

Quando esse programa em linguagem C for compilado, ligado a bibliotecas, carregado na memria e executado pelo processador, cada varivel ou trecho de cdigo denidos pelo programador dever ocupar um espao especco e exclusivo na memria, com seus prprios endereos. Assim, os endereos das variveis e trechos de cdigo usados por um programa devem ser denidos em algum momento entre a escrita do cdigo e sua execuo pelo processador, que pode ser: Durante a edio : o programador escolhe a posio de cada uma das variveis e do cdigo do programa na memria. Esta abordagem normalmente s usada na programao de sistemas embarcados simples, programados diretamente em linguagem de mquina. Durante a compilao : o compilador escolhe as posies das variveis na memria. Para isso, todos os cdigos-fonte que fazem parte do programa devem ser conhecidos no momento da compilao, para evitar conitos de endereos entre variveis. Uma outra tcnica bastante usada a gerao de cdigo independente de posio (PIC - Position-Independent Code), no qual todas as referncias a variveis so feitas usando endereos relativos (como 3.471 bytes aps o incio do mdulo, ou 15 bytes aps o program counter, por exemplo). Durante a ligao : o compilador gera smbolos que representam as variveis mas no dene seus endereos nais, gerando um arquivo que contm as instrues em linguagem de mquina e as denies das variveis utilizadas, denominado arquivo objeto1 . Os arquivos com extenso .o em UNIX ou .obj em Windows so
Arquivos-objeto so formatos de arquivo projetados para conter cdigo binrio e dados provenientes de uma compilao de cdigo-fonte. Existem diversos formatos de arquivos-objeto; os mais simples, como os arquivos .com do DOS, apenas denem uma seqncia de bytes a carregar em uma posio xa da memria; os mais complexos, como os formatos UNIX ELF (Executable and Library Format) e Microsoft
1

exemplos de arquivos-objeto obtidos da compilao de arquivos em C ou outra linguagem de alto nvel. O ligador (ou link-editor) ento l todos os arquivos-objeto e as bibliotecas e gera um arquivo-objeto executvel, no qual os endereos de todas as variveis esto corretamente denidos. Durante a carga : tambm possvel denir os endereos de variveis e de funes durante a carga do cdigo em memria para o lanamento de um novo processo. Nesse caso, um carregador (loader) responsvel por carregar o cdigo do processo na memria e denir os endereos de memria que devem ser utilizados. O carregador pode ser parte do ncleo do sistema operacional ou uma biblioteca ligada ao executvel, ou ambos. Esse mecanismo normalmente usado na carga das bibliotecas dinmicas (DLL - Dynamic Linking Libraries). Durante a execuo : os endereos emitidos pelo processador durante a execuo do processo so analisados e convertidos nos endereos efetivos a serem acessados na memria real. Por exigir a anlise e a converso de cada endereo gerado pelo processador, este mtodo s vivel com o uso de hardware dedicado para esse tratamento. Esta a abordagem usada na maioria dos sistemas computacionais atuais (como os computadores pessoais), e ser descrita nas prximas sees. A gura 2 ilustra os diferentes momentos da vida de um processo em que pode ocorrer a resoluo dos endereos de variveis e de cdigo.

2.1 Endereos lgicos e fsicos


Ao executar uma seqncia de instrues, o processador escreve endereos no barramento de endereos do computador, que servem para buscar instrues e operandos, mas tambm para ler e escrever valores em posies de memria e portas de entrada/sada. Os endereos de memria gerados pelo processador medida em que executa algum cdigo so chamados de endereos lgicos, porque correspondem lgica do programa, mas no so necessariamente iguais aos endereos reais das instrues e variveis na memria real do computador, que so chamados de endereos fsicos. Os endereos lgicos emitidos pelo processador so interceptados por um hardware especial denominado Unidade de Gerncia de Memria (MMU - Memory Management Unit), que pode fazer parte do prprio processador (como ocorre nos sistemas atuais) ou constituir um dispositivo separado (como ocorria na mquinas mais antigas). A MMU faz a anlise dos endereos lgicos emitidos pelo processador e determina os endereos fsicos correspondentes na memria da mquina, permitindo ento seu acesso pelo processador. Caso o acesso a um determinado endereo solicitado pelo processador no seja possvel, a MMU gera uma interrupo de hardware para noticar o processador sobre a tentativa de acesso indevido. O funcionamento bsico da MMU est ilustrado na gura 3.
PE (Portable Executable Format), permitem denir sees internas, tabelas de relocao, informao de depurao, etc [Lev00].

Figura 2: Momentos de atribuio de endereos. A proteo de memria entre processos essencial para a segurana e estabilidade dos sistemas mais complexos, nos quais centenas ou milhares de processos podem estar na memria simultaneamente. A MMU pode ser rapidamente ajustada para mudar a forma de converso entre endereos lgicos e fsicos, o que permite implementar uma rea de memria exclusiva para cada processo do sistema. Assim, a cada troca de contexto entre processos, as regras de converso da MMU devem ser ajustadas para somente permitir o acesso rea de memria denida para cada novo processo corrente.

2.2 Modelo de memria dos processos


Cada processo visto pelo sistema operacional como uma cpsula isolada, ou seja, uma rea de memria exclusiva que s ele e o ncleo do sistema podem acessar. Essa rea de memria contm todas as informaes necessrias execuo do processo, divididas nas seguintes sees:

Figura 3: Funcionamento bsico de uma MMU. TEXT : contm o cdigo a ser executado pelo processo, gerado durante a compilao e a ligao com as bibliotecas. Esta rea tem tamanho xo, calculado durante a compilao, e normalmente s deve estar acessvel para leitura e execuo. DATA : esta rea contm os dados estticos usados pelo programa, ou seja, suas variveis globais e as variveis locais estticas (na linguagem C, so as variveis denidas como static dentro das funes). Como o tamanho dessas variveis pode ser determinado durante a compilao, esta rea tem tamanho xo; deve estar acessvel para leituras e escritas, mas no para execuo. HEAP : rea usada para armazenar dados atravs de alocao dinmica, usando operadores como malloc e free ou similares. Esta rea tem tamanho varivel, podendo aumentar/diminuir conforme as alocaes/liberaes de memria feitas pelo processo. Ao longo do uso, esta rea pode se tornar fragmentada, ou seja, pode conter lacunas entre os blocos de memria alocados. So necessrios ento algoritmos de alocao que minimizem sua fragmentao. STACK : rea usada para manter a pilha de execuo do processo, ou seja, a estrutura responsvel por gerenciar o uxo de execuo nas chamadas de funo e tambm para armazenar os parmetros, variveis locais e o valor de retorno das funes. Geralmente a pilha cresce para baixo, ou seja, inicia em endereos elevados e cresce em direo aos endereos menores da memria. No caso de programas com mltiplas threads, esta rea contm somente a pilha do programa principal. Como threads podem ser criadas e destrudas dinamicamente, a pilha de cada thread mantida em uma rea prpria, geralmente alocada no heap. A gura 4 apresenta a organizao da memria de um processo. Nela, observa-se que as duas reas de tamanho varivel (stack e heap) esto dispostas em posies opostas 7

e vizinhas memria livre (no alocada). Dessa forma, a memria livre disponvel ao processo pode ser aproveitada da melhor forma possvel, tanto pelo heap quanto pelo stack, ou por ambos.

Figura 4: Organizao da memria de um processo.

3 Estratgias de alocao
Em um sistema mono-processo, em que apenas um processo por vez carregado em memria para execuo, a alocao da memria principal um problema simples de resolver: basta reservar uma rea de memria para o ncleo do sistema operacional e alocar o processo na memria restante, respeitando a disposio de suas reas internas, conforme apresentado na gura 4. A memria reservada para o ncleo do sistema operacional pode estar no incio ou no nal da rea de memria fsica disponvel. Como a maioria das arquiteturas de hardware dene o vetor de interrupes (vide seo ??) nos endereos iniciais da memria (tambm chamados endereos baixos), geralmente o ncleo tambm colocado na parte inicial da memria. Assim, toda a memria disponvel aps o ncleo do sistema destinada aos processos no nvel do usurio (user-level). A gura 5 ilustra essa organizao da memria.

Figura 5: Organizao da memria do sistema. Nos sistemas multi-processos, vrios processos podem ser carregados na memria para execuo simultnea. Nesse caso, o espao de memria destinado aos processos 8

deve ser dividido entre eles usando uma estratgia que permita ecincia e exibilidade de uso. As principais estratgias de alocao da memria fsica sero estudadas nas prximas sees.

3.1 Parties xas


A forma mais simples de alocao de memria consiste em dividir a memria destinada aos processos em N parties xas, de tamanhos iguais ou distintos. Em cada partio pode ser carregado um processo. Nesse esquema, a traduo entre os endereos lgicos vistos pelos processos e os endereos fsicos feita atravs de um simples registrador de relocao, cujo valor somado ao endereo lgico gerado pelo processador, a m de obter o endereo fsico correspondente. Endereos lgicos maiores que o tamanho da partio em uso so simplesmente rejeitados pela MMU. O exemplo da gura 6 ilustra essa estratgia. No exemplo, o processo da partio 3 est executando e deseja acessar o endereo lgico 14.257. A MMU recebe esse endereo e o soma ao valor do registrador de relocao (110.000) para obter o endereo fsico 124.257, que ento acessado. Deve-se observar que o valor contido no registrador de relocao o endereo de incio da partio ativa (partio 3); esse registrador deve ser atualizado a cada troca de processo ativo.

Figura 6: Alocao em parties xas. Essa abordagem extremamente simples, todavia sua simplicidade no compensa suas vrias desvantagens: Os processos podem ter tamanhos distintos dos tamanhos das parties, o que implica em reas de memria sem uso no nal de cada partio. 9

O nmero mximo de processos na memria limitado ao nmero de parties, mesmo que os processos sejam pequenos. Processos maiores que o tamanho da maior partio no podero ser carregados na memria, mesmo se todas as parties estiverem livres. Por essas razes, esta estratgia de alocao pouco usada atualmente; ela foi muito usada no OS/360, um sistema operacional da IBM usado nas dcadas de 1960-70 [Tan03].

3.2 Alocao contgua


A estratgia anterior, com parties xas, pode ser tornar bem mais exvel caso o tamanho de cada partio possa ser ajustado para se adequar demanda especca de cada processo. Nesse caso, a MMU deve ser projetada para trabalhar com dois registradores prprios: um registrador base, que dene o endereo inicial da partio ativa, e um registrador limite, que dene o tamanho em bytes dessa partio. O algoritmo de traduo de endereos lgicos em fsicos bem simples: cada endereo lgico gerado pelo processo em execuo comparado ao valor do registrador limite; caso seja maior ou igual a este, uma interrupo gerada pela MMU de volta para o processador, indicando um endereo invlido. Caso contrrio, o endereo lgico somado ao valor do registrador base, para a obteno do endereo fsico correspondente. A gura 7 apresenta uma viso geral dessa estratgia. Na gura, o processo p3 tenta acessar o endereo lgico 14.257. Os valores dos registradores base e limite da MMU devem ser ajustados pelo despachante (dispatcher) a cada troca de contexto, ou seja, cada vez que o processo ativo substitudo. Os valores de base e limite para cada processo do sistema devem estar armazenados no respectivo TCB (Task Control Block, vide seo ??). Obviamente, quando o ncleo estiver executando, os valores de base e limite devem ser ajustados respectivamente para 0 e , para permitir o acesso direto a toda a memria fsica. Alm de traduzir endereos lgicos nos endereos fsicos correspondentes, a ao da MMU propicia a proteo de memria entre os processos: quando um processo pi estiver executando, ele s pode acessar endereos lgicos no intervalo [0, limite(pi ) 1], que correspondem a endereos fsicos no intervalo [base(pi ), base(pi ) + limite(pi ) 1]. Ao detectar uma tentativa de acesso a um endereo fora desse intervalo, a MMU ir gerar uma solicitao de interrupo (IRQ - Interrupt ReQuest, vide seo ??) para o processador, indicando o endereo invlido. Ao receber a interrupo, o processador interrompe o uxo de execuo do processo pi , retorna ao ncleo e ativa a rotina de tratamento da interrupo, que poder abortar o processo ou tomar outras providncias. A maior vantagem da estratgia de alocao contgua sua simplicidade: por depender apenas de dois registradores e de uma lgica simples para a traduo de endereos, pode ser implementada em hardware de baixo custo, ou mesmo incorporada a processadores mais simples. Todavia, uma estratgia pouco exvel e est muito sujeita fragmentao externa, conforme ser discutido na seo 4. 10

Figura 7: Alocao contgua de memria.

3.3 Alocao por segmentos


A alocao por segmentos, ou alocao segmentada, uma extenso da alocao contgua, na qual o espao de memria de um processo fracionado em reas, ou segmentos, que podem ser alocados separadamente na memria fsica. Alm das quatro reas funcionais bsicas da memria do processo discutidas na seo 2.2 (text, data, stack e heap), tambm podem ser denidos segmentos para tens especcos, como bibliotecas compartilhadas, vetores, matrizes, pilhas de threads, buers de entrada/sada, etc. Ao separar o processo em segmentos, o espao de memria de cada processo no mais visto como uma seqncia linear de endereos lgicos, mas como uma coleo de segmentos de tamanhos diversos e polticas de acesso distintas. A gura 8 apresenta a viso lgica da memria de um processo e a sua forma de mapeamento para a memria fsica. No modelo de memria alocada por segmentos, os endereos gerados pelos processos devem indicar as posies de memria e os segmentos onde elas se encontram. Em outras palavras, este modelo usa endereos lgicos bidimensionais, compostos por pares [segmento:oset], onde segmento indica o nmero do segmento desejado e oset indica a posio desejada dentro do segmento. Os valores de oset variam de 0 (zero) ao tamanho do segmento. A gura 9 mostra alguns exemplos de endereos lgicos usando alocao por segmentos. Na alocao de memria por segmentos, a forma de traduo de endereos lgicos em fsicos similar da alocao contgua. Contudo, como os segmentos podem ter 11

Figura 8: Alocao de memria por segmentos.

Figura 9: Endereos lgicos em segmentos. tamanhos distintos e ser alocados separadamente na memria fsica, cada segmento ter seus prprios valores de base e limite, o que leva necessidade de denir uma tabela de segmentos para cada processo do sistema. Essa tabela contm os valores de base e limite para cada segmento usado pelo processo, alm de ags com informaes sobre cada segmento, como permisses de acesso, etc (vide seo 3.4.1). A gura 10 apresenta os principais elementos envolvidos na traduo de endereos lgicos em fsicos usando memria alocada por segmentos. Cabe ao compilador colocar os diversos trecho do cdigo-fonte de cada programa em segmentos separados. Ele pode, por exemplo, colocar cada vetor ou matriz em um segmento prprio. Dessa forma, erros freqentes como acessos a ndices alm do tamanho de um vetor iro gerar endereos fora do respectivo segmento, que sero detectados pelo hardware de gerncia de memria e noticados ao sistema operacional.

12

Figura 10: Traduo de endereos em memria alocada por segmentos. A implementao da tabela de segmentos varia conforme a arquitetura de hardware considerada. Caso o nmero de segmentos usados por cada processo seja pequeno, a tabela pode residir em registradores especializados do processador. Por outro lado, caso o nmero de segmentos por processo seja elevado, ser necessrio alocar as tabelas na memria RAM. O processador 80.386 usa duas tabelas em RAM: a LDT (Local Descriptor Table), que dene os segmentos locais (exclusivos) de cada processo, e a GDT (Global Descriptor Table), usada para descrever segmentos globais que podem ser compartilhados entre processos distintos (vide seo 5). Cada uma dessas duas tabelas comporta at 8.192 segmentos. As tabelas em uso pelo processo em execuo so indicadas por registradores especcos do processador. A cada troca de contexto, os registradores que indicam a tabela de segmentos ativa devem ser atualizados para reetir as reas de memria usadas pelo processo que ser ativado. Para cada endereo de memria acessado pelo processo em execuo, necessrio acessar a tabela de segmentos para obter os valores de base e limite correspondentes ao endereo lgico acessado. Todavia, como as tabelas de segmentos normalmente se encontram na memria principal, esses acessos tm um custo signicativo: considerando 13

um sistema de 32 bits, para cada acesso memria seriam necessrias pelo menos duas leituras adicionais na memria, para ler os valores de base e limite, o que tornaria cada acesso memria trs vezes mais lento. Para contornar esse problema, os processadores denem alguns registradores de segmentos, que permitem armazenar os valores de base e limite dos segmentos mais usados pelo processo ativo. Assim, caso o nmero de segmentos em uso simultneo seja pequeno, no h necessidade de consultar a tabela de segmentos com excessiva freqncia, o que mantm o desempenho de acesso memria em um nvel satisfatrio. O processador 80.386 dene os seguintes registradores de segmentos: CS: Code Segment, indica o segmento onde se encontra o cdigo atualmente em execuo; este valor automaticamente ajustado no caso de chamadas de funes de bibliotecas, chamadas de sistema, interrupes ou operaes similares. SS: Stack Segment, indica o segmento onde se encontra a pilha em uso pelo processo atual; caso o processo tenha vrias threads, este registrador deve ser ajustado a cada troca de contexto entre threads. DS, ES, FS e GS: Data Segments, indicam quatro segmentos com dados usados pelo processo atual, que podem conter variveis globais, vetores ou reas alocadas dinamicamente. Esses registradores podem ser ajustados em caso de necessidade, para acessar outros segmentos de dados. O contedo desses registradores preservado no TCB (Task Control Block) de cada processo a cada troca de contexto, tornando o acesso memria bastante eciente caso poucos segmentos sejam usados simultaneamente. Portanto, o compilador tem uma grande responsabilidade na gerao de cdigo executvel: minimizar o nmero de segmentos necessrios execuo do processo a cada instante, para no prejudicar o desempenho de acesso memria. Exemplos de processadores que utilizam a alocao por segmentos incluem o 80.386 e seus sucessores (486, Pentium, Athlon e processadores correlatos).

3.4 Alocao paginada


Conforme visto na seo anterior, a alocao de memria por segmentos exige o uso de endereos bidimensionais na forma [segmento:oset], o que pouco intuitivo para o programador e torna mais complexa a construo de compiladores. Alm disso, uma forma de alocao bastante suscetvel fragmentao externa, conforme ser discutido na seo 4. Essas decincias levaram os projetistas de hardware a desenvolver outras tcnicas para a alocao da memria principal. Na alocao de memria por pginas, ou alocao paginada, o espao de endereamento lgico dos processos mantido linear e unidimensional (ao contrrio da alocao por segmentos, que usa endereos bidimensionais). Internamente, e de forma transparente para os processos, o espao de endereos lgicos dividido em pequenos blocos de 14

mesmo tamanho, denominados pginas. Nas arquiteturas atuais, as pginas geralmente tm 4 Kbytes (4.096 bytes), mas podem ser encontradas arquiteturas com pginas de outros tamanhos. O espao de memria fsica destinado aos processos tambm dividido em blocos de mesmo tamanho que as pginas, denominados quadros (do ingls frames). A alocao dos processos na memria fsica ento feita simplesmente indicando a que quadro cada pgina de cada processo corresponde, conforme ilustra a gura 11. importante observar que as pginas de um processo podem estar em qualquer posio da memria fsica disponvel aos processos, ou seja, podem estar associados a quaisquer quadros, o que permite uma grande exibilidade de alocao. Alm disso, as pginas no usadas pelo processo no precisam estar mapeadas, o que proporciona ecincia no uso da memria fsica.

Figura 11: Alocao de memria por pginas. A associao entre as pginas de um processo e os quadros correspondentes na memria fsica feita atravs de uma tabela de pginas (page table), na qual cada entrada corresponde a uma pgina e contm o nmero do quadro correspondente. Cada processo possui sua prpria tabela de pginas; a tabela de pginas ativa, que corresponde ao processo em execuo no momento, referenciada por um registrador do processador denominado PTBR Page Table Base Register. A cada troca de contexto, esse registrador deve ser atualizado com o endereo da tabela de pginas do novo processo ativo. A diviso do espao de endereamento lgico de um processo em pginas pode ser feita de forma muito simples: como as pginas sempre tm 2n bytes de tamanho (por exemplo, 212 bytes para pginas de 4 Kbytes) os n bytes menos signicativos de cada endereo lgico podem ser considerados como sendo a posio daquele endereo dentro da pgina (ou oset), enquanto os bytes restantes (mais signicativos) so usados para 15

denir o nmero da pgina. Por exemplo, o processador Intel 80.386 usa endereos lgicos de 32 bits e pginas com 4 Kbytes; um endereo lgico de 32 bits decomposto em um oset de 12 bits, que representa uma posio entre 0 e 4.095 dentro da pgina, e um nmero de pgina com 20 bits. Dessa forma, podem ser endereadas 220 pginas com 212 bytes cada (1.048.576 pginas com 4.096 bytes cada). Eis um exemplo de decomposio de um endereo lgico nesse sistema: 00005E9AH 0000 0001 1000 0000 0101 1110 1001 10102 0000 0001 1000 0000 01012 1110 1001 10102
20 bits 00005H E9AH 12

bits

pgina oset pgina 00005H e oset E9AH Para traduzir um endereo lgico no endereo fsico correspondente, a MMU precisa decompor o endereo em nmero de pgina e oset, obter o nmero do quadro correspondente pgina acessada e construir o endereo fsico, compondo o nmero do quadro com o oset; como pginas e quadros tm o mesmo tamanho, o valor do oset preservado na converso. Caso a pgina pgina solicitada no esteja mapeada em um quadro da memria fsica, a MMU gera uma interrupo de falta de pgina (page fault) para o processador. Essa interrupo provoca o desvio da execuo para o ncleo do sistema operacional, que deve ento tratar o erro. A gura 12 apresenta os principais elementos que proporcionam a traduo de endereos em um sistema paginado com pginas de 4.096 bytes. 3.4.1 Flags de controle

Como o espao de endereamento lgico de um processo pode ser extremamente grande (por exemplo, o espao de endereos lgicos de cada processo em uma arquitetura de 32 bits pode ir at 232 bytes), uma parte signicativa das pginas de um processo pode no estar mapeada em quadros de memria fsica. reas de memria no usadas por um processo no precisam estar mapeadas na memria fsica, o que permite um uso mais eciente da memria. Assim, a tabela de pginas de cada processo indica as reas no mapeadas com um ag adequado (vlido/invlido). Cada entrada da tabela de pginas de um processo contm o nmero do quadro correspondente e um conjunto de ags (bits) de controle, com diversas nalidades: presena: indica se a pgina est presente (mapeada) no espao de endereamento daquele processo;

16

Figura 12: Traduo de endereos usando paginao. proteo: bits indicando os direitos de acesso do processo pgina (basicamente leitura, escrita e/ou execuo); referncia: indica se a pgina foi referenciada (acessada) recentemente, sendo ajustado para 1 pelo prprio hardware a cada acesso pgina. Este bit usado pelos algoritmos de memria virtual (apresentados na seo 7); modicao: tambm chamado de dirty bit, ajustado para 1 pelo hardware a cada escrita na pgina, indicando se a pgina foi modicada aps ser carregada na memria; usado pelos algoritmos de memria virtual. Alm destes, podem ser denidos outros bits, indicando a poltica de caching da pgina, se uma pgina de usurio ou de sistema, se a pgina pode ser movida para disco, o tamanho da pgina (no caso de sistema que permitam mais de um tamanho de pgina), etc. O contedo exato de cada entrada da tabela de pginas depende da arquitetura do hardware considerado. 3.4.2 Tabelas multi-nveis

Em uma arquitetura de 32 bits com pginas de 4 Kbytes, cada entrada na tabela de pginas ocupa cerca de 32 bits, ou 4 bytes (20 bits para o nmero de quadro e os 12 bits 17

restantes para ags). Considerando que cada tabela de pginas tem 220 pginas, cada tabela ocupar 4 Mbytes de memria (4 220 bytes) se for armazenada de forma linear na memria. No caso de processos pequenos, com muitas pginas no mapeadas, uma tabela de pginas linear ocupar mais espao na memria que o prprio processo, como mostra a gura 13, o que torna seu uso pouco interessante.

Figura 13: Inviabilidade de tabelas de pgina lineares. Para resolver esse problema, so usadas tabelas de pginas multi-nveis, estruturadas na forma de rvores: uma tabela de pginas de primeiro nvel (ou diretrio de pginas) contm ponteiros para tabelas de pginas de segundo nvel, e assim por diante, at chegar tabela que contm os nmeros dos quadros desejados. Para percorrer essa rvore, o nmero de pgina dividido em duas ou mais partes, que so usadas de forma seqencial, um para cada nvel de tabela, at encontrar o nmero de quadro desejado. O nmero de nveis da tabela depende da arquitetura considerada: os processadores Intel 80.386 usa tabelas com dois nveis, os processadores Sun Sparc e DEC Alpha usam tabelas com 3 nveis; processadores mais recentes, como Intel Itanium, podem usar tabelas com 3 ou 4 nveis. Um exemplo permite explicar melhor esse conceito: considerando uma arquitetura de 32 bits com pginas de 4 Kbytes, 20 bits so usados para acessar a tabela de pginas. Esses 20 bits podem ser divididos em dois grupos de 10 bits que so usados como ndices em uma tabela de pginas com dois nveis: 00005E9AH 0000 0001 1000 0000 0101 1110 1001 10102 0000 0001 102 00 0000 01012 1110 1001 10102 bits 10 bits 0006H 0005H E9AH
10 12

bits

18

p1 0006H , p2 0005H e oset E9AH A traduo de endereos lgicos em fsicos usando uma tabela de pginas estruturada em dois nveis efetuada atravs dos seguintes passos, que so ilustrados na gura 14: 1. o endereo lgico el (0180 5E9AH ) decomposto em um oset de 12 bits o (E9AH ) e dois nmeros de pgina de 10 bits cada: o nmero de pgina de primeiro nvel p1 (006H ) e o nmero de pgina de segundo nvel p2 (005H ); 2. o nmero de pgina p1 usado como ndice na tabela de pgina de primeiro nvel, para encontrar o endereo de uma tabela de pgina de segundo nvel; 3. o nmero de pgina p2 usado como ndice na tabela de pgina de segundo nvel, para encontrar o nmero de quadro q (2FH ) que corresponde a [p1 p2 ]; 4. o nmero de quadro q combinado ao oset o para obter o endereo fsico e f (0002 FE9AH ) correspondente ao endereo lgico solicitado el. Com a estruturao em nveis, a quantidade de memria necessria para armazenar cada tabela de pginas diminui signicativamente, sobretudo no caso de processos pequenos. Considerando o processo apresentado como exemplo na gura 13, ele faria uso de uma tabela de primeiro nvel e somente duas tabelas de segundo nvel (uma para mapear suas primeiras pginas e outra para mapear suas ltimas pginas); todas as demais entradas da tabela de primeiro nvel estariam vazias. Assumindo que cada entrada de tabela ocupa 4 bytes, sero necessrios somente 12 Kbytes para armazenar essas trs tabelas (4 3 210 bytes). Na situao limite onde um processo ocupa toda a memria possvel, seriam necessrias uma tabela de primeiro nvel e 1.024 tabelas de segundo nvel. Essas tabelas ocupariam de 4 (210 210 + 210 ) bytes, ou seja, 0,098% a mais que se a tabela de pginas fosse estruturada em um s nvel (4 220 bytes). 3.4.3 Cache da tabela de pginas

A estruturao das tabelas de pginas em vrios nveis resolve o problema do espao ocupado pelas tabelas de forma muito eciente, mas tem um efeito colateral muito nocivo: aumenta drasticamente o tempo de acesso memria. Como as tabelas de pginas so armazenadas na memria, cada acesso a um endereo de memria implica em mais acessos para percorrer a rvore de tabelas e encontrar o nmero de quadro desejado. Em um sistema com tabelas de dois nveis, cada acesso memria solicitado pelo processador implica em mais dois acessos, para percorrer os dois nveis de tabelas. Com isso, o tempo efetivo de acesso memria se torna trs vezes maior. Quando um processo executa, ele acessa endereos de memria para buscar instrues e operandos e ler/escrever dados. Em cada instante, os acessos tendem a se

19

Figura 14: Tabelas de pgina multi-nveis. concentrar em poucas pginas, que contm o cdigo e as variveis usadas naquele instante2 . Dessa forma, a MMU ter de fazer muitas tradues consecutivas de endereos nas mesmas pginas, que iro resultar nos mesmos quadros de memria fsica. Por isso, consultas recentes tabela de pginas podem ser armazenadas em um cache dentro da prpria MMU, para evitar ter de repeti-las em um curto prazo e assim o tempo de acesso memria fsica. O cache de tabela de pginas na MMU, denominado TLB (Translation Lookaside Buer) ou cache associativo, armazena pares [pgina, quadro] obtidos em consultas recentes s tabelas de pginas do processo ativo. Esse cache funciona como uma tabela de hash: dada um nmero de pgina p em sua entrada, ele apresenta em sua sada o nmero de quadro q correspondente, ou um ag de erro chamado erro de cache (cache miss). Por ser implementado em um hardware especial rpido e caro, geralmente esse cache pequeno: TLBs de processadores tpicos tm entre 16 e 256 entradas. Seu tempo de
2

Esse fenmeno conhecido como localidade de referncias e ser detalhado na seo 6.

20

acesso pequeno: um acerto custa cerca de 1 ciclo de relgio da CPU, enquanto um erro pode custar entre 10 e 30 ciclos. A traduo de endereos lgicos em fsicos usando TLBs se torna mais rpida, mas tambm mais complexa. Ao receber um endereo lgico, a MMU consulta o TLB; caso o nmero do quadro correspondente esteja em cache, ele usado para compor o endereo fsico e o acesso memria efetuado. Caso contrrio, uma busca normal (completa) na tabela de pginas deve ser realizada. O quadro obtido nessa busca usado para compor o endereo fsico e tambm adicionado ao TLB para agilizar as consultas futuras. A gura 15 apresenta os detalhes desse procedimento.

Figura 15: Uso da TLB. fcil perceber que, quanto maior a taxa de acertos do TLB (cache hit ratio), melhor o desempenho dos acessos memria fsica. O tempo mdio de acesso memria pode ento ser determinado pela mdia ponderada entre o tempo de acesso com acerto de cache e o tempo de acesso no caso de erro. Por exemplo, considerando um sistema operando a 2 GHz (relgio de 0,5 ns) com tempo de acesso RAM de 50 ns, tabelas de 21

pginas com 3 nveis e um TLB com custo de acerto de 0,5 ns (um ciclo de relgio), custo de erro de 10 ns (20 ciclos de relgio) e taxa de acerto de 95%, o tempo mdio de acesso memria pode ser estimado como segue: tmdio = 95% 0, 5ns + 5% (10ns + 3 50ns) + 50ns tmdio = 58, 475ns Este resultado indica que o sistema de paginao multi-nvel aumenta em 8,475 ns (16,9%) o tempo de acesso memria, o que razovel considerando-se os benefcios e exibilidade que esse sistema traz. Todavia, esse custo muito dependente da taxa de acerto do TLB: no clculo anterior, caso a taxa de acerto fosse de 90%, o custo adicional seria de 32,9%; caso a taxa subisse a 99%, o custo adicional cairia para 4,2%. Obviamente, quanto mais entradas houverem no TLB, melhor ser sua taxa de acerto. Contudo, trata-se de um hardware caro e volumoso, por isso os processadores atuais geralmente tm TLBs com poucas entradas (geralmente entre 16 e 256 entradas). Por exemplo, o Intel i386 tem um TLB com 64 entradas para pginas de dados e 32 entradas para pginas de cdigo; por sua vez, o Intel Itanium tem 128 entradas para pginas de dados e 96 entradas para pginas de cdigo. O tamanho do TLB um fator que inuencia a sua taxa de acertos, mas h outros fatores importantes a considerar, como a poltica de substituio das entradas do TLB. Essa poltica dene o que ocorre quando h um erro de cache e no h entradas livres no TLB: em alguns processadores, a associao [pgina, quadro] que gerou o erro adicionada ao cache, substituindo a entrada mais antiga; todavia, na maioria dos processadores mais recentes, cada erro de cache provoca uma interrupo, que transfere ao sistema operacional a tarefa de gerenciar o contedo do TLB [PH05]. Outro aspecto que inuencia signicativamente a taxa de acerto do TLB a forma como cada processo acessa a memria. Processos que concentram seus acessos em poucas pginas de cada vez faro um uso eciente desse cache, enquanto processos que acessam muitas pginas distintas em um curto perodo iro gerar freqentes erros de cache, prejudicando seu desempenho no acesso memria. Essa propriedade conhecida como localidade de referncia (seo 6). Finalmente, importante observar que o contedo do TLB reete a tabela de pginas ativa, que indica as pginas de memria pertencentes ao processo em execuo naquele momento. A cada troca de contexto, a tabela de pginas substituda e portanto o cache TLB deve ser esvaziado, pois seu contedo no mais vlido. Isso permite concluir que trocas de contexto muito freqentes prejudicam a ecincia de acesso memria, tornando o sistema mais lento. // em caso de acerto // em caso de erro, consultar as tabelas // acesso ao quadro desejado

22

3.5 Alocao segmentada paginada


Cada uma das principais formas de alocao de memria vistas at agora tem tem suas vantagens: a alocao contgua prima pela simplicidade e rapidez; a alocao por segmentos oferece mltiplos espaos de endereamento para cada processo, oferecendo exibilidade ao programador; a alocao por pginas oferece um grande espao de endereamento linear, enquanto elimina a fragmentao externa. Alguns processadores oferecem mais de uma forma de alocao, deixando aos projetistas do sistema operacional a escolha da forma mais adequada de organizar a memria usada por seus processos. Tambm possvel, em vrios processadores, combinar mais de uma forma de alocao. Por exemplo, os processadores Intel i386 permitem combinar a alocao com segmentos com a alocao por pginas, visando oferecer a exibilidade da alocao por segmentos com a baixa fragmentao da alocao por pginas. Nessa abordagem, os processos vem a memria estruturada em segmentos, conforme indicado na gura 9. O hardware da MMU converte os endereos lgicos na forma [segmento:oset] para endereos lgicos lineares (unidimensionais), usando as tabelas de descritores de segmentos (seo 3.3). Em seguida, esse endereos lgicos lineares so convertidos nos endereos fsicos correspondentes atravs do hardware de paginao (tabelas de pginas e TLB), visando obter o endereo fsico correspondente. Apesar do processador Intel i386 oferece as duas formas de alocao de memria, a maioria dos sistemas operacionais que o suportam no fazem uso de todas as suas possibilidades: os sistemas da famlia Windows NT (2000, XP, Vista) e tambm os da famlia UNIX (Linux, FreeBSD) usam somente a alocao por pginas. O antigo DOS e o Windows 3.* usavam somente a alocao por segmentos. O OS/2 da IBM foi um dos poucos sistemas operacionais comerciais a fazer uso pleno das possibilidades de alocao de memria nessa arquitetura, combinando segmentos e pginas.

4 Fragmentao
Ao longo da vida de um sistema, reas de memria so liberadas por processos que concluem sua execuo e outras reas so alocadas por novos processos, de forma contnua. Com isso, podem surgir reas livres (vazios ou buracos na memria) entre os processos, o que constitui um problema conhecido como fragmentao externa. Esse problema somente afeta as estratgias de alocao que trabalham com blocos de tamanho varivel, como a alocao contgua e a alocao segmentada. Por outro lado, a alocao paginada sempre trabalha com blocos de mesmo tamanho (os quadros e pginas), sendo por isso imune fragmentao externa. A fragmentao externa prejudicial porque limita a capacidade de alocao de memria no sistema. A gura 16 apresenta um sistema com alocao contgua de memria no qual ocorre fragmentao externa. Nessa gura, observa-se que existem 68 MBytes de memria livre em quatro reas separadas (A1 . . . A4 ), mas somente processos 23

com at 28 MBytes podem ser alocados (usando a maior rea livre, A4 ). Alm disso, quanto mais fragmentada estiver a memria livre, maior o esforo necessrio para gerenci-la: as reas livres so mantidas em uma lista encadeada de rea de memria, que manipulada a cada pedido de alocao ou liberao de memria.

Figura 16: Memria com fragmentao externa. Pode-se enfrentar o problema da fragmentao externa de duas formas: minimizando sua ocorrncia, atravs de critrios de escolha das reas a alocar, ou desfragmentando periodicamente a memria do sistema. Para minimizar a ocorrncia de fragmentao externa, cada pedido de alocao deve ser analisado para encontrar a rea de memria livre que melhor o atenda. Essa anlise pode ser feita usando um dos seguintes critrios: Melhor encaixe (best-t) : consiste em escolher a menor rea possvel que possa atender solicitao de alocao. Dessa forma, as reas livres so usadas de forma otimizada, mas eventuais resduos (sobras) podem ser pequenos demais para ter alguma utilidade. Pior encaixe (worst-t) : consiste em escolher sempre a maior rea livre possvel, de forma que os resduos sejam grandes e possam ser usados em outras alocaes. Primeiro encaixe (rst-t) : consiste em escolher a primeira rea livre que satisfaa o pedido de alocao; tem como vantagem a rapidez, sobretudo se a lista de reas livres for muito longa. Prximo encaixe (next-t) : variante da anterior (rst-t) que consiste em percorrer a lista a partir da ltima rea alocada ou liberada, para que o uso das reas livres seja distribudo de forma mais homognea no espao de memria. Diversas pesquisas [JW99] demonstraram que as abordagens mais ecientes so a de melhor encaixe e a de primeiro encaixe, sendo esta ltima bem mais rpida. A gura 17 ilustra essas estratgias. Outra forma de tratar a fragmentao externa consiste em desfragmentar a memria periodicamente. Para tal, as reas de memria usadas pelos processos devem ser movidas na memria de forma a concatenar as reas livres e assim diminuir a fragmentao. Ao mover um processo na memria, suas informaes de alocao (registrador base ou tabela de segmentos) devem ser ajustadas para reetir a nova posio do processo.

24

Figura 17: Estratgias para minimizar a fragmentao externa. Obviamente, nenhum processo pode executar durante a desfragmentao. Portanto, importante que esse procedimento seja executado rapidamente e com pouca freqncia, para no interferir nas atividades normais do sistema. Como as possibilidades de movimentao de processos podem ser muitas, a desfragmentao deve ser tratada como um problema de otimizao combinatria, cuja soluo tima pode ser difcil de calcular. A gura 18 ilustra trs possibilidades de desfragmentao de uma determinada situao de memria; as trs alternativas produzem o mesmo resultado, mas apresentam custos distintos.

Figura 18: Possibilidades de desfragmentao. Alm da fragmentao externa, que afeta as reas livres entre os processos, as estratgias de alocao de memria tambm podem apresentar a fragmentao interna, que pode 25

ocorrer dentro das reas alocadas aos processos. A gura 19 apresenta uma situao onde ocorre esse problema: um novo processo requisita uma rea de memria com 4.900 Kbytes. Todavia, a rea livre disponvel tem 5.000 Kbytes. Se for alocada exatamente a rea solicitada pelo processo (situao A), sobrar um fragmento residual com 100 Kbytes, que praticamente intil para o sistema, pois muito pequeno para acomodar novos processos. Alm disso, essa rea residual de 100 Kbytes deve ser includa na lista de reas livres, o que representa um custo de gerncia desnecessrio. Outra possibilidade consiste em arredondar o tamanho da rea solicitada pelo processo para 5.000 Kbytes, ocupando totalmente aquela rea livre (situao B). Assim, haver uma pequena rea de 100 Kbytes no nal da memria do processo, que provavelmente no ser usada por ele.

Figura 19: Fragmentao interna. A fragmentao interna afeta todas as formas de alocao; as alocaes contgua e segmentada sofrem menos com esse problema, pois o nvel de arredondamento das alocaes pode ser decidido caso a caso. No caso da alocao paginada, essa deciso no possvel, pois as alocaes so feitas em pginas inteiras. Assim, em um sistema com pginas de 4 Kbytes (4.096 bytes), um processo que solicite a alocao de 550.000 bytes (134,277 pginas) receber 552.960 bytes (135 pginas), ou seja, 2.960 bytes a mais que o solicitado. Em mdia, para cada processo haver uma perda de 1/2 pgina de memria por fragmentao interna. Assim, uma forma de minimizar a perda por fragmentao interna seria usar pginas de menor tamanho (2K, 1K, 512 bytes ou ainda menos). Todavia, essa abordagem implica em ter mais pginas por processo, o que geraria tabelas de pginas maiores e com maior custo de gerncia.

26

5 Compartilhamento de memria
A memria RAM um recurso escasso, que deve ser usado de forma eciente. Nos sistemas atuais, comum ter vrias instncias do mesmo programa em execuo, como vrias instncias de editores de texto, de navegadores, etc. Em servidores, essa situao pode ser ainda mais freqente, com centenas ou milhares de instncias do mesmo programa carregadas na memria. Por exemplo, em um servidor de e-mail UNIX, cada cliente que se conecta atravs dos protocolos POP3 ou IMAP ter um processo correspondente no servidor, para atender suas consultas de e-mail (gura 20). Todos esses processos operam com dados distintos (pois atendem a usurios distintos), mas executam o mesmo cdigo. Assim, centenas ou milhares de cpias do mesmo cdigo executvel podero coexistir na memria do sistema.

Figura 20: Vrias instncias do mesmo processo. Conforme visto na seo seo 2.2, a estrutura tpica da memria de um processo contm reas separadas para cdigo, dados, pilha e heap. Normalmente, a rea de cdigo no precisa ter seu contedo modicado durante a execuo, portanto geralmente essa rea protegida contra escritas (read-only). Assim, seria possvel compartilhar essa rea entre todos os processos que executam o mesmo cdigo, economizando memria fsica. O compartilhamento de cdigo entre processos pode ser implementado de forma muito simples e transparente para os processos envolvidos, atravs dos mecanismos de traduo de endereos oferecidos pela MMU, como segmentao e paginao. No caso da segmentao, bastaria fazer com que todos os segmentos de cdigo dos processos apontem para o mesmo segmento da memria fsica, como indica a gura 21. importante observar que o compartilhamento transparente para os processos: cada processo continua a acessar endereos lgicos em seu prprio segmento de cdigo, buscando suas instrues a executar. No caso da paginao, a unidade bsica de compartilhamento a pgina. Assim, as entradas das tabelas de pginas dos processos envolvidos so ajustadas para referenciar 27

Figura 21: Compartilhamento de segmentos. os mesmos quadros de memria fsica. importante observar que, embora referenciem os mesmos endereos fsicos, as pginas compartilhadas podem ter endereos lgicos distintos. A gura 22 ilustra o compartilhamento de pginas entre processos.

Figura 22: Compartilhamento de pginas. O compartilhamento das reas de cdigo permite proporcionar uma grande economia no uso da memria fsica, sobretudo em servidores e sistemas multi-usurios. Por exemplo: consideremos um processador de textos que necessite de 100 MB de memria para executar, dos quais 60 MB so ocupados por cdigo executvel. Sem o compartilhamento de reas de cdigo, 10 instncias do editor consumiriam 1.000 MB de memria; com o compartilhamento, esse consumo cairia para 460 MB (60MB + 10 40MB). O mecanismo de compartilhamento de memria no usado apenas com reas de cdigo; em princpio, toda rea de memria protegida contra escrita pode ser compar28

tilhada, o que poderia incluir reas de dados constantes, como tabelas de constantes, textos de ajuda, etc, proporcionando ainda mais economia de memria. Uma forma mais agressiva de compartilhamento de memria proporcionada pelo mecanismo denominado copiar-ao-escrever (copy-on-write). Nele, todas as reas de memria de um processo (segmentos ou pginas) so passveis de compartilhamento por outros processos, condio que ele ainda no tenha modicado seu contedo. A idia central do mecanismo simples: 1. ao carregar um novo processo em memria, o ncleo protege todas as reas de memria do processo contra escrita (inclusive dados, pilha e heap), usando os ags da tabela de pginas (ou segmentos); 2. quando o processo tentar escrever na memria, a MMU gera uma interrupo (negao de escrita) para o ncleo do sistema operacional; 3. o sistema operacional ajusta ento os ags daquela rea para permitir a escrita e devolve a execuo ao processo, para ele poder continuar; 4. processos subseqentes idnticos ao primeiro, ao serem carregados em memria, sero mapeados sobre as mesmas reas de memria fsica do primeiro processo que ainda estiverem protegidas contra escrita, ou seja, que ainda no foram modicadas por ele; 5. se um dos processos envolvidos tentar escrever em uma dessas reas compartilhadas, a MMU gera uma interrupo para o ncleo; 6. o ncleo ento faz uma cpia separada daquela rea fsica para o processo que deseja escrever nela e desfaz seu compartilhamento, ajustando as tabelas do processo que provocou a interrupo. Os demais processos continuam compartilhando a rea inicial. Todo esse procedimento feito de forma transparente para os processos envolvidos, visando compartilhar ao mximo as reas de memria dos processos e assim otimizar o uso da RAM. Esse mecanismo mais efetivo em sistemas baseados em pginas, porque normalmente as pginas so menores que os segmentos. A maioria dos sistemas operacionais atuais (Linux, Windows, Solaris, FreeBSD, etc) usa esse mecanismo. reas de memria compartilhada tambm podem ser usadas para permitir a comunicao entre processos, conforme apresentado na seo ??. Para tal, dois ou mais processos solicitam ao ncleo o mapeamento de uma rea de memria comum, sobre a qual podem ler e escrever. Como os endereos lgicos acessados nessa rea sero mapeados sobre a mesma rea de memria fsica, o que cada processo escrever nessa rea poder ser lido pelos demais, imediatamente. importante observar que os endereos lgicos em cada processo podero ser distintos, pois isso depende do mapeamento feito pela tabela de pginas (ou de segmentos) de cada processo; apenas os endereos fsicos 29

sero iguais. Portanto, ponteiros (variveis que contm endereos lgicos) armazenados na rea compartilhada tero signicado para o processo que os escreveu, mas no necessariamente para os demais processos que acessam aquela rea. A seo ?? traz informaes mais detalhadas sobre a comunicao entre processos atravs de memria compartilhada.

6 Localidade de referncias
A forma como os processos acessam a memria tem um impacto direto na ecincia dos mecanismos de gerncia de memria, sobretudo o cache de pginas (TLB, seo 3.4.3) e o mecanismo de memria virtual (seo 7). Processos que concentram seus acessos em poucas pginas de cada vez faro um uso eciente desses mecanismos, enquanto processos que acessam muitas pginas distintas em um curto perodo iro gerar freqentes erros de cache (TLB) e faltas de pgina, prejudicando seu desempenho no acesso memria. A propriedade de um processo ou sistema concentrar seus acessos em poucas reas da memria a cada instante chamada localidade de referncias [Den05]. Existem ao menos trs formas de localidade de referncias: Localidade temporal : um recurso usado h pouco tempo ser provavelmente usado novamente em um futuro prximo (esta propriedade usada pelo algoritmo LRU); Localidade espacial : um recurso ser mais provavelmente acessado se outro recurso prximo a ele j foi acessado ( a propriedade vericada na primeira execuo); Localidade sequencial : um caso particular da localidade espacial, no qual h uma predominncia de acesso sequencial aos recursos (esta propriedade til na otimizao de sistemas de arquivos). Como exemplo prtico da importncia da localidade de referncias, considere um programa para o preenchimento de uma matriz de 4.096 4.096 bytes, onde cada linha da matriz est alocada em uma pgina distinta (considerando pginas de 4.096 bytes). O trecho de cdigo a seguir implementa essa operao, percorrendo a matriz linha por linha:
2

unsigned char buer[4096][4096] ; int i , j ; int main () { for ( i =0; i <4096; i ++) // percorre as linhas do buer for ( j =0; j <4096; j ++) // percorre as colunas do buer buer[ i ][ j ]= ( i +j) % 256 ; }

30

Outra implementao possvel seria percorrer a matriz coluna por coluna, conforme o cdigo a seguir:
1

unsigned char buer[4096][4096] ; int i , j ; int main () { for ( j =0; j <4096; j ++) // percorre as colunas do buer for ( i =0; i <4096; i ++) // percorre as linhas do buer buer[ i ][ j ]= ( i +j) % 256 ; }

Embora percorram a matriz de forma distinta, os dois programas geram o mesmo resultado e so conceitualmente equivalentes (a gura 23 mostra o padro de acesso memria dos dois programas). Entretanto, eles no tm o mesmo desempenho. A primeira implementao (percurso linha por linha) usa de forma eciente o cache da tabela de pginas, porque s gera um erro de cache a cada nova linha acessada. Por outro lado, a implementao com percurso por colunas gera um erro de cache TLB a cada clula acessada, pois o cache TLB no tem tamanho suciente para armazenar as 4.096 entradas referentes s pginas usadas pela matriz. A diferena de desempenho entre as duas implementaes pode ser grande: em processadores Intel e AMD, verses 32 e 64 bits, o primeiro cdigo executa cerca de 10 vezes mais rapidamente que o segundo! Alm disso, caso o sistema no tenha memria suciente para manter as 4.096 pginas em memria, o mecanismo de memria virtual ser ativado, fazendo com que a diferena de desempenho seja muito maior.

Figura 23: Comportamento dos programas no acesso memria.

31

A diferenca de comportamento das duas execues pode ser observada na gura 24, que mostra a distribuio dos endereos de memria acessados pelos dois cdigos3 . Nos grcos, percebe-se claramente que a primeira implementao tem uma localidade de referncias muito mais forte que a segunda: enquanto a primeira execuo usa em mdia 5 pginas distintas em cada 100.000 acessos memria, na segunda execuo essa mdia sobe para 3.031 pginas distintas.

Figura 24: Localidade de referncias nas duas execues. A gura 25 traz outro exemplo de boa localidade de referncias. Ela mostra as pginas acessadas durante uma execuo do visualizador grco gThumb, ao abrir um arquivo de imagem. O grco da esquerda d uma viso geral da distribuio dos acessos na memria, enquanto o grco da direita detalha os acessos da parte inferior, que corresponde s reas de cdigo, dados e heap do processo.

Figura 25: Distribuio dos acessos memria do programa gThumb.


Como a execuo total de cada cdigo gera mais de 500 milhes de referncias memria, foi feita uma amostragem da execuo para construir os grcos.
3

32

A localidade de referncia de uma implementao depende de um conjunto de fatores, que incluem: As estruturas de dados usadas pelo programa: estruturas como vetores e matrizes tm seus elementos alocados de forma contgua na memria, o que leva a uma localidade de referncias maior que estruturas mais dispersas, como listas encadeadas e rvores; Os algoritmos usados pelo programa: o comportamento do programa no acesso memria denido pelos algoritmos que ele implementa; A qualidade do compilador: cabe ao compilador analisar quais variveis e trechos de cdigo so usadas com freqncia juntos e coloc-los nas mesmas pginas de memria, para aumentar a localidade de referncias do cdigo gerado. A localidade de referncias uma propriedade importante para a construo de programas ecientes. Ela tambm til em outras reas da computao, como a gerncia das pginas armazenadas nos caches de navegadores web e servidores proxy, nos mecanismos de otimizao de leituras/escritas em sistemas de arquivos, na construo da lista arquivos recentes dos menus de muitas aplicaes interativas, etc.

7 Memria virtual
Um problema constante nos computadores a disponibilidade de memria fsica: os programas se tornam cada vez maiores e cada vez mais processos executam simultaneamente, ocupando a memria disponvel. Alm disso, a crescente manipulao de informaes multimdia (imagens, udio, vdeo) contribui para esse problema, uma vez que essas informaes so geralmente volumosas e seu tratamento exige grandes quantidades de memria livre. Como a memria RAM um recurso caro (cerca de U$50/GByte no mercado americano, em 2007) e que consome uma quantidade signicativa de energia, aumentar sua capacidade nem sempre uma opo factvel. Observando o comportamento de um sistema computacional, constata-se que nem todos os processos esto constantemente ativos, e que nem todas as reas de memria esto constantemente sendo usadas. Por isso, as reas de memria pouco acessadas poderiam ser transferidas para um meio de armazenamento mais barato e abundante, como um disco rgido (U$0,50/GByte) ou um banco de memria ash (U$10/GByte)4 , liberando a memria RAM para outros usos. Quando um processo proprietrio de uma dessas reas precisar acess-la, ela deve ser transferida de volta para a memria RAM. O uso de um armazenamento externo como extenso da memria RAM se chama memria virtual; essa estratgia pode ser implementada de forma eciente e transparente para processos, usurios e programadores.
4

Estes valores so apenas indicativos, variando de acordo com o fabricante e a tecnologia envolvida.

33

7.1 Mecanismo bsico


Nos primeiros sistemas a implementar estratgias de memria virtual, processos inteiros eram transferidos da memria para o disco rgido e vice-versa. Esse procedimento, denominado troca (swapping) permite liberar grandes reas de memria a cada transferncia, e se justica no caso de um armazenamento com tempo de acesso muito elevado, como os antigos discos rgidos. Os sistemas atuais raramente transferem processos inteiros para o disco; geralmente as transferncias so feitas por pginas ou grupos de pginas, em um procedimento denominado paginao (paging), detalhado a seguir. Normalmente, o mecanismo de memria virtual se baseia em pginas ao invs de segmentos. As pginas tm tamanho xo, o que permite simplicar os algoritmos de escolha de pginas a remover, os mecanismos de transferncia para o disco e tambm a formatao da rea de troca. A otimizao desses fatores seria bem mais complexa e menos efetiva caso as operaes de troca fossem baseadas em segmentos, que tm tamanho varivel. A idia central do mecanismo de memria virtual em sistemas com memria paginada consiste em retirar da memria principal os quadros pouco usados, salvando-os em uma rea do disco rgido reservada para esse m. Os quadros a retirar so escolhidos de acordo com os algoritmos discutidos na seo 7.3. As entradas das tabelas de pginas relativas aos quadros transferidos para o disco devem ento ser ajustadas de forma a referenciar os contedos correspondentes no disco rgido. Essa situao est ilustrada de forma simplicada na gura 26.

Figura 26: Memria virtual paginada. O armazenamento externo das pginas pode ser feito em em um disco exclusivo para esse m (usual em servidores de maior porte), em uma partio do disco principal (usual no Linux e outros UNIX) ou em um arquivo reservado dentro do sistema de arquivos do disco principal da mquina, geralmente oculto (como no Windows NT e sucessores). Em alguns sistemas, possvel usar uma rea de troca remota, em um servidor de arquivos de rede; todavia, essa soluo apresenta baixo desempenho. Por 34

razes histricas, essa rea de disco geralmente denominada rea de troca (swap area), embora armazene pginas. No caso de um disco exclusivo ou partio de disco, essa rea geralmente formatada usando uma estrutura de sistema de arquivos otimizada para o armazenamento e recuperao rpida das pginas. As pginas que foram transferidas da memria para o disco provavelmente sero necessrias no futuro. Quando um processo tenta acessar uma pgina ausente, esta deve ser transferida de volta para a memria, para permitir seu acesso, de forma transparente ao processo. Conforme exposto na seo 3.4, quando um processo acessa uma pgina, a MMU verica se a mesma est mapeada na memria RAM e, em caso positivo, faz o acesso ao endereo fsico correspondente. Caso contrrio, a MMU gera uma interrupo de falta de pgina (page fault) que fora o desvio da execuo para o sistema operacional. Nesse instante, o sistema deve vericar se a pgina solicitada no existe ou se foi transferida para o disco, usando os ags de controle da respectiva entrada da tabela de pginas. Caso a pgina no exista, o processo tentou acessar um endereo invlido e deve ser abortado. Por outro lado, caso a pgina solicitada tenha sido transferida para o disco, o processo deve ser suspenso enquanto o sistema transfere a pgina de volta para a memria RAM e faz os ajustes necessrios na tabela de pginas. Uma vez a pgina carregada em memria, o processo pode continuar sua execuo. Nesse procedimento aparentemente simples h duas questes importantes. Primeiro, caso a memria principal j esteja cheia, uma ou mais pginas devero ser removidas para o disco antes de trazer de volta a pgina faltante. Isso implica em mais operaes de leitura e escrita no disco e portanto em mais demora para atender o pedido do processo. Muitos sistemas, como o Linux e o Solaris, mantm um processo daemon com a nalidade de escolher e transferir pginas para o disco, ativado sempre que a quantidade de memria livre estiver abaixo de um limite mnimo. Segundo, retomar a execuo do processo que gerou a falta de pgina pode ser uma tarefa complexa. Como a instruo que gerou a falta de pgina no foi completada, ela deve ser re-executada. No caso de instrues simples, envolvendo apenas um endereo de memria sua re-execuo trivial. Todavia, no caso de instrues que envolvam vrias aes e vrios endereos de memria, deve-se descobrir qual dos endereos gerou a falta de pgina, que aes da instruo foram executadas e ento executar somente o que estiver faltando. A maioria dos processadores atuais prov registradores especiais que auxiliam nessa tarefa. O uxograma da gura 27 apresenta as principais aes desenvolvidas pelo mecanismo de memria virtual.

7.2 Ecincia de uso


O mecanismo de memria virtual permite usar o disco como uma extenso de memria RAM, de forma transparente para os processos. Seria a soluo ideal para as limitaes da memria principal, se no houvesse um problema importante: o tempo de acesso dos discos utilizados. Conforme os valores indicados na tabela 1, um disco rgido tpico tem um tempo de acesso cerca de 100.000 vezes maior que a memria RAM. 35

Figura 27: Aes do mecanismo de memria virtual. Cada falta de pgina provocada por um processo implica em um acesso ao disco, para buscar a pgina faltante (ou dois acessos, caso a memria RAM esteja cheia e outra pgina tenha de ser removida antes). Assim, faltas de pgina muito freqentes iro gerar muitos acessos ao disco, aumentando o tempo mdio de acesso memria e, em conseqncia, diminuindo o desempenho geral do sistema. Para demonstrar o impacto das faltas de pgina no desempenho, consideremos um sistema cuja memria RAM tem um tempo de acesso de 60 ns (60 109 s) e cujo disco de troca tem um tempo de acesso de 6 ms (6 103 s), no qual ocorre uma falta de pgina a cada milho de acessos (106 acessos). Caso a memria no esteja saturada, o tempo mdio de acesso ser:

36

tmdio =

(999.999 60ns) + 6ms + 60ns 1.000.000 106 60 109 + 6 103 = 106

tmdio = 66ns Caso a memria esteja saturada, o tempo mdio ser maior: (999.999 60ns) + 2 6ms + 60ns 1.000.000 6 10 60 109 + 2 6 103 = 106

tmdio =

tmdio = 72ns Caso a freqncia de falta de pginas aumente para uma falta a cada 100.000 acessos (10 acessos), o tempo mdio de acesso memria subir para 180 ns, ou seja, trs vezes mais lento. A freqncia de faltas de pgina depende de vrios fatores, como:
5

O tamanho da memria RAM, em relao demanda dos processos em execuo: sistemas com memria insuciente, ou muito carregados, podem gerar muitas faltas de pgina, prejudicando o seu desempenho e podendo ocasionar o fenmeno conhecido como thrashing (seo 8.2). o comportamento dos processos em relao ao uso da memria: processos que agrupem seus acessos a poucas pginas em cada momento, respeitando a localidade de referncias (seo 6), necessitam usar menos pginas simultaneamente e geram menos faltas de pgina. A escolha das pginas a remover da memria: caso sejam removidas pginas usadas com muita freqncia, estas sero provavelmente acessadas pouco tempo aps sua remoo, gerando mais faltas de pgina. A escolha das pginas a remover tarefa dos algoritmos apresentados na seo 7.3.

7.3 Algoritmos de substituio de pginas


A escolha correta dos quadros a remover da memria fsica um fator essencial para a ecincia do mecanismo de memria virtual. Ms escolhas podero remover da 37

memria quadros muito usados, aumentando a taxa de faltas de pgina e e diminuindo o desempenho do sistema. Vrios critrios podem ser usados para escolher vtimas, pginas a transferir da memria para a rea de troca no disco: Idade da pgina : h quanto tempo a pgina est na memria; pginas muito antigas talvez sejam pouco usadas. Freqncia de acessos pgina : pginas muito acessadas em um passado recente possivelmente ainda o sero em um futuro prximo. Data do ltimo acesso : pginas h mais tempo sem acessar possivelmente sero pouco acessadas em um futuro prximo (sobretudo se os processos respeitarem o princpio da localidade de referncias). Prioridade do processo proprietrio : processos de alta prioridade, ou de tempo-real, podem precisar de suas pginas de memria rapidamente; se elas estiverem no disco, seu desempenho ou tempo de resposta podero ser prejudicados. Contedo da pgina : pginas cujo contedo seja cdigo executvel exigem menos esforo do mecanismo de memria virtual, porque seu contedo j est mapeado no disco (dentro do arquivo executvel correspondente ao processo). Por outro lado, pginas de dados que tenham sido alteradas precisam ser salvas na rea de troca. Pginas especiais : pginas contendo buers de operaes de entrada/sada podem ocasionar diculdades ao ncleo caso no estejam na memria no momento em que ocorrer a transferncia de dados entre o processo e o dispositivo fsico. O processo tambm pode solicitar que certas pginas contendo informaes sensveis (como senhas ou chaves criptogrcas) no sejam copiadas na rea de troca, por segurana. Existem vrios algoritmos para a escolha de pginas a substituir na memria, visando reduzir a freqncia de falta de pginas, que levam em conta alguns dos fatores acima enumerados. Os principais sero apresentados na seqncia. Uma ferramenta importante para o estudo desses algoritmos a cadeia de referncias (reference string), que indica a seqncia de pginas acessadas por um processo durante sua execuo. Ao submeter a cadeia de referncias de uma execuo aos vrios algoritmos, podemos calcular quantas faltas de pgina cada um geraria naquela execuo em particular e assim comparar sua ecincia. Cadeias de referncias de execues reais podem ser muito longas: considerando um tempo de acesso memria de 50 ns, em apenas um segundo de execuo ocorrem por volta de 20 milhes de acessos memria. Alm disso, a obteno de cadeias de referncias conveis uma rea de pesquisa importante, por envolver tcnicas complexas de coleta, ltragem e compresso de dados de execuo de sistemas [UM97]. 38

Para possibilitar a comparao dos algoritmos de substituio de pginas apresentados na seqncia, ser usada a seguinte cadeia de referncias ctcia, extrada de [Tan03]: 0, 2, 1, 3, 5, 4, 6, 3, 7, 4, 7, 3, 3, 5, 5, 3, 1, 1, 1, 7, 1, 3, 4, 1 Deve-se observar que acessos consecutivos a uma mesma pgina no so relevantes para a anlise dos algoritmos, porque somente o primeiro acesso em cada grupo de acessos consecutivos provoca uma falta de pgina. 7.3.1 Algoritmo timo

Idealmente, a melhor pgina a remover da memria em um dado instante aquela que car mais tempo sem ser acessada pelo processo. Esta idia simples dene o algoritmo timo, ou simplesmente OPT. Entretanto, como o comportamento futuro dos processos no pode ser previsto com preciso, este algoritmo no implementvel. Mesmo assim, ele importante, porque dene um limite mnimo conceitual: por exemplo, se para uma dada cadeia de referencias, o algoritmo timo gera 17 faltas de pgina, nenhum outro algoritmo ir gerar menos que 17 faltas de pgina ao tratar a mesma cadeia. Assim, seu resultado serve como parmetro para a avaliao dos demais algoritmos. A aplicao do algoritmo timo cadeia de referncias apresentada na seo anterior, considerando uma memria fsica com 3 quadros, apresentada na tabela 2. Nesse caso, o algoritmo gera 11 faltas de pgina. 7.3.2 Algoritmo FIFO

Um critrio a considerar para a escolha das pginas a substituir poderia ser sua idade, ou seja, o tempo em que esto na memria. Assim, pginas mais antigas podem ser removidas para dar lugar a novas pginas. Esse algoritmo muito simples de implementar: basta organizar as pginas em uma la de nmeros de pginas com poltica FIFO (First In, First Out). Os nmeros das pginas recm carregadas na memria so registrados no nal da lista, enquanto os nmeros das prximas pginas a substituir na memria so obtidos no incio da lista. A aplicao do algoritmo FIFO cadeia de referncias apresentada na seo anterior, considerando uma memria fsica com 3 quadros, apresentada na tabela 3. Nesse caso, o algoritmo gera 15 faltas de pgina (quatro faltas a mais que o algoritmo timo). Apesar de ter uma implementao simples, na prtica este algoritmo no oferece bons resultados. Seu principal defeito considerar somente a idade da pgina, sem levar em conta sua importncia. Pginas carregadas na memria h muito tempo podem estar sendo freqentemente acessadas, como o caso de pginas contendo bibliotecas dinmicas compartilhadas por muitos processos, ou pginas de processos servidores lanados durante a inicializao (boot) da mquina.

39

t 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

pgina 0 2 1 3 5 4 6 3 7 4 7 3 3 5 5 3 1 1 1 7 1 3 4 1

qo 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4

q1 2 2 2 5 5 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7

q2

1 1 1 4 4 4 4 4 4 4 4 5 5 5 1 1 1 1 1 1 1 1

faltas

ao p0 carregada no quadro vazio q0 p2 carregada em q1 p1 carregada em q2 p3 substitui p0 (no ser mais acessada) p5 substitui p2 (no ser mais acessada) p4 substitui p1 (s ser acessada em t = 17) p6 substitui p5 (s ser acessada em t = 14) p3 est na memria p7 substitui p6 (no ser mais acessada) p4 est na memria p7 est na memria p3 est na memria p3 est na memria p5 substitui p4 (s ser acessada em t = 23) p5 est na memria p3 est na memria p1 substitui p5 (no ser mais acessada) p1 est na memria p1 est na memria p7 est na memria p1 est na memria p3 est na memria p4 substitui p3 (no ser mais acessada) p1 est na memria

Tabela 2: Aplicao do algoritmo de substituio timo. 7.3.3 Algoritmo LRU

Uma aproximao implementvel do algoritmo timo proporcionada pelo algoritmo LRU (Least Recently Used, menos recentemente usado). Neste algoritmo, a escolha recai sobre as pginas que esto na memria h mais tempo sem ser acessadas. Assim, pginas antigas e menos usadas so as escolhas preferenciais. Pginas antigas mas de uso freqente no so penalizadas por este algoritmo, ao contrrio do que ocorre no algoritmo FIFO. Pode-se observar facilmente que este algoritmo simtrico do algoritmo OPT em relao ao tempo: enquanto o OPT busca as pginas que sero acessadas mais longe no futuro do processo, o algoritmo LRU busca as pginas que foram acessadas mais longe no seu passado. A aplicao do algoritmo LRU cadeia de referncias apresentada na seo anterior, considerando uma memria fsica com 3 quadros, apresentada na tabela 4. Nesse caso, o algoritmo gera 14 faltas de pgina (trs faltas a mais que o algoritmo timo). O grco da gura 28 permite a comparao dos algoritmos OPT, FIFO e LRU sobre a cadeia de referncias em estudo, em funo do nmero de quadros existentes 40

t 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

pgina 0 2 1 3 5 4 6 3 7 4 7 3 3 5 5 3 1 1 1 7 1 3 4 1

qo 0 0 0 3 3 3 6 6 6 4 4 4 4 4 4 4 1 1 1 1 1 1 1 1

q1 2 2 2 5 5 5 3 3 3 3 3 3 5 5 5 5 5 5 7 7 7 7 7

q2

1 1 1 4 4 4 7 7 7 7 7 7 7 3 3 3 3 3 3 3 4 4

faltas

ao p0 carregada no quadro vazio q0 p2 carregada em q1 p1 carregada em q2 p3 substitui p0 (a mais antiga na memria) p5 substitui p2 (idem) p4 substitui p1 p6 substitui p3 p3 substitui p5 p7 substitui p4 p4 substitui p6 p7 est na memria p3 est na memria p3 est na memria p5 substitui p3 p5 est na memria p3 substitui p7 p1 substitui p4 p1 est na memria p1 est na memria p7 substitui p5 p1 est na memria p3 est na memria p4 substitui p3 p1 est na memria

Tabela 3: Aplicao do algoritmo de substituio FIFO. na memria fsica. Pode-se observar que o melhor desempenho do algoritmo OPT, enquanto o pior desempenho proporcionado pelo algoritmo FIFO. O algoritmo LRU parte do pressuposto que pginas recentemente acessadas no passado provavelmente sero acessadas em um futuro prximo, e ento evita removlas da memria. Esta hiptese se verica na prtica, sobretudo se os processos respeitam o princpio da localidade de referncia (seo 6). Embora possa ser implementado, o algoritmo LRU bsico pouco usado na prtica, porque sua implementao exigiria registrar as datas de acesso s pginas a cada leitura ou escrita na memria, o que difcil de implementar de forma eciente em software e com custo proibitivo para implementar em hardware. Alm disso, sua implementao exigiria varrer as datas de acesso de todas as pginas para buscar a pgina com acesso mais antigo (ou manter uma lista de pginas ordenadas por data de acesso), o que exigiria muito processamento. Assim, na prtica a maioria dos sistemas operacionais implementam aproximaes do LRU, como as apresentadas na seqncia.

41

t 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

pgina 0 2 1 3 5 4 6 3 7 4 7 3 3 5 5 3 1 1 1 7 1 3 4 1

qo 0 0 0 3 3 3 6 6 6 4 4 4 4 5 5 5 5 5 5 7 7 7 4 4

q1 2 2 2 5 5 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

q2

1 1 1 4 4 4 7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1

faltas

ao p0 carregada no quadro vazio q0 p2 carregada em q1 p1 carregada em q2 p3 substitui p0 (h mais tempo sem acessos) p5 substitui p2 (idem) p4 substitui p1 (...) p6 substitui p3 p3 substitui p5 p7 substitui p4 p4 substitui p6 p7 est na memria p3 est na memria p3 est na memria p5 substitui p4 p5 est na memria p3 est na memria p1 substitui p7 p1 est na memria p1 est na memria p7 substitui p5 p1 est na memria p3 est na memria p4 substitui p7 p1 est na memria

Tabela 4: Aplicao do algoritmo de substituio LRU. 7.3.4 Algoritmo da segunda chance

O algoritmo FIFO move para a rea de troca as pginas h mais tempo na memria, sem levar em conta seu histrico de acessos. Uma melhoria simples desse algoritmo consiste em analisar o bit de referncia (seo 3.4.1) de cada pgina candidata, para saber se ela foi acessada recentemente. Caso tenha sido, essa pgina recebe uma segunda chance, voltando para o m da la com seu bit de referncia ajustado para zero. Dessa forma, evita-se substituir pginas antigas mas muito acessadas. Todavia, caso todas as pginas sejam muito acessadas, o algoritmo vai varrer todas as pginas, ajustar todos os bits de referncia para zero e acabar por escolher a primeira pgina da la, como faria o algoritmo FIFO. Uma forma eciente de implementar este algoritmo atravs de uma la circular de nmeros de pgina, ordenados de acordo com seu ingresso na memria. Um ponteiro percorre a la seqencialmente, analisando os bits de referncia das pginas e ajustandoos para zero medida em que avana. Quando uma pgina vtima encontrada, ela movida para o disco e a pgina desejada carregada na memria no lugar da vtima, 42

20 OPT FIFO LRU

15

Faltas de pgina

10

0 1 2 3 4 Nmero de quadros de RAM 5 6 7

Figura 28: Comparao dos algoritmos de substituio de pginas. com seu bit de referncia ajustado para zero. Essa implementao conhecida como algoritmo do relgio e pode ser vista na gura 29.

Figura 29: Algoritmo da segunda chance (ou do relgio).

7.3.5

Algoritmo NRU

O algoritmo da segunda chance leva em conta somente o bit de referncia de cada pgina ao escolher as vtimas para substituio. O algoritmo NRU (Not Recently Used, ou no usada recentemente) melhora essa escolha, ao considerar tambm o bit de modicao 43

(dirty bit, vide seo 3.4.1), que indica se o contedo de uma pgina foi modicado aps ela ter sido carregada na memria. Usando os bits R (referncia) e M (modicao), possvel possvel classicar as pginas em memria em quatro nveis de importncia: 0) R = 0, M = 0 (ou 00): pginas que no foram referenciadas recentemente e cujo contedo no foi modicado. So as melhores candidatas substituio, pois podem ser simplesmente retiradas da memria. 1) R = 0, M = 1 (ou 01): pginas que no foram referenciadas recentemente, mas cujo contedo j foi modicado. No so escolhas to boas, porque tero de ser gravadas na rea de troca antes de serem substitudas. 2) R = 1, M = 0 (ou 10): pginas referenciadas recentemente, cujo contedo permanece inalterado. So provavelmente pginas de cdigo que esto sendo usadas ativamente e sero referenciadas novamente em breve. 3) R = 1, M = 1 (ou 11): pginas referenciadas recentemente e cujo contedo foi modicado. So a pior escolha, porque tero de ser gravadas na rea de troca e provavelmente sero necessrias em breve. O algoritmo NRU consiste simplesmente em tentar substituir primeiro pginas do nvel 0; caso no encontre, procura candidatas no nvel 1 e assim sucessivamente. Pode ser necessrio percorrer vrias vezes a lista circular at encontrar uma pgina adequada para substituio. 7.3.6 Algoritmo do envelhecimento

Outra possibilidade de melhoria do algoritmo da segunda chance consiste em usar os bits de referncia das pginas para construir contadores de acesso s mesmas. A cada pgina associado um contador inteiro com N bits (geralmente 8 bits so sucientes). Periodicamente, o algoritmo varre as tabelas de pginas, l os bits de referncia e agrega seus valores aos contadores de acessos das respectivas pginas. Uma vez lidos, os bits de referncia so ajustados para zero, para registrar as referncias de pginas que ocorrero durante prximo perodo. O valor lido de cada bit de referncia no deve ser simplesmente somado ao contador, por duas razes: o contador chegaria rapidamente ao seu valor mximo (overow) e a simples soma no permitiria diferenciar acessos recentes dos mais antigos. Por isso, outra soluo foi encontrada: cada contador deslocado para a direita 1 bit, descartando o bit menos signicativo (LSB - Least Signicant Bit). Em seguida, o valor do bit de referncia colocado na primeira posio esquerda do contador, ou seja, em seu bit mais signicativo (MSB - Most Signicant Bit). Dessa forma acessos mais recentes tm um peso maior que acessos mais antigos, e o contador nunca ultrapassa seu valor mximo. O exemplo abaixo mostra a evoluo dos contadores para quatro pginas, usando os valores dos respectivos bits de referncia R. Os valores decimais dos contadores 44

esto indicados entre parnteses, para facilitar a comparao. Observe que as pginas acessadas no ltimo perodo (p2 e p4 ) tm seus contadores aumentados, enquanto aquelas no acessadas (p1 e p3 ) tm seus contadores diminudos. contadores 0000 0011 0011 1101 1010 1000 1110 0011 R (3) 0 (61) 1 com (168) 0 (227) 1 contadores 0000 0001 1001 1110 0101 0100 1111 0001 R (1) 0 (158) 0 e (84) 0 (241) 0

p1 p2 p3 p4

O contador construdo por este algoritmo constitui uma aproximao razovel do algoritmo LRU: pginas menos acessadas envelhecero, cando com contadores menores, enquanto pginas mais acessadas permanecero jovens, com contadores maiores. Por essa razo, esta estratgia conhecida como algoritmo do envelhecimento [Tan03], ou algoritmo dos bits de referncia adicionais [SGG01].

7.4 Conjunto de trabalho


A localidade de referncias (seo 6) mostra que os processos normalmente acessam apenas uma pequena frao de suas pginas a cada instante. O conjunto de pginas acessadas na histria recente de um processo chamado Conjunto de Trabalho (Working Set, ou ws). A composio do conjunto de trabalho dinmica, variando medida em que o processo executa e evolui seu comportamento, acessando novas pginas e deixando de acessar outras. Para ilustrar esse conceito, consideremos a cadeia de referncias apresentada na seo 7.3. Considerando como histria recente as ltimas n pginas acessadas pelo processo, a evoluo do conjunto de trabalho ws do processo que gerou aquela cadeia apresentada na tabela 5. O tamanho e a composio do conjunto de trabalho dependem do nmero de pginas consideradas em sua histria recente (o valor n na tabela 5). Em sistemas reais, essa dependncia no linear, mas segue uma proporo exponencial inversa, devido localidade de referncias. Por essa razo, a escolha precisa do tamanho da histria recente a considerar no crtica. Esse fenmeno pode ser observado na tabela 5: assim que a localidade de referncias se torna mais forte (a partir de t = 12), os trs conjuntos de trabalho cam muito similares. Outro exemplo apresentado na gura 30, que mostra o tamanho mdio dos conjuntos de trabalhos observados na execuo do programa gThumb (analisado na seo 6), em funo do tamanho da histria recente considerada (em nmero de pginas referenciadas). Se um processo tiver todas as pginas de seu conjunto de trabalho carregadas na memria, ele sofrer poucas faltas de pgina, pois somente acessos a novas pginas podero gerar faltas. Essa constatao permite delinear um algoritmo simples para substituio de pginas: s substituir pginas que no pertenam ao conjunto de trabalho de nenhum processo ativo. Contudo, esse algoritmo difcil de implementar, pois 45

t 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

pgina 0 2 1 3 5 4 6 3 7 4 7 3 3 5 5 3 1 1 1 7 1 3 4 1

ws(n = 3) {0} {0, 2} {0, 2, 1} {2, 1, 3} {1, 3, 5} {3, 5, 4} {5, 4, 6} {4, 6, 3} {6, 3, 7} {3, 7, 4} {4, 7} {4, 7, 3} {7, 3} {3, 5} {3, 5} {5, 3} {5, 3, 1} {3, 1} {1} {1, 7} {7, 1} {7, 1, 3} {1, 3, 4} {3, 4, 1}

ws(n = 4) {0} {0, 2} {0, 2, 1} {0, 2, 1, 3} {2, 1, 3, 5} {1, 3, 5, 4} {3, 5, 4, 6} {5, 4, 6, 3} {4, 6, 3, 7} {6, 3, 7, 4} {3, 4, 7} {4, 7, 3} {4, 7, 3} {7, 3, 5} {3, 5} {5, 3} {5, 3, 1} {5, 3, 1} {3, 1} {1, 7} {7, 1} {7, 1, 3} {7, 1, 3, 4} {3, 4, 1}

ws(n = 5) {0} {0, 2} {0, 2, 1} {0, 2, 1, 3} {0, 2, 1, 3, 5} {2, 1, 3, 5, 4} {1, 3, 5, 4, 6} {5, 4, 6, 3} {5, 4, 6, 3, 7} {6, 3, 7, 4} {6, 3, 4, 7} {4, 7, 3} {4, 7, 3} {4, 7, 3, 5} {7, 3, 5} {5, 3} {5, 3, 1} {5, 3, 1} {5, 3, 1} {3, 1, 7} {3, 7, 1} {7, 1, 3} {7, 1, 3, 4} {7, 3, 4, 1}

Tabela 5: Conjuntos de trabalho ws para n = 3, n = 4 e n = 5. exigiria manter atualizado o conjunto de trabalho de cada processo a cada acesso memria, o que teria um custo computacional proibitivo. Uma alternativa mais simples e eciente de implementar seria vericar que pginas cada processo acessou recentemente, usando a informao dos respectivos bits de referncia. Essa a base do algoritmo WSClock (Working Set Clock) [CH81], que modica o algoritmo do relgio (seo 7.3.4) da seguinte forma: 1. Uma data de ltimo acesso ta (p) associada a cada pgina p da la circular; essa data pode ser atualizada quando o ponteiro do relgio visita a pgina. 2. Dene-se um prazo de validade para as pginas, geralmente entre dezenas e centenas de mili-segundos; a idade i(p) de uma pgina p denida como a diferena entre sua data de ltimo acesso ta (p) e o instante corrente tc (i(p) = tc ta (p)). 3. Quando h necessidade de substituir pginas, o ponteiro percorre a la buscando pginas candidatas:

46

350

Tamanho mdio do conjunto de trabalho (pginas)

300

250

200

150

100

50

0 0 1000 2000 3000 4000 5000 6000 Tamanho da histria recente (pginas) 7000 8000 9000

Figura 30: Tamanho do conjunto de trabalho do programa gThumb. (a) Ao encontrar uma pgina referenciada (com R = 1), sua data de ltimo acesso atualizada com o valor corrente do tempo (ta (p) = tc ), seu bit de referncia limpo (R = 0) e o ponteiro do relgio avana, ignorando aquela pgina. (b) Ao encontrar uma pgina no referenciada (com R = 0), se sua idade for menor que , a pgina est no conjunto de trabalho; caso contrrio, ela considerada fora do conjunto de trabalho e pode ser substituda. 4. 5. Caso o ponteiro d uma volta completa na la e no encontre pginas com idade maior que , a pgina mais antiga (que tiver o menor ta (p)) encontrada na volta anterior substituda. 6. Em todas as escolhas, d-se preferncia a pginas no-modicadas (M = 0), pois seu contedo j est salvo no disco. O algoritmo WSClock pode ser implementado de forma eciente, porque a data ltimo acesso de cada pgina no precisa ser atualizada a cada acesso memria, mas somente quando a referncia da pgina na la circular visitada pelo ponteiro do relgio (caso R = 1). Todavia, esse algoritmo no uma implementao pura do conceito de conjunto de trabalho, mas uma composio de conceitos de vrios algoritmos: FIFO e segunda-chance (estrutura e percurso do relgio), Conjuntos de trabalho (diviso das pginas em dois grupos conforme sua idade), LRU (escolha das pginas com datas de acesso mais antigas) e NRU (preferncia s pginas no-modicadas). 47

7.5 A anomalia de Belady


Espera-se que, quanto mais memria fsica um sistema possua, menos faltas de pgina ocorram. Todavia, esse comportamento intuitivo no se verica em todos os algoritmos de substituio de pginas. Alguns algoritmos, como o FIFO, podem apresentar um comportamento estranho: ao aumentar o nmero de quadros de memria, o nmero de faltas de pgina geradas pelo algoritmo aumenta, ao invs de diminuir. Esse comportamento atpico de alguns algoritmos foi estudado pelo matemtico hngaro Laslo Belady nos anos 60, sendo por isso denominado anomalia de Belady. A seguinte cadeia de referncias permite observar esse fenmeno; o comportamento dos algoritmos OPT, FIFO e LRU ao processar essa cadeia pode ser visto na gura 31, que exibe o nmero de faltas de pgina em funo do nmero de quadros de memria disponveis no sistema. A anomalia pode ser observada no algoritmo FIFO: ao aumentar a memria de 4 para 5 quadros, esse algoritmo passa de 22 para 24 faltas de pgina. 0, 1, 2, 3, 4, 0, 1, 2, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 0, 1, 2, 5, 0, 1, 2, 3, 4, 5
30 OPT FIFO LRU 25

20 Faltas de pgina

15

10

0 1 2 3 4 Nmero de quadros de RAM 5 6 7

Figura 31: A anomalia de Belady. Estudos demonstraram que uma famlia de algoritmos denominada algoritmos de pilha ( qual pertencem os algoritmos OPT e LRU, entre outros) no apresenta a anomalia de Belady [Tan03].

48

8 Outros tpicos a abordar


8.1 Substituio global e local 8.2 Thrashing 8.3 Alocao da memria fsica 8.4 Gerncia de espao livre 8.5 Gerncia de heap 8.6 Carga sob demanda 8.7 Bibliotecas com ligao dinmica 8.8 Algoritmos recentes de substituio de pginas
CAR, CART, LIRS, ARC, Clock-Pro, ...

Questes
1. Explique a diferena entre endereos lgicos e endereos fsicos e as razes que justicam seu uso. 2. Explique em que consiste a resoluo de endereos nos seguintes momentos: codicao, compilao, ligao, carga e execuo. 3. Como organizado o espao de memria de um processo? 4. O que uma MMU Memory Management Unit? 5. Seria possvel e/ou vivel implementar as converses de endereos realizadas pela MMU em software, ao invs de usar um hardware dedicado? Por que? 6. Explique as principais formas de alocao de memria. 7. Explique o que fragmentao externa. Quais formas de alocao de memria esto livres desse problema? 8. Explique o que fragmentao interna. Quais formas de alocao de memria esto livres desse problema? 9. Em que consistem as estratgias de alocao rst-t, best-t, worst-t e next-t? 10. Explique como feita a translao entre endereos lgicos e fsicos e o mecanismo de tratamento de falta de pgina em um sistema de memria virtual paginada. 49

11. Por que os tamanhos de pginas e quadros so sempre potncias de 2? 12. O que uma falta de pgina? Quais so suas causa possveis e como o sistema operacional deve trat-las? 13. Explique o que TLB, qual a sua nalidade e como seu funcionamento. 14. Por que necessrio limpar o cache TLB aps cada troca de contexto entre processos? Por que isso no necessrio nas trocas de contexto entre threads?

Exerccios
1. Considerando a tabela de segmentos abaixo (com valores em decimal), calcule os endereos fsicos correspondentes aos endereos lgicos 0:45, 1:100, 2:90, 3:1.900 e 4:200. Segmento Base Limite 0 44 810 1 200 200 2 0 1.000 3 2.000 1.000 4 1.200 410

2. Considerando a tabela de pginas abaixo, com pginas de 500 bytes, informe os endereos fsicos correspondentes aos endereos lgicos 414, 741, 1.995, 4.000 e 6.633, indicados em decimal. pgina 0 1 quadro 3 12 2 3 6 4 9 5 6 2 7 8 0 9 10 5 11 12 13 7 14 15 1

3. Considere um sistema com processos alocados de forma contgua na memria. Em um dado instante, a memria RAM possui os seguintes buracos, em seqncia e isolados entre si: 5K, 4K, 20K, 18K, 7K, 9K, 12K e 15K. Indique a situao nal de cada buraco de memria aps a seguinte seqncia de alocaes: 12K, 10K, 5K, 8K e 10K. Considere as estratgias de alocao rst-t, best-t, worst-t e next-t. 4. Considere um sistema com endereos fsicos e lgicos de 32 bits, que usa tabelas de pginas com trs nveis. Cada nvel de tabela de pginas usa 7 bits do endereo lgico, sendo os restantes usados para o oset. Calcule: (a) O tamanho das pginas e quadros, em bytes. (b) O tamanho mximo de memria que um processo pode ter, em bytes e pginas.

50

(c) O espao ocupado pela tabela de pginas para um processo com apenas uma pgina de cdigo, uma pgina de dados e uma pgina de pilha. As pginas de cdigo e dados se encontram no inicio do espao de endereamento lgico, enquanto a pilha se encontra no nal deste. (d) Idem, caso todas as pginas do processo estejam mapeadas na memria. 5. Um sistema de memria virtual paginada possui tabelas de pgina com trs nveis e tempo de acesso memria RAM de 100 ns. O sistema usa um cache TLB de 64 entradas, com taxa estimada de acerto de 98%, custo de acerto de 10 ns e penalidade de erro de 50 ns. Qual o tempo mdio estimado de acesso memria pelo processador? Apresente e explique seu raciocnio. 6. Considerando um sistema de 32 bits com pginas de 4 KBytes, calcule quantos erros de cache TLB (64 entradas) so gerados pela execuo dos laos a seguir. Considere apenas os acessos matriz buffer.
1

unsigned char buer[4096][4096] ; for ( int i =0; i <4096; i ++) for ( int j =0; j <4096; j ++) buer[ i ][ j ] = 0 ; // lao 1

for ( int j =0; j <4096; j ++) for ( int i =0; i <4096; i ++) buer[ i ][ j ] = 0 ;

// lao 2

7. Considerando um sistema com tempo de acesso RAM de 50 ns, tempo de acesso a disco de 5 ms, calcule quanto tempo seria necessrio para efetuar os acessos matriz do exerccio anterior nos dois casos (lao 1 e lao 2). Considere que existem 256 quadros de 4.096 bytes (inicialmente vazios) para alocar a matriz e despreze os efeitos do cache TLB. 8. Calcule o tempo mdio efetivo de acesso memria se o tempo de acesso RAM de 5 ns, o de acesso ao disco de 5 ms e em mdia ocorre uma falta de pgina a cada 1.000.000 (106 ) de acessos memria. Considere que a memria RAM sempre tem espao livre para carregar novas pginas. Apresente e explique seu raciocnio. 9. Repita o exerccio anterior, considerando que a memria RAM est saturada: para carregar uma nova pgina na memria necessrio antes abrir espao, retirando outra pgina. 10. Considere um sistema de memria com quatro quadros de RAM e oito pginas a alocar. Os quadros contm inicialmente as pginas 7, 4 e 1, carregadas em memria nessa seqncia. Determine quantas faltas de pgina ocorrem na seqncia de 51

acesso {0, 1, 7, 2, 3, 2, 7, 1, 0, 3}, para os algoritmos de escalonamento de memria FIFO, OPT e LRU. 11. Um computador tem 8 quadros de memria fsica; os parmetros usados pelo mecanismo de memria virtual so indicados na tabela a seguir: pgina carga na memria ltimo acesso p0 14 58 p1 97 97 p2 124 142 p3 47 90 p4 29 36 p5 103 110 p6 131 136 p7 72 89 bit R 1 1 1 0 1 0 1 0 bit M 1 0 1 1 0 0 1 0

Qual ser a prxima pgina a ser substituda, considerando os algoritmos LRU, FIFO, segunda chance e NRU? 12. Considere um sistema com 4 quadros de memria. Os seguintes valores so obtidos em dez leituras consecutivas dos bits de referncia desses quadros: 0101, 0011, 1110, 1100, 1001, 1011, 1010, 0111, 0110 e 0111. Considerando o algoritmo de envelhecimento, determine o valor nal do contador associado a cada pgina e indique que quadro ser substitudo. 13. Em um sistema que usa o algoritmo WSClock, o contedo da la circular de referncias de pgina em tc = 220 indicado pela tabela a seguir. Considerando que o ponteiro est em p0 e que = 50, qual ser a prxima pgina a substituir? E no caso de = 100? pgina ltimo acesso p0 142 p1 197 p2 184 p3 46 p4 110 p5 167 p6 97 p7 129 bit R 1 0 0 0 0 0 0 1 bit M 0 0 1 1 0 1 1 0

52

Projetos
1. Construa um simulador de algoritmos de substituio de pgina. O simulador deve receber como entrada a seqncia de referncias a pginas de memria e gerar como sada o nmero de faltas de pgina geradas, para os algoritmos OPT, FIFO e LRU. 2. Construa um simulador de algoritmos de alocao de memria contgua. O simulador deve produzir aleatoriamente uma seqncia de blocos de memria de tamanhos diferentes, simular sua alocao e gerar como sada o nmero de fragmentos livres de memria, os tamanhos do menor e do maior fragmentos e o tamanho mdio dos fragmentos. Devem ser comparadas as estratgias de alocao rst-t, next-t, best-t e worst-t.

Referncias
[CH81] R. Carr and J. Hennessy. Wsclock - a simple and eective algorithm for virtual memory management. In ACM symposium on Operating systems principles, 1981.

[Den05] Peter Denning. The locality principle. Communications of the ACM, 48(7):1924, July 2005. [JW99] Mark S. Johnstone and Paul R. Wilson. The memory fragmentation problem: solved? ACM SIGPLAN Notices, 34(3):2636, 1999.

[Lev00] John Levine. Linkers and Loaders. Morgan Kaufmann, 2000. [PH05] David Patterson and John Henessy. Organizao e Projeto de Computadores. Campus, 2005.

[SGG01] Abraham Silberschatz, Peter Galvin, and Greg Gane. Sistemas Operacionais Conceitos e Aplicaes. Campus, 2001. [Tan03] Andrew Tanenbaum. Sistemas Operacionais Modernos, 2a edio. Pearson Prentice-Hall, 2003. [UM97] R. Uhlig and T. Mudge. Trace-driven memory simulation: a survey. ACM Computing Surveys, 29(2):128170, June 1997.

53

Vous aimerez peut-être aussi