Sistema operacional - gerenciamento de memória

O gerenciamento de memória é a funcionalidade de um sistema operacional que manipula ou gerencia a memória primária e move os processos para frente e para trás entre a memória principal e o disco durante a execução. O gerenciamento de memória rastreia cada local de memória, independentemente de estar alocado para algum processo ou de estar livre. Ele verifica quanta memória deve ser alocada para os processos. Ele decide qual processo obterá memória em que momento. Ele rastreia sempre que alguma memória é liberada ou não alocada e, correspondentemente, atualiza o status.

Este tutorial ensinará conceitos básicos relacionados ao gerenciamento de memória.

Espaço de Endereço do Processo

O espaço de endereço do processo é o conjunto de endereços lógicos que um processo faz referência em seu código. Por exemplo, quando o endereçamento de 32 bits está em uso, os endereços podem variar de 0 a 0x7fffffff; ou seja, 2 ^ 31 números possíveis, para um tamanho teórico total de 2 gigabytes.

O sistema operacional se encarrega de mapear os endereços lógicos para endereços físicos no momento da alocação de memória para o programa. Existem três tipos de endereços usados ​​em um programa antes e depois da alocação da memória -

SN Endereços de memória e descrição
1

Symbolic addresses

Os endereços usados ​​em um código-fonte. Os nomes de variáveis, constantes e rótulos de instrução são os elementos básicos do espaço de endereço simbólico.

2

Relative addresses

No momento da compilação, um compilador converte endereços simbólicos em endereços relativos.

3

Physical addresses

O carregador gera esses endereços no momento em que um programa é carregado na memória principal.

Os endereços virtuais e físicos são os mesmos em esquemas de vinculação de endereços em tempo de compilação e tempo de carregamento. Os endereços virtuais e físicos diferem no esquema de vinculação de endereço em tempo de execução.

O conjunto de todos os endereços lógicos gerados por um programa é conhecido como logical address space. O conjunto de todos os endereços físicos correspondentes a esses endereços lógicos é conhecido como umphysical address space.

O mapeamento de tempo de execução do endereço virtual para o físico é feito pela unidade de gerenciamento de memória (MMU), que é um dispositivo de hardware. A MMU usa o seguinte mecanismo para converter o endereço virtual em endereço físico.

  • O valor no registro base é adicionado a cada endereço gerado por um processo do usuário, que é tratado como deslocamento no momento em que é enviado para a memória. Por exemplo, se o valor do registro base for 10000, uma tentativa do usuário de usar a localização de endereço 100 será realocada dinamicamente para a localização 10100.

  • O programa do usuário lida com endereços virtuais; ele nunca vê os endereços físicos reais.

Carregamento estático vs dinâmico

A escolha entre carregamento estático ou dinâmico deve ser feita no momento do desenvolvimento do programa de computador. Se você tiver que carregar seu programa estaticamente, então, no momento da compilação, os programas completos serão compilados e vinculados sem deixar nenhum programa externo ou dependência de módulo. O vinculador combina o programa de objeto com outros módulos de objeto necessários em um programa absoluto, que também inclui endereços lógicos.

Se você estiver escrevendo um programa carregado dinamicamente, seu compilador irá compilar o programa e para todos os módulos que você deseja incluir dinamicamente, apenas referências serão fornecidas e o resto do trabalho será feito no momento da execução.

No momento do carregamento, com static loading, o programa absoluto (e os dados) são carregados na memória para que a execução comece.

Se você estiver usando dynamic loading, as rotinas dinâmicas da biblioteca são armazenadas em um disco em formato relocável e são carregadas na memória apenas quando são necessárias para o programa.

Link estático vs dinâmico

Conforme explicado acima, quando a vinculação estática é usada, o vinculador combina todos os outros módulos necessários a um programa em um único programa executável para evitar qualquer dependência de tempo de execução.

Quando a vinculação dinâmica é usada, não é necessário vincular o módulo ou biblioteca real com o programa, em vez disso, uma referência ao módulo dinâmico é fornecida no momento da compilação e da vinculação. Bibliotecas de vínculo dinâmico (DLL) no Windows e objetos compartilhados no Unix são bons exemplos de bibliotecas dinâmicas.

Troca

A troca é um mecanismo no qual um processo pode ser trocado temporariamente da memória principal (ou movido) para o armazenamento secundário (disco) e tornar essa memória disponível para outros processos. Mais tarde, o sistema volta o processo do armazenamento secundário para a memória principal.

Embora o desempenho seja geralmente afetado pelo processo de troca, ele ajuda na execução de vários e grandes processos em paralelo e essa é a razão Swapping is also known as a technique for memory compaction.

O tempo total gasto pelo processo de troca inclui o tempo que leva para mover todo o processo para um disco secundário e, em seguida, copiar o processo de volta para a memória, bem como o tempo que o processo leva para recuperar a memória principal.

Vamos supor que o processo do usuário tenha 2.048 KB e em um disco rígido padrão onde a troca ocorrerá tenha uma taxa de transferência de dados em torno de 1 MB por segundo. A transferência real do processo de 1000K para ou da memória levará

2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds

Agora, considerando o tempo de entrada e saída, levará 4.000 milissegundos completos mais outra sobrecarga em que o processo compete para recuperar a memória principal.

Alocação de memória

A memória principal geralmente tem duas partições -

  • Low Memory - O sistema operacional reside nesta memória.

  • High Memory - Os processos do usuário são mantidos em alta memória.

O sistema operacional usa o seguinte mecanismo de alocação de memória.

SN Alocação de memória e descrição
1

Single-partition allocation

Nesse tipo de alocação, o esquema de registro de relocação é usado para proteger os processos do usuário uns dos outros e de alterar o código e os dados do sistema operacional. O registro de relocação contém o valor do menor endereço físico, enquanto o registro de limite contém o intervalo de endereços lógicos. Cada endereço lógico deve ser menor que o registro de limite.

2

Multiple-partition allocation

Nesse tipo de alocação, a memória principal é dividida em várias partições de tamanho fixo, onde cada partição deve conter apenas um processo. Quando uma partição está livre, um processo é selecionado na fila de entrada e carregado na partição livre. Quando o processo termina, a partição fica disponível para outro processo.

Fragmentação

Conforme os processos são carregados e removidos da memória, o espaço livre da memória é dividido em pequenos pedaços. Às vezes acontece que os processos não podem ser alocados aos blocos de memória, considerando seu tamanho pequeno, e os blocos de memória permanecem sem uso. Esse problema é conhecido como Fragmentação.

A fragmentação é de dois tipos -

SN Fragmentação e Descrição
1

External fragmentation

O espaço total da memória é suficiente para satisfazer uma solicitação ou para residir um processo nela, mas não é contíguo, portanto não pode ser usado.

2

Internal fragmentation

O bloco de memória atribuído ao processo é maior. Parte da memória não é usada, pois não pode ser usada por outro processo.

O diagrama a seguir mostra como a fragmentação pode causar desperdício de memória e uma técnica de compactação pode ser usada para criar mais memória livre a partir da memória fragmentada -

A fragmentação externa pode ser reduzida pela compactação ou embaralhamento do conteúdo da memória para colocar toda a memória livre em um grande bloco. Para viabilizar a compactação, a realocação deve ser dinâmica.

A fragmentação interna pode ser reduzida atribuindo efetivamente a menor partição, mas grande o suficiente para o processo.

Paging

Um computador pode endereçar mais memória do que a quantidade fisicamente instalada no sistema. Essa memória extra é, na verdade, chamada de memória virtual e é uma seção de um disco rígido que é configurado para emular a RAM do computador. A técnica de paginação desempenha um papel importante na implementação da memória virtual.

Paginação é uma técnica de gerenciamento de memória na qual o espaço de endereço do processo é dividido em blocos do mesmo tamanho chamados pages(tamanho é potência de 2, entre 512 bytes e 8192 bytes). O tamanho do processo é medido em número de páginas.

Da mesma forma, a memória principal é dividida em pequenos blocos de tamanho fixo de memória (física) chamados frames e o tamanho de um quadro é mantido igual ao de uma página para melhor utilização da memória principal e para evitar fragmentação externa.

Tradução de endereços

O endereço da página é chamado logical address e representado por page number e a offset.

Logical Address = Page number + page offset

O endereço do quadro é chamado physical address e representado por um frame number e a offset.

Physical Address = Frame number + page offset

Uma estrutura de dados chamada page map table é usado para rastrear a relação entre uma página de um processo e um quadro na memória física.

Quando o sistema aloca um quadro para qualquer página, ele traduz esse endereço lógico em um endereço físico e cria uma entrada na tabela de páginas para ser usada durante a execução do programa.

Quando um processo deve ser executado, suas páginas correspondentes são carregadas em qualquer quadro de memória disponível. Suponha que você tenha um programa de 8 KB, mas sua memória possa acomodar apenas 5 KB em um determinado ponto no tempo, então o conceito de paginação aparecerá. Quando um computador fica sem RAM, o sistema operacional (SO) move páginas ociosas ou indesejadas da memória para a memória secundária para liberar RAM para outros processos e trazê-los de volta quando necessário para o programa.

Este processo continua durante toda a execução do programa, onde o sistema operacional continua removendo páginas ociosas da memória principal e as grava na memória secundária e as traz de volta quando exigido pelo programa.

Vantagens e desvantagens do paging

Aqui está uma lista de vantagens e desvantagens do paging -

  • A paginação reduz a fragmentação externa, mas ainda sofre de fragmentação interna.

  • A paginação é simples de implementar e considerada uma técnica de gerenciamento de memória eficiente.

  • Devido ao tamanho igual das páginas e frames, a troca torna-se muito fácil.

  • A tabela de páginas requer espaço de memória extra, portanto, pode não ser boa para um sistema com pouca RAM.

Segmentação

A segmentação é uma técnica de gerenciamento de memória na qual cada trabalho é dividido em vários segmentos de tamanhos diferentes, um para cada módulo que contém peças que executam funções relacionadas. Cada segmento é, na verdade, um espaço de endereço lógico diferente do programa.

Quando um processo deve ser executado, sua segmentação correspondente é carregada na memória não contígua, embora cada segmento seja carregado em um bloco contíguo de memória disponível.

O gerenciamento de memória de segmentação funciona de maneira muito semelhante à paginação, mas aqui os segmentos são de comprimento variável, enquanto nas páginas de paginação são de tamanho fixo.

Um segmento de programa contém a função principal do programa, funções utilitárias, estruturas de dados e assim por diante. O sistema operacional mantém umsegment map tablepara cada processo e uma lista de blocos de memória livres junto com números de segmento, seu tamanho e localizações de memória correspondentes na memória principal. Para cada segmento, a tabela armazena o endereço inicial do segmento e o comprimento do segmento. Uma referência a um local de memória inclui um valor que identifica um segmento e um deslocamento.