- ページは、オペレーティングシステムがメモリを管理する最小単位
- ほとんどのCPUは4 KBのページサイズをサポートしており、Android OSとアプリケーションは4 KBのページサイズ向けに最適化されている
- ARM CPUは16 KBのページサイズをサポートしており、Androidがこのサイズを使用すると性能が5〜10%向上し、メモリ使用量は約9%増加する
- 全体的なオペレーティングシステム性能を改善し、デバイスメーカーがこうしたトレードオフを選択できるようにするため、Android 15は4 KBまたは16 KBのページサイズで実行可能
- 16 KBページサイズをサポートする最初のAndroidシステムは、一部のデバイスで開発者向けオプションとして提供される予定
16KBページサイズの技術的詳細
- ほとんどのCPUには、メモリ管理ユニット(MMU)という専用ハードウェアがあり、プログラムが使用中のアドレスをメモリの物理的位置に変換する
- この変換はページサイズ単位で行われる
- プログラムがより多くのメモリを必要とするたびに、オペレーティングシステムが介入して「ページテーブル」の項目を埋め、そのメモリ断片をプロセスに割り当てる必要がある
- ページサイズが4倍大きくなると、台帳記録の作業は4分の1になる。
- そのため、システムは動画をきれいに表示し、ゲームを快適に動かし、アプリを滑らかに実行することにより多くの時間を割けるようになり、低レベルのオペレーティングシステムの事務作業に費やす時間は減る
- ページサイズはApplication Binary Interface (ABI)ではない
- つまり、アプリケーションがページサイズに依存しないよう修正されれば、同じアプリケーションバイナリを4KBと16KBの両方のデバイスで実行できる
- Android 15では、さまざまなページサイズで実行できるようAndroidを一からリファクタリングし、ページサイズ非依存にした
主なOSの変更点
- Android 15ベースのデバイス:
- コンパイル時の
PAGE_SIZEマクロがランタイムのgetpagesize(2)に置き換えられた
- すべてのOSバイナリは16 KBにアラインされる(サードパーティ製アプリケーション/ライブラリは16KBにアラインされていない可能性がある)
- すべてのOSバイナリは、プロセスにマップされたすべてのメモリ領域を読み取れるように、個別のロード可能セグメントとしてビルドされており、一部のアプリケーションはこれに依存している
- 複数のOSコンポーネントが、ページサイズを前提としないように、またより大きなページサイズ向けに最適化されるよう書き直された
ファイルシステム
- 高性能な処理のためには、ファイルシステムのブロックサイズがページサイズと一致している必要がある。EROFSおよびF2FSファイルシステムとUFSストレージ層は16KB互換
- 4KBシステムでは、16KBアラインメントのために追加されたパディングによりELF実行ファイルのサイズが増えるが、複数の最適化によってこのコストを回避している
- Sparse読み取り専用ファイルシステムでは、16KBアラインメント用に追加されたパディングについて生成された0ページがディスクに書き込まれないようにする
- 読み書き可能なファイルシステムは、0ページをケースごとに処理する
メモリ管理
- Linuxのページキャッシュが修正され、この余分なパディング領域を先読みしないようにして、不要なメモリロードを節約
- このページは空のパディングであり、プログラムがこれを読むことは決してない。アラインメント目的でのみ、プログラムの使用可能部分の間にある空間である
Linuxカーネル
- Linuxカーネルは特定のページサイズと深く結び付いているため、カーネルをビルドする際に使用するページサイズを選択する必要があり、オペレーティングシステムの残りの部分は同じまま維持される
Androidアプリケーション
- ネイティブコードまたは依存関係を持つすべてのアプリケーションは、16KBページサイズのデバイスと互換性を持つよう再コンパイルする必要がある
- ほとんどのAndroidアプリケーションおよびSDK内のネイティブコードは4KBページサイズを前提にビルドされているため、16KB向けに再アラインして、バイナリが4KBおよび16KBの両方のデバイスと互換になるようにする必要がある
- ほとんどのアプリケーションおよびSDKでは、これは2段階のプロセスである:
- 16KBアラインメントでネイティブコードを再ビルド
- ページサイズに関するハードコードされた前提がある場合は、16KBデバイス/エミュレータでテストして修正
16 KBデバイスを開発する
- 現在生産されているAndroidデバイスは16 KBページサイズをサポートしていない
- この問題を解決するため、パートナーと協力して既存デバイスで開発者向けオプションを利用できるよう取り組んでいる
- 開発者向けオプションとして16 KBページサイズのサポートを提供する予定
- Android Studioで16 KBエミュレータターゲットを利用できる
16 KB開発者向けオプション
- Android 15で、16 KBと4 KBのページサイズを切り替えられる開発者向けオプションを実装
- Pixel 8およびPixel 8 Proで利用可能で、今後追加のデバイスでもサポート予定
- 開発者向けオプションを使用するには、デバイスを初期化してブートローダーをアンロックする必要がある
x86_64デスクトップでの16 KB
- x86_64エミュレータで16 KBページサイズをエミュレートできる
- Android StudioのSDKマネージャーから16 KBページエミュレータをダウンロードして実行できる
今後
- Android 15とAOSPは16 KBページをサポートしており、開発者向けオプションとして実装可能
- アプリケーションおよびSDK開発者がこのオプションを活用し、より高性能で効率的なAndroidデバイスに備えられることを期待している
GN⁺の意見
- 16KBページサイズへの移行は、Androidデバイスの性能と効率を向上させるための重要な変化
- より大きなページサイズを使用すると、メモリ管理オーバーヘッドが減少し、全体的なシステム性能が向上する可能性がある
- ただし、この変化は特にネイティブコードに依存するアプリやSDKに互換性の問題をもたらす可能性もあるため、開発者は16KBページサイズを念頭にソフトウェアを更新する必要がある
- Googleは16KB開発者向けオプションとエミュレータ対応を通じて、この移行をテストして準備できるツールを開発者に提供している
- 16KBページは現在ARMベースのAndroidデバイスにのみ適用されるが、将来的には他のハードウェアプラットフォームへ拡張される可能性がある
- 開発者はアプリやSDKを16KBページサイズに合わせることに加え、より大きなページサイズがメモリ使用量に与える影響を考慮し、必要に応じてメモリ最適化を行う必要がある
- 16KBページへの移行はAndroidエコシステム全体にわたる協力を必要とする重要な取り組みだが、最終的にはユーザーにより良い性能と効率をもたらすだろう
2件のコメント
Hacker News の意見
Debian カーネルで ARM64 カーネルを 16KiB ページサイズでビルドする作業が最近始まった
最初の 16KB 対応 Android システムが、開発者向けオプションとして一部の端末で提供される予定
アプリケーションがページサイズ非依存でない場合が気になる
4KB と 16KB のプロセスを同時にサポートせず、16KB をデフォルトにするのは問題がある
iOS は 64ビット移行後、16KB ページを使ってきた
RHEL は過去に AARCH64 で 64KB ページを試したが、多くのバグのため最終的に差し戻された
Asahi が 16KB ページを有効にするためのカーネルおよびエコシステムの作業にどれほど貢献したのか気になる
iOS はかなり前から 16K ページを使ってきた
ページサイズの増加が I/O 性能やフラッシュ寿命に悪影響を与えるのか気になる
性能改善は測定されている
5〜10% の性能向上は大きな数値に見える