Guard pages

Guard pages leves no kernel Linux: aumento de 5x em invocações de mapeamento de memória

A introdução de guard pages leves no kernel Linux, proposta por Lorenzo Stoakes, mostra um aumento de 5x na velocidade de mapeamento de memória e uma redução de 13% no uso de VMAs, otimizando o desempenho e uso de recursos.

Nova atualização lançada para o Linux Kernel, confira todos os detalhes

Lorenzo Stoakes, da Oracle, lidera uma nova proposta que traz melhorias significativas para o kernel Linux. A inovação se dá por meio de guard pages leves, otimizando o desempenho de processos e threads que precisam de áreas de memória protegidas, enquanto reduzem o uso de recursos do sistema. Esse avanço beneficia tanto desenvolvedores quanto usuários de sistemas Linux, especialmente aqueles com múltiplos processos rodando ao mesmo tempo.

O que são guard pages?

Proposta de patch para o kernel Linux 2024 sugerindo mudanças na interface com usuário, destacando uma nova abordagem para melhorar a usabilidade e eficiência do sistema.

As guard pages (ou páginas de guarda) são áreas especiais na memória que, quando acessadas por um programa, fazem com que o sistema envie um sinal fatal para interromper o processo. Isso ajuda a evitar que erros graves aconteçam, como acessar uma parte da memória que não deveria ser acessada. Para quem está menos familiarizado com termos técnicos, imagine que essas páginas de memória funcionam como barreiras que protegem o sistema de acidentes, como acessar dados indevidos.

Atualmente, no kernel Linux, essas barreiras são criadas usando um método chamado mmap() com a flag PROT_NONE. Esse método é eficiente, mas cada página de guarda precisa de uma “Área de Memória Virtual” (VMA), que é como o sistema organiza a memória de cada processo. O problema é que, em sistemas com muitos processos ou threads (linhas de execução), essas VMAs podem se acumular e consumir muita memória, além de dificultar a gestão eficiente dos recursos do sistema.

A inovação: guard pages leves

A nova abordagem proposta por Lorenzo Stoakes e sua equipe traz uma solução inteligente para esse problema. Em vez de criar uma VMA para cada guard page, o novo sistema coloca essas barreiras diretamente nas tabelas que organizam a memória. Ou seja, ao invés de precisar de várias VMAs, agora há uma única VMA que cobre toda a área que o processo pode acessar, incluindo as regiões protegidas pelas guard pages.

Essa mudança reduz o uso de memória e simplifica a gestão das áreas de proteção, tornando o sistema mais eficiente.

Resultados práticos

Os testes iniciais dessa nova abordagem mostraram resultados impressionantes. Ao combinar o uso de um comando especial chamado process_madvise() com as guard pages leves, a velocidade das invocações de mapeamento de memória aumentou em até 5 vezes. Além disso, foi observada uma redução de 13% nas VMAs em sistemas Android ociosos, o que significa menos uso de memória, mesmo com o código ainda não otimizado.

Para os não especialistas, isso significa que os processos que utilizam a memória do sistema vão rodar de forma mais rápida e eficiente, especialmente em dispositivos móveis ou em sistemas com muitos programas rodando ao mesmo tempo, como servidores.

Otimizações futuras

Embora os resultados já sejam animadores, a equipe espera que, com otimizações adicionais, especialmente em sistemas que lidam com grandes volumes de dados e processos, os benefícios sejam ainda maiores. Isso pode ter um impacto direto em servidores, aplicativos que fazem uso intenso de memória, e até mesmo em dispositivos móveis, melhorando o desempenho e reduzindo o consumo de recursos.

Comparação com envenenamento de memória

Uma característica interessante dessa implementação é a semelhança com o conceito de envenenamento de memória via hardware, onde determinadas áreas da memória são marcadas para evitar que sejam acessadas por engano. No entanto, aqui o “envenenamento” é controlado por software. Novos comandos, como MADV_GUARD_POISON (para ativar a proteção) e MADV_GUARD_UNPOISON (para desativá-la), permitem que os desenvolvedores decidam quando e onde aplicar essas proteções.

Para quem não é desenvolvedor, isso significa que o sistema pode marcar certas áreas da memória como “proibidas” para garantir que não sejam acessadas, evitando falhas no software.

Mais simplicidade no uso

Além disso, o novo método não apenas evita que várias proteções sejam aplicadas na mesma área, mas também permite desfazer a proteção sem afetar outras áreas. Isso significa mais controle e eficiência no uso da memória. É importante destacar que essa nova função não é pensada como uma medida de segurança (uma vez que um usuário pode remover a proteção), mas como uma forma de otimizar o uso de memória.

Para desenvolvedores e usuários curiosos

Para aqueles que querem entender ainda mais sobre essa novidade, a equipe de Stoakes disponibilizou uma série completa de patches, que inclui testes detalhados para garantir que tudo funcione conforme esperado. Com essa nova ferramenta, o Linux pode melhorar ainda mais seu desempenho em sistemas com alta carga de trabalho, como servidores e grandes ambientes corporativos.