Please enable JavaScript.
Coggle requires JavaScript to display documents.
Cap 16 : Alocação de Memória - Coggle Diagram
Cap 16 : Alocação de Memória
Alocadores de Memória
Alocar memória significa reservar áreas de memória RAM que podem ser usadas
Ao final de seu uso, cada área de memória alocada é liberada pela entidade que a solicitou e colocada à disposição do sistema para novas alocações.
O alocador reserva ou libera partes da memória RAM, de acordo com o fluxo de solicitações que recebe
O alocador deve manter um registro contínuo de quais áreas estão sendo usadas e quais estão livres
O alocador deve realizar as alocações rapidamente e minimizar o desperdício de memória
Alocador de memória física: organiza a memória física, define que podem ser alocadas e aquelas que são reservadas
Alocador de espaço de núcleo: obtém áreas do alocador físico para alocar estruturas criadas pelo núcleo
Alocador de espaço do usuário: geralmente implementado por bibliotecas. Interage com o núcleo para redimensionar o HEAP. O processo pode solicitar alocação dinâmica.
Alocação Básica
Como efeito das alocações e liberações a área de memória se transforma em uma sequência de áreas ocupadas e livres que evolui a cada requisição
Essas informações são geralmente mantidas em listas duplamente encadeadas ou árvores
O alocador deve atender muitas requisições de alocação rapidamente
Fragmentação
Podem surgir buracos na memória entre as áreas alocadas
Fragmentação externa: fragmenta a memória livre, fora das áreas alocadas
A memória tem espaço total suficiente para alocar o processo mas não espaço contínuo suficiente
Quanto mais fragmentada estiver a memória mas esforço é preciso para gerenciá-la
Estratégias de alocação
First-fit: escolher a primeira área livre que satisfaça o pedido de alocação. Tem como vantagem a rapidez, sobretudo se a lista for muito grande
Best-fit: escolher a menor área possível que possa receber a alocação, minimizando o desperdício. Pode gerar áreas livres muito pequenas e inúteis
Worst-fit: escolher sempre a maior áreas livre possível. A "sobra" é grande o suficiente para ser usada em outras alocações. Gera escassez de áreas grandes
Next-fit: consiste em percorrer a lista de áreas a partir da última área alocada ou liberada. O uso das áreas é distribuído de forma mais homogênea
Estudos mostram que as mais eficientes são as First-fit e Best-fit
Desfragmentação
Desfragmentar a memória periodicamente
As áreas de memória em uso devem ser movidas de forma a concatenar as áreas livres
As informações de endereçamento virtual devem ser rapidamente ajustadas
Só pode ser aplicada em áreas de memória física
Precisa ser rápida e pouco frequente, pois os processos não podem ser executados durante a desfragmentação
Deve ser tratada como um problema de otimização combinatória. Mover o mínimo possível de memória
Fragmentação interna
Arredondar algumas requisições para evitar sobras e diminuir a fragmentação externa
A memória adicional alocada não será usada por quem requisitou
Esse desperdício dentro da área alocada é chamado fragmentação interna
Partições e Segmentos sofrem menos com esse problema pois o nível de arredondamento pode ser decidido caso a caso
Paginação sofre muito, as páginas possuem tamanho fixo. Uma forma de minimizar a perda é ter páginas menores, porém isso gera tabelas maiores e aumenta o custo de gerência
O alocador Buddy
Alocador por pares
Sempre aloca blocos de memória de tamanho 2^n, com n inteiro e ajustável
Reduz a fragmentação externa mas pode gerar muita fragmentação interna
Existem limites mínimos e máximos para o valor de n
Para alocar ele divide blocos maiores em dois até ter um de tamanho certo
Para liberar ele verifica se o par do bloco liberado também está livre, se estiver, ele funde os dois em uma maior. Chamada de coalescência
Variantes como Fibonacci ou estratégia com pesos
Usado em vários sistemas para alocação de memória física
O alocador Slab
Especializado na alocação de objeto de núcleo que são pequenos, continuamente criados e destruído e tem tamanhos padronizados
Alocar e liberar memória para objetos do núcleo usando alocador básico ou Buddy implicaria em muito custo e desperdício
É possível economizar custos de inicialização se os objetos forem mantidos na memória e reutilizados
Estratégia baseada no caching de objetos. É definido um cache para tipo de objeto usado pelo núcleo
Cada cache é divido em Slabs que contém objetos daquele tipo todos de mesmo tamanho
O Slab pode estar cheio, vazio ou parcial
Quando um novo objeto é requisitado o alocador analisa o cache daquele tipo e entrega um objeto livre de um Slab parcial. Caso não tenham parciais, ele entrega um vazio e muda seu status para parcial
Caso não tenham Slabs vazios, o alocador pede mais páginas de RAM para o alocador físico para criar um novo Slab
Quando um objeto é liberado ele é mercado como livre. Se todos os objetos do Slab ficarem livres ele muda para vazio. O alocador pode descartar Slabs vazios para ganhar espaço
Alocação no espaço de usuário
Cada processo recebe um área para alocação de variáveis dinâmicas chamada HEAP
O tamanho dessa área pode ser alterado através do ponteiro Program Break
A gerência do HEAP pode ser complexa e geralmente fica a cargo de bibliotecas do sistema
A biblioteca pode solicitar áreas fora do HEAP para funções específicas
As implementações mais simples de alocadores de uso geral seguem o esquema best-fit. Implementações mais sofisticadas usam DLmalloc e PTmalloc
Podem ser desenvolvidas alocadores custo-minimizados para aplicações específicas. Uma técnica muito utilizada em sistemas de tempo real é a memory pool