getconf
経由で構成を照会することで、システムのデフォルトのページ サイズを確認できます。 コマンド:
$ getconf PAGE_SIZE
4096
または
$ getconf PAGESIZE
4096
注: 上記の単位は通常バイト単位であるため、4096 は 4096 バイトまたは 4kB に相当します。
これは Linux カーネルのソースに組み込まれています:
例
$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT 12
#ifdef __ASSEMBLY__
#define PAGE_SIZE (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK (~(PAGE_SIZE-1))
どのようにシフトすると 4096 になりますか?
ビットをシフトすると、2 による 2 進乗算が実行されます。したがって、実際にはビットを左にシフトします (1 << PAGE_SHIFT
) は 2^12 =4096 の乗算を行っています。
$ echo "2^12" | bc
4096
ハードウェア (具体的には、CPU の一部である MMU) によって、可能なページ サイズが決まります。プロセッサのレジスタ サイズとは関係がなく、アドレス空間のサイズとは間接的な関係があるだけです (MMU が両方を決定するという点で)。
ほぼすべてのアーキテクチャが 4kB のページ サイズをサポートしています。より大きなページをサポートするアーキテクチャもありますが (小さなページもサポートするアーキテクチャもいくつかあります)、4kB は非常に広く普及しているデフォルトです。
Linux は 2 つのページ サイズをサポートしています:
- 標準サイズのページ。すべてのアーキテクチャでデフォルトで 4kB だと思いますが、一部のアーキテクチャでは他の値が許可されています。 ARM64 では 16kB、IA64 では 8kB、16kB、または 64kB。これらは、MMU の最も深いレベルの記述子 (Linux では PTE と呼ばれるもの) に対応しています。
- 巨大なページ (
CONFIG_HUGETLB_PAGE
でコンパイルされた場合) が必要で、CONFIG_HUGETLBFS
同様に、ほとんどの用途に使用できます)。これは、MMU 記述子 (Linux が PMD と呼ぶもの) の 2 番目に深いレベルに対応します (または、少なくとも通常はそうです。これがすべてのアーキテクチャに当てはまるかどうかはわかりません)。
ページ サイズは、メモリ使用量、メモリ使用量、および速度の妥協点です。
- ページ サイズが大きいほど、ページが部分的に使用されたときに無駄が増えるため、システムのメモリ不足が早くなります。
- より深い MMU 記述子レベルは、ページ テーブル用のカーネル メモリが多いことを意味します。
- より深い MMU 記述子レベルは、ページ テーブルのトラバーサルにより多くの時間を費やすことを意味します。
ほとんどのアプリケーションでは、ページ サイズを大きくしてもメリットはわずかですが、コストは相当なものです。これが、ほとんどのシステムが通常サイズのページのみを使用する理由です。
getconf
を使用して、システムの (通常の) ページ サイズを照会できます。 ユーティリティまたは C 関数 sysconf
.
$ getconf PAGE_SIZE
4096
huge page を使用するには hugetlbfs
をマウントする必要があります ファイルシステムと mmap
ping ファイルがあります。