RESUMO: A gerência da memória principal tem um papel vital para um bom desempenho geral do sistema. Através dela o sistema pode definir e administrar como os programas irão utilizar essa memória, tendo foco em uma maior disponibilidade e compartilhamento da memória bem como dos recursos computacionais. Os tipos de alocação de memória referem-se em o sistema operacional encontrar um equilíbrio pra com os espaços ocupados e não ocupados da memória para prevenir fragmentações da memória e melhorar o desempenho. As técnicas de alocação são usadas para minimizar a fragmentação ou impedir que ela ocorra com maior frequência. O swapping é uma técnica para alternar processos entre a memória principal e a secundária e visa garantir um melhor uso para a memória.
Palavras-chave: gerência, memória, alocação
1 INTRODUÇÃO
Antigamente, considerava-se a memória principal um recurso escasso e caro. Por causa disso, foi preciso desenvolver sistemas que ocupassem pouca memória e aperfeiçoassem o uso de recursos ao mesmo tempo. Nos dias atuais, vê-se a redução de custo e aumento de capacidade da memória principal e, mesmo assim, seu gerenciamento é indispensável em um projeto de sistema operacional. Como em sistemas multiprogramáveis houve maior demanda de usuários e aplicações que utilizem a memória principal, sua gerência se tornou vital para esses sistemas.
2 GERÊNCIA DE MEMÓRIA PRINCIPAL
Funções
Ao executar algo, o sistema operacional deve sempre transferir o programa da memoria secundária para a principal, mas, com o tempo, podem-se haver diferenças no tempo de acesso dessas duas memórias, caso isso persista, poderá causar sérios problemas ao seu desempenho. A gerência de memória deve maximizar o compartilhamento de processador e recursos mantendo os processos residentes na memória principal. Também permitir execução de programas maiores que a memória física, através de overlay e memória virtual. As áreas de memória ocupadas por processos devem ser protegidas, se um programa tentar acessar indevidamente a memória, o sistema deve impedi-lo. Além disso, deve-se ser oferecidos mecanismos de compartilhamento para que processos possam compartilhar dados de forma segura.
Alocação de memória
Alocação contígua simples
A memória principal é dividida entre o sistema operacional e o programa do usuário. O usuário possui controle total da memória principal, no entanto, alguns sistemas implementam um registrador para delimitar a área do sistema operacional e do usuário. Com isso, o sistema verifica se o programa a ser executado está dentro dos limites, caso contrário, será cancelado.
Nesse tipo de alocação, apenas um usuário pode dispor dos recursos computacionais. Se houver espaço livre na memória principal durante a execução de um programa, este não poderá ser utilizado.
Técnica de Overlay
Os programas são divididos em módulos que são executados de forma independente, ocupando uma mesma área da memória. Em um programa com três módulos, haverá um principal, um de cadastramento e outro de impressão, sendo o de cadastramento e impressão independentes. Essa independência sugere que um módulo não necessita estar presente se já houver outro na memória. Como o módulo principal é comum aos outros dois, este permanece na memória o tempo todo. Na pratica, se a memória for insuficiente, os módulos de cadastramento e impressão utilizarão a mesma área da memória (área de overlay). O tamanho da área de overlay é definido pelo tamanho do maior módulo, ou seja, se houver um módulo de 4kb e outro de 2kb, a área de overlay terá 4kb. Essa técnica tem sua vantagem por expandir a memória, porém, sua utilização exige cuidados, pois poderá gerar problemas com aplicações, pela transferência excessiva de módulos entre memória principal e secundária.
Alocação Particionada Estática
Nos primeiros sistemas multiprogramáveis, dividia-se a memória em partições (pedaços) fixas, com tamanho definido na inicialização, de acordo com os programas a serem executados no ambiente. Caso houvesse necessidade de alterar o tamanho das partições, o sistema deveria ser desativado e reinicializado. Os programas só podiam ser executados em uma partição específica, e mesmo que houvesse outras partições e outros programas, estes não seriam processados. Isso é característica da época em que os compiladores e montadores usavam o código absoluto (referenciável ao endereço físico da memória), mas com evolução dos mesmos, o código passou a ser relocável (referenciável ao início do código).
Isso significa que os programas podem ser executados a partir de qualquer posição. Ao carregar o programa, o loader calcula o endereço a partir de sua posição inicial e, no caso se um programa A e outro B terminarem, o programa E pode se executado em qualquer outra partição. Essa é a alocação particionada estática relocável. Essa gerência dispõe de uma tabela de controle das partições, com o endereço inicial de cada uma, seu tamanho e seu estado de uso. Essa tabela é analisada sempre que um programa é carregado na memória. A proteção é assegurada por dois registradores, caso haja violação aos limites de memória por eles estabelecidos, o programa será interrompido. Tanto no absoluto quanto no relocável há espaços não preenchidos nas partições. Isso, decorrente da alocação fixa das partições, gera um problema conhecido como fragmentação interna.
Alocação Particionada dinâmica
Nesse tipo de alocação, partições de tamanho fixo foram deixadas de lado, pois cada programa passou a utilizar o espaço necessário, tornando a área sua partição. Resolvido o problema da fragmentação, foi possível aumentar o grau de compartilhamento da memória. Porém, na alocação particionada dinâmica ocorre-se outro tipo de fragmentação: a externa. Essa fragmentação ocorre quando os programas estão terminando e deixam espaços cada vez menores para os novos ingressarem. Uma solução para este problema é conforme o termino dos programas, esses espaços vão sendo reunidos para formar uma área maior, já outra solução envolve a relocacão de todas as partições ocupadas, criando uma única área livre. Mas, para que isso seja possível, o sistema deve ser capaz de mover os programas da memória principal (relocação dinâmica), porém, a complexidade do seu algoritmo e consumo de recursos do sistema podem tornar a relocação dinâmica inviável.
Estratégias de Alocação
A função das estratégias de alocação é minimizar a fragmentação externa. A escolha de uma delas depende de vários fatores, sendo o mais importante o tamanho dos programas processados no ambiente. Independente da escolha, o sistema terá uma lista de áreas livres, com o endereço e tamanho de cada área.
Best-fit: a partição escolhida é aquela em que o programa deixa o menor espaço sem uso. Diminui-se o tempo de busca por uma área desocupada, pois a lista de áreas livres fica ordenada por tamanho. No entanto, sua desvantagem está na tendência de ter cada vez mais pequenas áreas não-contíguas, o que aumenta a fragmentação.
Worst-fit: essa é o oposto da anterior, pois escolhe a partição com maior espaço sem uso. Essa técnica deixa maiores espaços livres que permitem a um maior numero de programas utilizarem a memória, diminuindo assim, a fragmentação.
First-fit: nesta estratégia, a primeira partição livre que dispor tamanho suficiente para carregar o programa é a escolhida. A lista de áreas livres está ordenada por endereços crescentemente. Como o método tenta primeiro utilizar as áreas livres de endereços mais baixos, há uma grande chance de se obter uma grande partição livre nos endereços de memória mais altos. Das três é a mais rápida e consome menos recursos.
Swapping
O swapping é uma técnica aplicada á gerência de memória para programas que esperam por memória livre para serem executados. O sistema escolhe um processo residente, que é transferido da memória principal para a secundária (swap out), depois o processo é carregado retornando para a memória principal (swap in) e pode continuar sua execução normalmente. O processo escolhido deve ser aquele com menores chances de ser escalonado para evitar o swapping desnecessário. Os processos em swapping podem estar em estado de espera ou de pronto, quando saem do swapping são ditos não-residentes (outswapped).
Para que essa técnica seja possível, o sistema deve dispor de um loader que implemente relocação dinâmica de programas. A relocação dinâmica é realizada através de um registrador denominado registrador de relocação. Quando o programa é carregado na memória, o registrador recebe o endereço inicial da posição da memória que o programa ocupa. Toda vez que ocorrer uma referência a algum endereço, o endereço contido na instrução será somado ao conteúdo do registrador, gerando o endereço físico. Sendo assim, um programa pode ser carregado em qualquer posição na memória.
O swapping permite um maior compartilhamento da memória principal e melhor utilização dos recursos do computador. Seu problema é o elevado custo das operações de entrada/saída (swap in/out). Em caso de pouca memória disponível, o sistema pode ficar totalmente dependente do swapping. Essa situação denomina-se thrashing e é considerado um problema crítico na gerência de memória dos sistemas operacionais.
Palavras-chave: gerência, memória, alocação
1 INTRODUÇÃO
Antigamente, considerava-se a memória principal um recurso escasso e caro. Por causa disso, foi preciso desenvolver sistemas que ocupassem pouca memória e aperfeiçoassem o uso de recursos ao mesmo tempo. Nos dias atuais, vê-se a redução de custo e aumento de capacidade da memória principal e, mesmo assim, seu gerenciamento é indispensável em um projeto de sistema operacional. Como em sistemas multiprogramáveis houve maior demanda de usuários e aplicações que utilizem a memória principal, sua gerência se tornou vital para esses sistemas.
2 GERÊNCIA DE MEMÓRIA PRINCIPAL
Funções
Ao executar algo, o sistema operacional deve sempre transferir o programa da memoria secundária para a principal, mas, com o tempo, podem-se haver diferenças no tempo de acesso dessas duas memórias, caso isso persista, poderá causar sérios problemas ao seu desempenho. A gerência de memória deve maximizar o compartilhamento de processador e recursos mantendo os processos residentes na memória principal. Também permitir execução de programas maiores que a memória física, através de overlay e memória virtual. As áreas de memória ocupadas por processos devem ser protegidas, se um programa tentar acessar indevidamente a memória, o sistema deve impedi-lo. Além disso, deve-se ser oferecidos mecanismos de compartilhamento para que processos possam compartilhar dados de forma segura.
Alocação de memória
Alocação contígua simples
A memória principal é dividida entre o sistema operacional e o programa do usuário. O usuário possui controle total da memória principal, no entanto, alguns sistemas implementam um registrador para delimitar a área do sistema operacional e do usuário. Com isso, o sistema verifica se o programa a ser executado está dentro dos limites, caso contrário, será cancelado.
Nesse tipo de alocação, apenas um usuário pode dispor dos recursos computacionais. Se houver espaço livre na memória principal durante a execução de um programa, este não poderá ser utilizado.
Técnica de Overlay
Os programas são divididos em módulos que são executados de forma independente, ocupando uma mesma área da memória. Em um programa com três módulos, haverá um principal, um de cadastramento e outro de impressão, sendo o de cadastramento e impressão independentes. Essa independência sugere que um módulo não necessita estar presente se já houver outro na memória. Como o módulo principal é comum aos outros dois, este permanece na memória o tempo todo. Na pratica, se a memória for insuficiente, os módulos de cadastramento e impressão utilizarão a mesma área da memória (área de overlay). O tamanho da área de overlay é definido pelo tamanho do maior módulo, ou seja, se houver um módulo de 4kb e outro de 2kb, a área de overlay terá 4kb. Essa técnica tem sua vantagem por expandir a memória, porém, sua utilização exige cuidados, pois poderá gerar problemas com aplicações, pela transferência excessiva de módulos entre memória principal e secundária.
Alocação Particionada Estática
Nos primeiros sistemas multiprogramáveis, dividia-se a memória em partições (pedaços) fixas, com tamanho definido na inicialização, de acordo com os programas a serem executados no ambiente. Caso houvesse necessidade de alterar o tamanho das partições, o sistema deveria ser desativado e reinicializado. Os programas só podiam ser executados em uma partição específica, e mesmo que houvesse outras partições e outros programas, estes não seriam processados. Isso é característica da época em que os compiladores e montadores usavam o código absoluto (referenciável ao endereço físico da memória), mas com evolução dos mesmos, o código passou a ser relocável (referenciável ao início do código).
Isso significa que os programas podem ser executados a partir de qualquer posição. Ao carregar o programa, o loader calcula o endereço a partir de sua posição inicial e, no caso se um programa A e outro B terminarem, o programa E pode se executado em qualquer outra partição. Essa é a alocação particionada estática relocável. Essa gerência dispõe de uma tabela de controle das partições, com o endereço inicial de cada uma, seu tamanho e seu estado de uso. Essa tabela é analisada sempre que um programa é carregado na memória. A proteção é assegurada por dois registradores, caso haja violação aos limites de memória por eles estabelecidos, o programa será interrompido. Tanto no absoluto quanto no relocável há espaços não preenchidos nas partições. Isso, decorrente da alocação fixa das partições, gera um problema conhecido como fragmentação interna.
Alocação Particionada dinâmica
Nesse tipo de alocação, partições de tamanho fixo foram deixadas de lado, pois cada programa passou a utilizar o espaço necessário, tornando a área sua partição. Resolvido o problema da fragmentação, foi possível aumentar o grau de compartilhamento da memória. Porém, na alocação particionada dinâmica ocorre-se outro tipo de fragmentação: a externa. Essa fragmentação ocorre quando os programas estão terminando e deixam espaços cada vez menores para os novos ingressarem. Uma solução para este problema é conforme o termino dos programas, esses espaços vão sendo reunidos para formar uma área maior, já outra solução envolve a relocacão de todas as partições ocupadas, criando uma única área livre. Mas, para que isso seja possível, o sistema deve ser capaz de mover os programas da memória principal (relocação dinâmica), porém, a complexidade do seu algoritmo e consumo de recursos do sistema podem tornar a relocação dinâmica inviável.
Estratégias de Alocação
A função das estratégias de alocação é minimizar a fragmentação externa. A escolha de uma delas depende de vários fatores, sendo o mais importante o tamanho dos programas processados no ambiente. Independente da escolha, o sistema terá uma lista de áreas livres, com o endereço e tamanho de cada área.
Best-fit: a partição escolhida é aquela em que o programa deixa o menor espaço sem uso. Diminui-se o tempo de busca por uma área desocupada, pois a lista de áreas livres fica ordenada por tamanho. No entanto, sua desvantagem está na tendência de ter cada vez mais pequenas áreas não-contíguas, o que aumenta a fragmentação.
Worst-fit: essa é o oposto da anterior, pois escolhe a partição com maior espaço sem uso. Essa técnica deixa maiores espaços livres que permitem a um maior numero de programas utilizarem a memória, diminuindo assim, a fragmentação.
First-fit: nesta estratégia, a primeira partição livre que dispor tamanho suficiente para carregar o programa é a escolhida. A lista de áreas livres está ordenada por endereços crescentemente. Como o método tenta primeiro utilizar as áreas livres de endereços mais baixos, há uma grande chance de se obter uma grande partição livre nos endereços de memória mais altos. Das três é a mais rápida e consome menos recursos.
Swapping
O swapping é uma técnica aplicada á gerência de memória para programas que esperam por memória livre para serem executados. O sistema escolhe um processo residente, que é transferido da memória principal para a secundária (swap out), depois o processo é carregado retornando para a memória principal (swap in) e pode continuar sua execução normalmente. O processo escolhido deve ser aquele com menores chances de ser escalonado para evitar o swapping desnecessário. Os processos em swapping podem estar em estado de espera ou de pronto, quando saem do swapping são ditos não-residentes (outswapped).
Para que essa técnica seja possível, o sistema deve dispor de um loader que implemente relocação dinâmica de programas. A relocação dinâmica é realizada através de um registrador denominado registrador de relocação. Quando o programa é carregado na memória, o registrador recebe o endereço inicial da posição da memória que o programa ocupa. Toda vez que ocorrer uma referência a algum endereço, o endereço contido na instrução será somado ao conteúdo do registrador, gerando o endereço físico. Sendo assim, um programa pode ser carregado em qualquer posição na memória.
O swapping permite um maior compartilhamento da memória principal e melhor utilização dos recursos do computador. Seu problema é o elevado custo das operações de entrada/saída (swap in/out). Em caso de pouca memória disponível, o sistema pode ficar totalmente dependente do swapping. Essa situação denomina-se thrashing e é considerado um problema crítico na gerência de memória dos sistemas operacionais.
REFERÊNCIAS BIBLIOGRÁFICAS
STALLINGS, Willian. Operating Systems – Internals and Design Principles. Sixth Edition. Peason Prentice hall. New Jersey, 2009.
MACHADO, Francis Berenger. Arquitetura de Sistemas Operacionais. Rio de Janeiro: LTC, 2007.
TANEMBAUM, Andrew S. Sistemas Operacionais: projeto e implementação. 2.ed Porto Alegre: Bookman, 2000.
STALLINGS, Willian. Operating Systems – Internals and Design Principles. Sixth Edition. Peason Prentice hall. New Jersey, 2009.
MACHADO, Francis Berenger. Arquitetura de Sistemas Operacionais. Rio de Janeiro: LTC, 2007.
TANEMBAUM, Andrew S. Sistemas Operacionais: projeto e implementação. 2.ed Porto Alegre: Bookman, 2000.