- Página é a unidade mínima com que o sistema operacional gerencia a memória
- A maioria das CPUs oferece suporte a tamanho de página de 4 KB, e o Android OS e os aplicativos são otimizados para páginas de 4 KB
- CPUs ARM oferecem suporte a tamanho de página de 16 KB, e quando o Android usa esse tamanho, o desempenho melhora de 5% a 10%, enquanto o uso de memória aumenta cerca de 9%
- Para melhorar o desempenho geral do sistema operacional e permitir que fabricantes de dispositivos escolham esse trade-off, o Android 15 pode rodar com tamanho de página de 4 KB ou 16 KB
- O primeiro sistema Android com suporte a tamanho de página de 16 KB será disponibilizado como opção de desenvolvedor em alguns dispositivos
Detalhes técnicos sobre o tamanho de página de 16 KB
- A maioria das CPUs tem um hardware dedicado chamado unidade de gerenciamento de memória (MMU), que converte os endereços usados pelos programas em localizações físicas na memória
- Essa conversão é feita em unidades do tamanho da página
- Sempre que um programa precisa de mais memória, o sistema operacional precisa intervir para preencher entradas da "tabela de páginas" e atribuir esse bloco de memória ao processo
- Se o tamanho da página ficar 4 vezes maior, o trabalho de bookkeeping cai 4 vezes.
- Assim, o sistema pode dedicar mais tempo a exibir vídeos com qualidade, rodar jogos melhor e executar apps com mais fluidez, e menos tempo a tarefas administrativas de baixo nível do sistema operacional
- Tamanho de página não é uma Application Binary Interface (ABI)
- Ou seja, se os aplicativos forem ajustados para não depender do tamanho da página, o mesmo binário de aplicativo poderá rodar tanto em dispositivos de 4 KB quanto de 16 KB
- No Android 15, o Android foi refatorado desde a base para poder rodar com vários tamanhos de página, tornando-se independente desse tamanho
Principais mudanças no SO
- Dispositivos com Android 15:
- A macro
PAGE_SIZE em tempo de compilação foi substituída por getpagesize(2) em tempo de execução
- Todos os binários do SO são alinhados em 16 KB (aplicativos/bibliotecas de terceiros podem não estar alinhados em 16 KB)
- Todos os binários do SO são construídos com um segmento carregável separado para permitir leitura de todas as regiões de memória mapeadas no processo, algo do qual alguns aplicativos dependem
- Vários componentes do SO foram reescritos para não assumir um tamanho de página fixo e para serem otimizados para páginas maiores
Sistema de arquivos
- Para operações de alto desempenho, o tamanho do bloco do sistema de arquivos deve corresponder ao tamanho da página. Os sistemas de arquivos EROFS e F2FS, assim como a camada de armazenamento UFS, são compatíveis com 16 KB
- Em sistemas de 4 KB, o tamanho dos executáveis ELF aumenta por causa do padding adicional usado para alinhamento em 16 KB, mas várias otimizações evitam esse custo
- O sistema de arquivos esparso somente leitura garante que páginas zero geradas para o padding extra de alinhamento em 16 KB não sejam gravadas no disco
- Sistemas de arquivos com leitura/gravação tratam páginas zero caso a caso
Gerenciamento de memória
- O page cache do Linux foi modificado para não fazer prefetch desse espaço extra de padding, economizando carregamentos de memória desnecessários
- Essas páginas são padding vazio e o programa nunca as lê. É apenas espaço entre partes utilizáveis do programa para fins de alinhamento
Kernel Linux
- Como o kernel Linux é profundamente acoplado a um tamanho de página específico, é preciso escolher o tamanho da página ao compilar o kernel, enquanto o restante do sistema operacional permanece igual
Aplicativos Android
- Todos os aplicativos com código nativo ou dependências precisam ser recompilados para serem compatíveis com dispositivos com tamanho de página de 16 KB
- Como a maior parte do código nativo em aplicativos Android e SDKs foi construída pensando em páginas de 4 KB, é necessário realinhar para 16 KB para que os binários sejam compatíveis tanto com dispositivos de 4 KB quanto de 16 KB
- Para a maioria dos aplicativos e SDKs, isso é um processo em 2 etapas:
- Recompilar o código nativo com alinhamento de 16 KB
- Testar e corrigir em dispositivos/emuladores de 16 KB caso existam suposições codificadas diretamente sobre o tamanho da página
Desenvolvendo para dispositivos de 16 KB
- Atualmente, dispositivos Android em produção não oferecem suporte a tamanho de página de 16 KB
- Para resolver isso, estão trabalhando com parceiros para disponibilizar essa opção de desenvolvedor em dispositivos existentes
- Está previsto oferecer suporte a tamanho de página de 16 KB como opção de desenvolvedor
- É possível usar um alvo de emulador de 16 KB no Android Studio
Opção de desenvolvedor de 16 KB
- No Android 15, foi implementada uma opção de desenvolvedor para alternar entre tamanhos de página de 16 KB e 4 KB
- Disponível no Pixel 8 e Pixel 8 Pro, com suporte planejado para mais dispositivos
- Para usar a opção de desenvolvedor, é preciso redefinir o dispositivo e desbloquear o bootloader
16 KB em desktop x86_64
- É possível emular tamanho de página de 16 KB em um emulador x86_64
- É possível baixar e executar um emulador de páginas de 16 KB no Android Studio SDK Manager
Futuro
- Android 15 e o AOSP oferecem suporte a páginas de 16 KB, com implementação disponível por opção de desenvolvedor
- A expectativa é que desenvolvedores de aplicativos e SDKs aproveitem essa opção para preparar dispositivos Android mais rápidos e eficientes
Opinião do GN⁺
- A transição para tamanho de página de 16 KB é uma mudança importante para melhorar o desempenho e a eficiência de dispositivos Android
- O uso de páginas maiores pode reduzir o overhead de gerenciamento de memória e melhorar o desempenho geral do sistema
- No entanto, essa mudança também pode causar problemas de compatibilidade, especialmente para apps e SDKs que dependem de código nativo, então desenvolvedores precisam atualizar seu software pensando em páginas de 16 KB
- O Google está fornecendo ferramentas para que desenvolvedores testem e se preparem para essa transição, com a opção de desenvolvedor de 16 KB e suporte em emulador
- As páginas de 16 KB atualmente se aplicam apenas a dispositivos Android baseados em ARM, mas no futuro podem se expandir para outras plataformas de hardware
- Além de adaptar apps e SDKs ao tamanho de página de 16 KB, desenvolvedores também devem considerar o impacto de páginas maiores no uso de memória e fazer otimizações de memória quando necessário
- A transição para páginas de 16 KB é um esforço importante que exige colaboração de todo o ecossistema Android, mas no fim deve entregar melhor desempenho e eficiência aos usuários
2 comentários
Comentários no Hacker News
Recentemente começaram o trabalho, no kernel do Debian, para compilar o kernel ARM64 com tamanho de página de 16KiB
O primeiro sistema Android com suporte a 16KB deverá ser disponibilizado em alguns dispositivos por meio das opções de desenvolvedor
Há curiosidade sobre quando um aplicativo não é independente do tamanho de página
Usar 16KB como padrão sem dar suporte simultâneo a processos de 4KB e 16KB é problemático
O iOS usa páginas de 16KB desde a transição para 64 bits
O RHEL tentou no passado usar páginas de 64KB em AARCH64, mas acabou revertendo por causa de muitos bugs
Há curiosidade sobre quanto o Asahi ajudou no trabalho de kernel e ecossistema para viabilizar páginas de 16KB
O iOS usa páginas de 16K há muito tempo
Há curiosidade se o aumento do tamanho de página afeta negativamente o desempenho de I/O ou a vida útil do flash
Foram medidas melhorias de desempenho
Um ganho de desempenho de 5-10% parece bastante significativo