O gerenciamento de memória é uma das funções básicas do sistema operacional. Os sistemas operacionais modernos permitem que cada processo obtenha mais memória virtual do que o tamanho total da memória (física) real em um determinado sistema de computador. O principal objetivo do gerenciamento de memória é que, combinando memória grande, mas lenta, com memória pequena, mas de alta velocidade, para obter o efeito de maior memória de alta velocidade.
A separação entre particionamento fixo e variável é ineficaz em termos de utilização da memória, pois o particionamento fixo resulta em fragmentação interna e dinâmica na fragmentação externa. Uma possível solução para o problema da fragmentação é permitir que o processo não seja gravado em um bloco de memória contínuo. O programa pode ser espalhado arbitrariamente na memória. Nesse caso, a memória de trabalho é dividida em blocos menores de tamanho fixo chamados quadros. O espaço de endereço lógico do programa também é dividido em blocos do mesmo tamanho, chamados de páginas. Quando um programa é inserido na memória, as páginas são gravadas em quadros de memória livre. Para facilitar a transferência de programas de um disco para uma memória de trabalho, o disco também é dividido em quadros do mesmo tamanho que os quadros de memória. Assim, um quadro do disco é gravado em um quadro da memória de trabalho. O sistema de paginação opera da seguinte maneira: quando o programa é aceito para execução, seu tamanho é calculado, expresso com o número necessário de páginas. Se um número suficiente de quadros estiver livre, o processo será gravado na página de memória por página. Ao mesmo tempo, o número de quadros em que cada página é gravada é inserido na tabela de quadros.
O programa do usuário e os dados associados podem ser divididos em vários segmentos. Os segmentos de todos os programas não precisam ter o mesmo tamanho, embora exista um tamanho máximo de segmento. Assim como na paginação, o endereço lógico que usa a segmentação consiste em duas partes, nesse caso, o número de segmentos e deslocamentos dentro desse segmento. Devido ao uso de segmentos de tamanhos diferentes, a segmentação é semelhante ao particionamento dinâmico. Na ausência de um esquema de sobreposição ou uso de memória virtual, é necessário que todos os segmentos do programa sejam carregados na memória para execução. A diferença em relação ao particionamento dinâmico é que a segmentação pode levar mais de uma partição e essa partição não precisa ser adjacente. A segmentação resolve o problema da fragmentação interna, mas, assim como o particionamento dinâmico, o problema da fragmentação externa permanece. No entanto, como o processo é dividido em várias partes menores, a fragmentação externa geralmente é menor. Ao contrário da paginação invisível para o programador, a segmentação geralmente é visível e adequada para organizar programas e dados. Para fins de programação modular, o programa ou dados podem ser divididos em vários segmentos menores. A desvantagem dessa técnica é que o programador deve conhecer as limitações do tamanho máximo do segmento. A próxima conveniência de usar segmentos de tamanhos diferentes é que não há conexão em potencial entre endereços lógicos e físicos. Semelhante à paginação, a técnica de segmentação simples usa a tabela de segmentos para cada processo e uma lista de blocos disponíveis na memória principal.
A paginação fornece um espaço de endereço virtual e físico e um espaço de memória secundário em blocos (páginas) de tamanhos iguais. Isso permite que o espaço de endereço virtual contínuo seja alocado ao processo de dispersão (não necessariamente distribuído continuamente) no espaço de endereço real e na memória secundária. Até a página, como termo, refere-se à memória e não a objetos lógicos visíveis no nível do programa. A segmentação fornece um espaço de endereço virtual em blocos (segmentos) que correspondem diretamente a objetos no nível do programa. Por esse motivo, o segmento não possui comprimento fixo, portanto, mesmo o tamanho do segmento pode ser alterado durante a execução do programa. A proteção e a divisão são, portanto, possíveis no nível do objeto e existem processos visíveis onde a segmentação é realizada.
O desenvolvedor do aplicativo não tem conhecimento da paginação. Ele escreve programas como se a memória fosse linear e o sistema operacional e o processador estivessem preocupados com o particionamento e a conversão em endereços virtuais. Programador em sistemas de segmentação, no entanto, lista duas partes do endereço, segmento e página em seus programas. Todas as páginas têm o mesmo tamanho, enquanto os segmentos são diferentes. A segmentação possui vários espaços de endereço lineares e paginação apenas um. Os segmentos permitem particionamento lógico e proteção dos componentes do aplicativo, e as páginas não.
A paginação, que é transparente para o programador, elimina a fragmentação externa e, portanto, garante o uso eficiente da memória principal. As partes que entram e saem da memória principal são fixas e do mesmo tamanho, por isso é possível desenvolver algoritmos sofisticados de gerenciamento de memória que exploram o comportamento do programa. A segmentação é visível para o desenvolvedor e tem a capacidade de gerenciar o crescimento da estrutura de dados, modularidade e suporte para troca e proteção.
Paging | Segmentação |
tamanho fixo das páginas | segmentos não têm tamanho fixo |
invisível para programador | visível para programador |
um espaço de endereço linear | vários espaços de endereço lineares |
não permite particionamento lógico e proteção de componentes de aplicativos | permite |