1GB huge page - A escrita está ocorrendo em pedaços de 1 GB?

5

Estou tentando entender a relação entre o tamanho de página enorme e como os dados estão sendo gravados na RAM.

O que acontece quando um processo usa uma página enorme de 1 GB - a escrita ocorre em partes de 1 GB? Eu acho que estou completamente errado com essa suposição?

    
por BlackBeret 05.06.2014 / 14:05

2 respostas

5

Há mais de uma definição do tamanho do bloco para gravações de memória. Você pode considerar que é:

  • a largura da instrução loja (armazenar byte, armazenar palavra,…), normalmente 1, 2, 4, 8 ou 16;
  • a largura de uma linha cache , normalmente algo como 16 ou 64 bytes (e diferentes níveis de cache podem ter linhas diferentes larguras);
  • a largura do barramento de memória , que não é diretamente observável em software;
  • e possivelmente mais alguns sentidos razoáveis.

Nenhum deles está relacionado a um tamanho de página.

O tamanho da página é um atributo de uma página na MMU . A MMU traduz endereços virtuais (usados por programas) em endereços físicos (que designam um local físico na memória). O processo para traduzir um endereço virtual em um endereço físico é algo assim:

  • Pesquise o endereço da tabela de descritores de primeiro nível.
  • Extraia os bits de maior ordem do endereço virtual e use-os como um índice na tabela de descritores de primeiro nível.
  • Decodifique o descritor L1 naquele índice, que produz o endereço de uma tabela de descritores de segundo nível.
  • Extraia mais bits do endereço virtual e use-os como um índice na tabela de descritores de segundo nível.
  • Decodifique o descritor L2 nesse índice, que produz o endereço do início de uma página. Uma página é uma unidade de memória fisicamente contígua que é descrita por uma entrada na tabela MMU.
  • Mascare os bits restantes do endereço virtual com o endereço inicial da página para obter o endereço físico.

Arquiteturas comuns de 32 bits passam por dois níveis de tabela; arquiteturas comuns de 64 bits passam pelo 3. O Linux suporta até 4 níveis.

Algumas arquiteturas de CPU suportam tornar algumas páginas maiores, passando por menos níveis de indireção. Isso torna os acessos mais rápidos e mantém o tamanho das tabelas de páginas baixo, à custa de menos flexibilidade na alocação de memória. O ganho de tempo é mínimo para a maioria dos aplicativos, mas pode ser sentido em alguns aplicativos sensíveis ao desempenho que não se beneficiam da flexibilidade de páginas pequenas, como bancos de dados. Páginas enormes são páginas que passam por níveis menores que a quantidade normal e são correspondentemente maiores.

O software que está usando páginas grandes normalmente os solicita especificamente (por meio de sinalizadores para mmap , consulte como o tamanho da página é determinado no espaço de endereço virtual? para mais alguns detalhes). Após essa solicitação inicial, não é necessário saber ou se preocupar com o tamanho da página. Em particular, os acessos à memória são tratados pela MMU: o software não está envolvido no momento do acesso.

    
por 06.06.2014 / 04:35
5

Páginas enormes são para alocar pedaços de memória, não para escrevê-los.

Normalmente, quando os aplicativos precisam de grandes quantidades de memória, eles precisam alocar muitas "páginas". Uma página é simplesmente um pedaço de memória física. Normalmente este pedaço é apenas alguns KB. Assim, quando uma aplicação está realizando muitas operações intensivas de memória que abrangem muitas páginas, é caro para o kernel ter que traduzir todas as páginas de memória virtual para a memória física.

Para otimizar isso, o kernel oferece páginas enormes, que são basicamente alocações maiores que o tamanho de página padrão. Então, ao invés de ter que alocar milhares de páginas, isso só pega algumas. As leituras e gravações ainda são de qualquer tamanho que estão sendo lidas ou gravadas. Se o aplicativo gravar uma sequência de 10 bytes em uma página grande, ainda será uma gravação de 10 bytes.

    
por 05.06.2014 / 15:04