Introdução Devido aos Sistemas Operacionais apresentarem características variadas, determinados procedimentos tornam-se por vezes semelhantes ou próprios de cada Sistema. O gerenciamento de memória é um procedimento fundamental na objetividade de todos os Sistemas Operacionais. É responsabilidade do Sistema Operacional executar inúmeras tarefas, independente da quantidade de tarefas assim como o tamanho das mesmas. Neste contexto parece complicado para o Sistema Operacional gerenciar tarefas que exigem uma quantidade de memória superior ao que é disponibilizado pela máquina. Cada Sistema possui suas características próprias para complementar estas tarefas e principalmente gerenciar a memória disponível para estas execuções. No entanto, é necessário garantir para elas além da possibilidade de execução um alto grau de segurança. Recursos do modo usuário O gerenciador da memória virtual (VM) permite aos subsistemas do modo usuário compartilhar memória eficientemente usando objetos que são protegidos, denominados e manipulados como qualquer objeto do executivo. Os subsistemas podem definir proteção a nível de página na memória privativa, bloquear páginas selecionadas na memória, tirar proveito dos arquivos mapeados e gerenciar os espaços de endereçamento virtual de outros processos. Gerenciando a memória O gerenciador VM fornece um conjunto de serviços nativos que um processo pode usar para gerenciar diretamente sua memória virtual. Estes serviços permitem que um processo faça o seguinte: alocar memória em um processo de dois estágios. ler e gravar na memória virtual. bloquear páginas virtuais na memória física. obter informações sobre páginas virtuais. descarregar páginas virtuais para o disco. O gerenciador VM estabelece uma abordagem de duas fases para alocar memória, reservá-la e depois comprometê-la. A memória reservada é um conjunto de endereços virtuais que o gerenciador VM reservou para ser usado futuramente por um processo. A reserva de memória é uma operação rápida e barata no windows NT. A memória comprometida é memória para qual o gerenciador VM separou espaço no seu arquivo de paginação. Outro serviço do gerenciador VM do windows NT possibilitam ao chamador fornecer uma alça de processos para indicar um processo cuja memória virtual será manipulada. O chamador pode manipular sua própria memória virtual ou aquela de um outro processo. Esta facilidade é poderosa porque permite que um processo do modo usuário gerencie o espaço de endereçamento de um outro processo. Representação do esquema de memória virtual do Windows NT Compartilhando a memória Uma tarefa importante de qualquer subsistema de gerenciamento de memória é permitir que os processos compartilhem memória quando solicitarem ou quando isto tornar o sistema operacional mais eficiente. A memória virtual oferece um mecanismo conveniente para o compartilhamento de memória. Como cada processo tem um espaço de endereçamento virtual separado, o sistema operacional pode carregar o compilador para a memória uma vez e quando outro processo invocar o compilador, o gerenciador VM pode simplesmente mapear os endereços virtuais do segundo processo para as estruturas de páginas físicas já ocupadas pelo compilador. O gerenciador VM não permite que nenhum processo modifique as páginas ocupadas pelo compilador. As páginas virtuais em ambos os processos são designadas como sendo somente para leitura. Seções, visões e arquivos mapeados Assim como todos os outros componentes do Windows NT, o gerenciador VM é totalmente paralelo. Ele roda simultaneamente em todos os processadores de um computador multiprocessado e tem de compartilhar suas estruturas de dados com as linhas que estão sendo executadas em processadores diferentes. Memória compartilhada pode ser definida como a memória que é visível apartir de mais de um processo ou que está presente em mais de um espaço de endereçamento virtual. A abordagem do windows NT ao compartilhamento de recursos é implementá-los como objetos protegidos e a memória não é nenhuma exceção. O objeto de seção representa um bloco de memória que dois ou mais processos podem compartilhar. Uma linha de um processo cria um objeto de seção e dá a ele um nome para que as linhas de outros processos possam abrir alças para ele. Um objeto de seção do NT pode ser muito grande, ocupando dezenas ou até milhares de páginas, por isso um processo precisa mapear apenas as partes do objeto de seção que lhes são necessárias. O mapeamento de visões de uma seção permite a um processo acessar grandes blocos de memória que, caso contrário, ele poderia não ter espaço de endereçamento virtual para mapear. Da mesma forma que a memória privativa, o conteúdo da memória compartilhada é paginado para o disco quando a demanda de memória está alta. O gerenciador VM também permite que os objetos de seção sejam paginados para um arquivo mapeado. O executivo do NT usa os arquivos mapeados para carregar imagens executáveis para a memória e o gerenciador de cache do sistema usa os arquivos mapeados para ler e gravar em páginas do cache. Representação do mapeamento na memória virtual Representação da referência do endereço virtual em um endereço físico Protegendo a memória 1. 2. 3. 4. A proteção de memória no windows NT é oferecida em quatro formas: um espaço de endereçamento separado para cada processo. dois modos de operação: modo kernel e modo usuário. um mecanismo de proteção baseado em páginas. proteção de memória baseado em objetos. Memória privativa do processo Toda vez que uma linha usa um endereço, o gerenciador VM do executivo do NT, juntamente com o hardware, intervém e traduz o endereço virtual em endereço físico. O sistema de memória virtual através do controle da tradução dos endereços virtuais, consegue garantir que as linhas de um processo não acessarão uma estrutura de página de memória que pertença a um outro processo. O gerenciador VM oferece as proteções de página somente leitura e leitura/gravação, e suplementa estas proteções de memória em alguns mecanismos próprios: somente execução. guardar página. nenhum acesso. cópia na gravação. Usando os serviços nativos de memória virtual, o subsistema de ambiente tem condições de controlar a proteção a nível de página virtuais. O controle da proteção a nível de páginas pode produzir programas mais confiáveis já que assegura que as linhas não gravarão em páginas designadas como somente para leitura. Memória compartilhada A proteção de página copiar na gravação, mencionada anteriormente, é uma otimização que o gerenciador VM usa para economizar memória. Quando dois processos querem ler e gravar o mesmo conteúdo de memória, o gerenciador VM atribui a proteção de página copiar na gravação à região de memória. Depois ele compartilha a memória física entre os processos, desde que nenhum deles efetue gravações. Se uma linha de um dos dois processos gravar em uma página, o gerenciador VM copia a estrutura da página física para um outro local de memória, atualiza o espaço de endereçamento virtual do processo para que ele aponte para a cópia e define a nova proteção para leitura/gravação. Portanto a linha pode gravar em sua cópia de página sem afetar outros processos que estejam usando a mesma. Todos os mecanismos de proteção de memória descritos até agora são implementados no hardware ou no software de gerenciamento de memória baixa que é invocada toda vez que uma linha usa um endereço. A arquitetura de objetos do windows NT oferece uma camada adicional de proteção para a memória compartilhada entre dois processos. O subsistema de segurança protege os objetos de seção da mesma maneira que protege os outros objetos executivos, usando as listas de controles de acessos (LCAs), que especificam que usuários podem ler, gravar, obter informações sobre ou ampliar o tamanho da seção. A segurança também entra em ação quando uma linha cria uma seção que irá conter um arquivo mapeado. Para tanto, a linha tem de ter acesso ao objeto de arquivo subjacente. Uma vez carregado um arquivo para uma seção, a linha pode alterar a LCA do objeto de seção, mas somente dentro dos limites definidos pela LCA do arquivo que foi mapeado . Implementação da memória virtual Espaço de Endereçamento Cada processo nativo do NT tem um grande espaço de endereçamento virtual de 4 GB, sendo que 2 GB são reservados para uso do sistema. A metade inferior do espaço de endereçamento virtual é acessível às linhas do modo usuário e do modo kernel e é exclusiva de cada processo. A metade superior do espaço de endereçamento virtual é acessível apenas às linhas do modo kernel e é a mesma para todo o processo. O código e os dados do kernel residem na parte inferior de memória do sistema e nunca são paginados fora da memória. A porção superior de memória do sistema é controlada pelo gerenciador VM e é usada para armazenar outros códigos e dados do sistema. Uma parte desta área é reservada para códigos e dados que podem ser paginados para o disco em uma outra parte é reservada para código do sistema que nunca pode ser paginado fora da memória. Paginação Os mecanismos de memória virtual incluem a maneira como o gerenciador VM traduz os endereços virtuais para endereços físicos e maneira como ele traz as páginas para a memória física. As políticas de memória virtual, em contraste determinam quando trazer uma página para a memória e onde colocá-la. Normalmente, o processador fornece mecanismos primitivos de paginação, que são amplicados pelo sistema de memória virtual. O paginador, código do gerenciador VM que transfere páginas do disco e para o disco, é um intermediário importante entre os mecanismos do hardware e as políticas do software. ele invalida uma página quando ocorre uma falha de página. ele oferece proteção baseada em página para páginas inválidas e aumenta as proteções que o hardware oferece para as páginas válidas. ele atualiza e mantém as estruturas de dados do gerenciador da memória. Os sistemas de memória virtual geralmente definem três políticas que ditam como a paginação é efetuada: uma política de busca, uma política de colocação e uma política de substituição. A política de busca determina quando o paginador deve trazer a página do disco para a memória. Um tipo de política de busca tenta carregar as páginas que um processo irá precisar antes que ele as solicite. Outra política de busca, chamada de políticas de paginação na demanda, carregam uma página para a memória física apenas quando ocorre uma falha de página. O gerenciador VM do NT usa um algoritmo de paginação na demanda com argumentos para carregar as páginas para a memória. Quando uma linha recebe uma falha de página, o gerenciador VM carrega para a memória a página para onde ocorreu a falha e mais algumas páginas em volta dela. Quando uma linha recebe uma falha de página, o sistema de gerenciamento de memória também tem de determinar onde colocar a página virtual na memória física. O conjunto de regras que ele usa chama-se política de colocação. No NT, se a memória não esta esgotada, o gerenciador VM simplesmente seleciona a primeira estrutura de página em uma lista de estruturas de páginas livres. Se a lista esta vazia, ele cruza uma série de outras listas por ele mantidas. Se a memória física estiver repleta quando ocorrer uma falha de página, uma política de substituição é usada para determinar que página virtual deve ser removida da memória para abrir espaço para a página nova. As políticas de substituição podem ser ainda caracterizadas como globais ou locais. Uma política de substituição local aloca um número fixo de estruturas de páginas a cada processo. A política de substituição global permite que uma falha de página seja satisfeita por qualquer estrutura de página, seja ela possuída ou não por um outro processo. Quando cada processo é criado, ele recebe um conjunto de trabalho no tamanho mínimo, que é o número de páginas que o processo garantidamente terá na memória durante sua execução. Se a memória não está totalmente cheia, o gerenciador VM permite que o processo tenha tantas páginas quantas forem o máximo do seu conjunto de trabalho. Se o processo precisar de mais páginas, o gerenciador VM remove uma página para cada nova falha de página gerada. Para determinar que página deve ser removida do conjunto de trabalho de um processo, o gerenciador VM emprega um algoritmo FIFO simples, removendo as páginas que estão na memória a mais tempo. Quando a memória física começa a se esgotar, o gerenciador VM usa uma técnica chamada de corte automático do conjunto de trabalho para aumentar a quantidade de memória livre disponível no sistema. Ele examina os processos na memória, comparando o tamanho atual do conjunto de trabalho de cada um deles com o valor mínimo. Quando encontra processos que estão usando mais do que os mínimos permitidos, ele remove páginas desses conjuntos de trabalho, tornando-as disponíveis para outros usos. Se a quantidade de memória livre ainda estiver baixa, o gerenciador VM continua a remover páginas dos conjuntos de trabalho dos processos até que cada um atinja seu mínimo. Quando isto ocorre, o gerenciador VM registra o número de falhas de páginas em que o processo incorre. Se ele gera falhas de páginas e a memória não está totalmente repleta, o gerenciador VM aumenta o tamanho do conjunto de trabalho desse processo. Se, porém, o processo não incorre em nenhuma falha de página durante um certo tempo, é porque o código que as linhas do processo estão executando cabe confortavelmente no conjunto mínimo de trabalho daquele processo ou então nenhuma linha do processo está sendo executada. Gerência de memória em arquiteturas diferentes As versões do Windows NT até a 3.51 inclusive utilizam a arquitetura de MICROKERNEL1 modificada em razão do aumento de velocidade. As tarefas fundamentais executadas pelo sistema operacional tais como, o agendamento de threads, sincronização de multiprocessador e outras tarefas de baixo nível são implementadas no microkernel. O gerenciamento de memória , processos e outros serviços de sistema operacional são implementados em uma camada separada sobre o microkernel e o próprio microkernel é isolado, a partir das características físicas, de timers, controladoras de interrupção e outros dispositivos de hardware por meio de serviços da Hardware Abstraction Layer (HAL ou Camada de Acesso de Hardware). Juntos, estes módulos formam o Windows NT Executive. Os microprocessadores modernos permitem que threads de execução linhas de conduta tomadas através de código armazenado na memória sejam executados em vários níveis de prioridade. O código que está sendo executado em um nível alto de prioridade pode ter acesso aos dados em níveis mais baixos; contudo, o código executado em um nível de prioridade baixo não pode ter acesso a dados na memória marcados com níveis mais altos. Grande parte da famosa estabilidade do Windows NT é resultado direto da arquitetura do sistema operacional. Os aplicativos não podem interferir uns nos outros, uma vez que são executados em espaços de endereços separados. Os dados e o código do sistema operacional nos subsistemas são protegidos dos aplicativos devido aos subsistemas, também, residirem em seus próprios espaços de endereços. O Windows NT Executive compartilha espaço de endereço com processos em execução, mas ele está protegido pela parede entre o modo Kernel e o modo usuário.