プログラム・アドレス・スペースの概要

基本オペレーティング・システムは、アプリケーション・プログラムのメモリー使用を プログラミングするためのいくつかのサービスを備えています。

メモリーの割り当て、メモリーおよびファイルのマップ、およびアプリケーションのメモリー使用 のプロファイル作成を援助するためのツールが用意されています。 この項では、システムのメモリー管理アーキテクチャーとメモリー管理ポリシーの 背景を説明します。

システム・メモリー・アーキテクチャーの概要

このシステムは、物理ハードウェアの能力を拡張するソフトウェアを使用した、 メモリー管理方式を採用しています。 アドレス・スペースは実メモリーとは 1 対 1 で対応していないため、 アドレス・スペース (およびシステムがそれを実メモリーに対応させる方法) は、 仮想メモリーと呼ばれます。

仮想アドレスから物理アドレスへの変換を行うために協力する カーネルとハードウェアのサブシステムが、 メモリー管理サブシステムを構成しています。 複数のプロセスがメイン・メモリーを公平に共有するためにカーネルが行うアクシ ョンは、メモリー管理ポリシーを正しく構成します。 以下の節では、メモリー管理サブシステムの特性を詳しく説明します。

64 ビット・システムの物理アドレス・スペース

ハードウェアは、0x00000000000000000000 か ら 0xFFFFFFFFFFFFFFFFFFFF の 連続した範囲の仮想メモリー・アドレスを、データのアクセス用に用意しています。 合計のアドレス可能スペースは 1000000000000 テラバイトを超えます。 メモリー・アクセス命令は、64 ビットのアドレスを生成します。 このうち 36 ビットはセグメント・レジスターの選択用であり、 28 ビットはセグメント内のオフセットの指定用です。 このアドレッシング方式は、それぞれ 256 M バイトまでの 64 M セグメントを 超えるセグメントにアクセスすることを可能にしています。 各セグメント・レジスターには、28 ビット・オフセットへの接頭部になる、 52 ビットのセグメント ID が入り、 それが一緒になって仮想メモリー・アドレスを形成します。 その結果生じた 80 ビットの仮想アドレスが、 単一の大きなシステム全体の仮想メモリー・スペースを参照します。

プロセス・スペースは 64 ビット・アドレス・スペースです。 いいかえれば、プログラムは 64 ビット・ポインターを使用します。 しかし、各プロセスもしくは割り込みハンドラーがアドレスを指定できるのは、 セグメント ID がセグメント・レジスターにある、 システム全体の仮想メモリー・スペース (セグメント) だけです。

セグメント・レジスター・アドレッシング

システム・カーネルは、すべてのプロセスについて、いくつかの セグメント・レジスターのロードを従来の方法で行い、 ほとんどのプロセスが必要とするメモリー・アドレス能力を提供します。 これらのレジスターには、すべてのプロセスによって共有され、その内容が 非カーネル・プログラムには読み取り専用である、2 つのカーネル・セグメント、 および共有ライブラリー・セグメント、ならびに入出力デバイス・セグメント が組み込まれています。 また、プロセスの exec システム・コール用で、同じプログラムを実行する ほかのプロセスと読み取り専用で共有されるセグメント、読み取り/書き込みライブラリー・データ の入った私用共有ライブラリー・データ・セグメント、 ならびにプロセスに対しては私用の読み取り/書き込みセグメントもあります。 残りのセグメント・レジスターは、より多くのメモリーを提供するメモリー・マッピング 技法を用いるか、あるいはカーネルが与えるアクセス権限 に従って行うファイルへのメモリー・アクセスを介して、ロードすることができます。

システムの 32 ビット・アドレッシングと、間接機能によるアクセスにより、 各プロセスには、システム全体の仮想メモリー・スペースの実際のサイズには 左右されないインターフェースが与えられます。 セグメント・レジスターには、すべてのプロセスによって共有されるものもあれば、 プロセスのサブセットによって共用されるものあれば、さらには、1 つの プロセスしかアクセスできないものもあります。 共有は、複数のプロセスが 同じセグメント ID をロードできるようにして行われます。

ページング・スペース

大量の仮想メモリー・スペースを限られた実メモリーに収めるため、 システムは、実メモリーをワークスペースとして使用し、 非アクティブ・データやマップされないプログラムをディスク上に保持します。 このデータの入ったディスクの領域は、 ページング・スペースと呼ばれます。 ページとは、4K バイトのデータを保持し、 実記憶と補助記憶装置間で転送することができる、仮想メモリーの単位です。 システムは、ページング・スペース内のデータ もしくはプログラムが必要になると、次のようにします。

  1. 現在アクティブでないメモリーの領域を探す。
  2. そのメモリーの領域のデータまたはプログラムの最新コピーが、 必ずディスク上のページング・スペースにあるようにする。
  3. 新しいプログラムまたはデータを、 ディスク上のページング・スペースから、新たに解放されたメモリーの領域に読み取る。

メモリー管理ポリシー

実から仮想へのアドレスの変換や、その他の仮想メモリー機能のほとんどは、 仮想メモリー・マネージャー (VMM) によって透過的にシステムに提供されます。 VMM は、仮想メモリーを実現し、システムで使用できる物理的メモリーを上回る大 きさのセグメントの作成を可能にします。 VMM は、メモリーに移す必要があるページを検索するために使用する、 実メモリーのフリー・ページのリストを維持することによって、これを行います。

VMM は、現行ページ・データの一部を実メモリーから削除して、 フリー・リスト上のページを随時補充する必要があります。 データが必要になったときに、メモリーとディスク間でデータを移動するプロセスを、 「ページング」と呼びます。 ページングを行うために、VMM はページを次の 3 つのクラスに分類するページ・スチール・アルゴリズム (それぞれ に固有のエントリーと終了の基準を持つ) を使用します。

  • 作業用ストレージ・ページ
  • ローカル・ファイル・ページ
  • リモート・ファイル・ページ

一般に、作業ページに最高の優先順位があり、次がローカル・ファイル・ページであり、 その次がリモート・ファイル・ページという順になります。

さらに、VMM は、クロック・アルゴリズムとして知られる技法を用いて、 置換するページを選択します。 この技法は、ページごとに、 最近使用 (参照) されたページを示すものとして参照ビットを利用し ます。 ページ・スチール・ルーチンは、呼び出されると、ページ・フレーム・テーブルを循環して、各ページの参照ビットを調べます。 参照されずに、スチールできるページ (すなわち、固定されず、 かつほかのページ・スチール基準を満たしている) があると、 そのページはスチールされて、フリー・リストに入れられます。 参照されたページはスチールできませんが、その参照ビットはリセットされ、 実際にその参照は「加齢」し、そのページは次回ページ・スチール・アルゴリズム が出されたときに、スチールすることができるようになります。

メモリー割り当て

このオペレーティング・システムのバージョン 3 は、アプリケーションに 割り当てられたストレージに、遅延ページング・スロット技法を使用します。 すなわち、malloc のようなサブルーチンによって、 ストレージがアプリケーションに割り当てられたときに、そのストレージが 参照されるまでは、そのストレージにページング・スペースは割り当てられません。