Gerenciamento de página nos kernels do SO

7

Eu olhei para alguns dos meus livros antigos de teoria do sistema operacional e notei que uma omissão flagrante em todos esses livros do sistema operacional é como realmente acompanhar as páginas físicas que são gratuitas (ou seja, algoritmos para realmente implementar a lista gratuita). Eu sei muito bem como os alocadores de memória da área de usuário funcionam, mas uma grande diferença com a alocação de páginas físicas é que a fragmentação de páginas físicas não deve ser um problema, pois a tabela de páginas pode simplesmente escolher as páginas físicas sem ter que se preocupar se elas são contíguos ou não. Como evitar a fragmentação é uma das principais preocupações dos alocadores de áreas de usuários, parece que a alocação de páginas físicas é fundamentalmente um problema diferente. Eu acho que isso não é completamente preciso se alguém quiser apoiar superpáginas para reduzir a pressão no TLB.

Minha pergunta: quais são as técnicas usadas nos kernels modernos de alto desempenho para esse problema? Além disso, esse problema se torna significativamente mais complicado nos sistemas NUMA?

eof
fonte

Respostas:

5

O gerenciamento de quadros de páginas é conceitualmente muito simples; tudo o que você realmente precisa é de uma lista vinculada. No entanto, existem dois fatores principais que complicam as coisas:

  • DMA. O DMA é uma das poucas coisas que podem precisar de um buffer físico maior que o tamanho de uma página. Além disso, existem dispositivos legados para enfrentar; no x86, por exemplo, dispositivos de 32 bits só podem fazer DMA a partir de endereços físicos abaixo do limite de 4G. Para o ISA, é ainda pior.
  • Coloração em cache , que é uma otimização extremamente importante.

A maioria dos sistemas operacionais usa técnicas surpreendentemente simples.

O Windows, por exemplo, usa apenas um monte de listas vinculadas (ou pelo menos o fez, da última vez que alguém disse algo sobre isso). É difícil dizer, já que não podemos ver o código-fonte, mas provavelmente existem listas vinculadas N * M em que N é o número de estados possíveis em que uma página pode estar (por exemplo, em uso, livre, aguardando a paginação) e M é o número de cores.

O Linux famoso usa um alocador de amigos para gerenciar páginas físicas, o que é apenas um pouco mais complicado do que um monte de listas vinculadas quando você pensa sobre isso.

Provavelmente, o esquema de gerenciamento mais sofisticado que foi documentado extensivamente é o do Solaris. Veja Bonwick & Adams, Magazines e Vmem: estendendo o alocador de placas para muitas CPUs e recursos arbitrários , USENIX 2001. Há também uma discussão extensa no livro Solaris Internals . O alocador de lajes Solaris apresenta muitos problemas para evitar contenção de bloqueios, trocas de cache e similares e também pode ajustar sua implementação para diferentes tipos de dados, conforme necessário.

O interessante é que o Solaris usa o mesmo alocador de memória para manipular quadros de página que ele usa para manipular objetos do kernel, aninhando alocadores de laje dentro de alocadores de laje. Definitivamente vale a pena ler o artigo.

Pseudônimo
fonte