# 仮想メモリとページング
## 定義
仮想メモリは、各プロセスとカーネルに専用の広大で線形なプライベートアドレス空間を提供する抽象であり、物理メモリ上の実際の配置をOSに委ねてソフトウェア開発を単純化する。仮想アドレス空間の分割によってマルチタスクを支援し、メインメモリの容量を超えたメモリ使用(オーバーサブスクリプション)を可能にする。ページングは、ページ(伝統的に4KBまたは8KB単位)をメインメモリに出し入れする仕組みで、外部からの移動をページイン、外部への移動をページアウトと呼ぶ。1962年のAtlas Computerで初めて導入され、部分的にロードされたプログラムの実行やメインメモリより大きいプログラムの実行を可能にした。ページキャッシュの追加後、ファイルシステムページング(メモリマップトファイルの読み書きによる「よい」ページング)と無名ページング(プロセスのヒープ・スタックを対象とし、必ずスワップデバイスへの移動を伴う「悪い」ページング。Linuxはこれをスワッピングと呼ぶ)の2種類に分かれた。デマンドページングをサポートするOS(ほとんどがそう)は、仮想メモリページを最初のアロケート時ではなく実際にアクセスが発生するまでマッピングを遅延させ、CPUのマッピング作成オーバーヘッドを先延ばしにする。この仕組みにより仮想メモリページは未アロケート/アロケート済み未マッピング/メインメモリにマッピング済み(常駐セットサイズ、RSS)/スワップデバイスにマッピング済み、の4状態を取る。オーバーコミットは、システムが格納できる容量(物理メモリとスワップデバイス容量の合計)以上のメモリアロケーションを認めるLinuxの機能で、アプリケーションがアロケートしたメモリの大部分を使わない傾向を当てにしてデマンドページングで実現される。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.2.1〜§7.2.4)
## 横断的知見
(このセクションは複数ソースの突き合わせで得られる知見を蓄積する。現時点では本概念に触れたソースが1件のため、蓄積を今後の ingest に委ねる。)
## 未解決の問い
- Linuxのオーバーコミット(vm.overcommit_memory=0のヒューリスティクス判定)は、コンテナ/cgroup環境でホスト全体のメモリ余力とcgroup個別の制限のどちらを優先して判断しているか。
- クラウドインスタンスのように高速な3D XPointクラスのスワップデバイスを使う場合、無名ページングは本当に「悪い」ページングでなくなるのか、どの閾値のレイテンシからその評価が変わるか。
- デマンドページングのマイナーフォールト率が高いワークロード(例: 頻繁なmalloc/free)で、ページフォールトのオーバーヘッド自体がボトルネックになる境界はどこにあるか。
## 関連
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] — 本概念の原典解説(§7.2)。
- [[Linuxメモリ回収]] — メインメモリが逼迫したときにカーネルがフリーリスト・ページキャッシュ・スワッピング・OOMキラーを使い分ける仕組み。
- [[詳解 システム・パフォーマンス 第2版]] — 書籍ハブ。
## 出典
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.2.1〜§7.2.4