(57)【特許請求の範囲】
【請求項１】
２次記憶装置及び物理メモリのアクセスを監視可能とするコンピュータにて該コンピュータが備えるプロセッサにより仮想記憶管理用のプログラムを実行して、仮想記憶を使用するマルチタスキング・オペレーティングシステム上で同時に実行される複数のアプリケーションプログラム間で物理メモリを共有し、物理メモリの割り振りを制御する方法であって、
指定するコードまたはデータをグループに分類させることを要求するアプリケーションプログラムからのコールに応答して、前記アプリケーションプログラムによって指定された前記コードまたはデータを前記グループに分類する構造を作成するステップと、
前記グループのコードまたはデータの何れかの部分にアクセスする要求に応答して生成された不在割り込みを監視するステップと、
不在割り込みが前記グループのメモリユニットに対して発生した場合、不在割り込みが起きた場所の前記メモリユニット、及び前記グループのコードまたはデータを格納するために使用される全てのその他のメモリユニットをロードすることを含むステップであって、まだ物理メモリに存在していない前記グループの全てのコードまたはデータを、２次記憶装置から物理メモリ内に、一回でロードするステップと、
を含み、
前記監視ステップは、複数のグループ間で共有されるメモリブロックへのメモリアクセスを監視して、共有されたブロックにおけるメモリユニットの何れか１つがアクセスされた場合、前記共有されたブロックにおける全てのメモリユニットに、前記共有されるブロックを含むグループの数ｎの回数をマークするステップを含む、
方法。
【請求項２】
前記構造が、仮想メモリにおいて不連続な部分に格納されたコードまたはデータを一緒に連結する連結リスト構造を含む、
請求項１に記載する方法。
【請求項３】
前記連結リスト構造が、前記コードまたはデータの不連続な部分に関する仮想メモリのページを連結させている、
請求項２に記載する方法。
【請求項４】
前記アプリケーションプログラムによって指定されたコードまたはデータの追加のグループに対して請求項１のステップを繰り返すステップをも含む、
請求項１に記載する方法。
【請求項５】
複数のアプリケーションプログラムが、１つのメモリの部分として扱われるべきコードまたはデータの少なくとも１つのグループを指定するように同時に実行される場合に、不在割り込みの発生に応答して物理メモリ内へロードするための、各アプリケーションプログラムによって指定されたコードまたはデータのグループに対して請求項１のステップを繰り返すステップをも含む、
請求項４に記載する方法。
【請求項６】
前記不在割り込みが起きた場合、前記不在割り込みが起きたメモリ要求のアドレスが、前記グループにおける一連の不連続なメモリアドレスであるか否かを判断することによって、前記グループのメモリユニットに対して前記不在割り込みが起きたのか否かを検査するステップをも含む、
請求項１に記載する方法。
【請求項７】
前記グループのメモリユニットがアクセスされた場合に、前記グループのメモリユニットに対するメモリアクセスを監視して、前記グループの前記メモリユニットの全てが同時にアクセスされたものとマークするステップと、
前記メモリユニットがアクセスされた頻度、またはどのくらい最近に使用されたかに基づき、物理メモリから２次記憶装置へスワップするのかを判断するステップをも含む、
請求項１に記載する方法。
【請求項８】
前記グループを第１のグループとしたとき、該第１のグループと共有可能な指定されたコードまたはデータを第２のグループに分類することを要求するアプリケーションプログラムからのコールに応答して、第２の構造を作成し、前記アプリケーションプログラムによって指定された前記コードまたはデータを前記第２のグループに分類するステップと、
前記第１及び第２のグループのメモリユニットに対するメモリアクセスを監視し、前記第１及び第２のグループの両方に存在するメモリユニットがアクセスされた場合に、前記第１及び第２のグループのメモリユニットの全てがアクセスされたものとしてマークし、そして前記第１及び第２のグループの両方に存在する前記メモリユニットは２回アクセスされたものとしてマークするステップと、を含む、
請求項７に記載する方法。
【請求項９】
複数のグループ間で共有されるコードまたはデータのブロックがアクセスされた場合、前記ブロックが、前記ブロックを共有するグループ数ｎの回数だけアクセスされたことをマークするステップを含む、
請求項８に記載する方法。
【請求項１０】
請求項１の各ステップを実行するためのプログラムを格納するコンピュータ読み取り可能なメディア。
【請求項１１】
２次記憶装置及び物理メモリのアクセスを監視可能とするコンピュータにて該コンピュータが備えるプロセッサにより仮想記憶管理用のプログラムを実行して、仮想記憶を使用するマルチタスキング・オペレーティングシステム上で同時に実行される複数のアプリケーションプログラム間で物理メモリを共有するように機能する仮想記憶管理システムであって、
前記仮想記憶管理用のプログラムは、
２次記憶装置及び物理メモリ間でコードまたはデータをスワップし、アプリケーションプログラムに物理メモリを共有させ、２次記憶装置から物理メモリへメモリユニットをロードさせるための物理メモリマネージャと、
グループに入れられる前記コードまたはデータを指定するアプリケーションプログラムからの機能コールに応答して、前記グループのコードまたはデータをグループに分類させるためのＡＰＩモジュールと、
前記グループの何れかのコードまたはデータに対して出されたメモリ要求に応答して発生する不在割り込みを監視するとともに、まだ物理メモリに存在しない前記グループの他の全ての部分をロードするためのメモリモニタと、
を含み、
前記メモリモニタを実行することにより、複数のグループ間で共有されるメモリブロックへのメモリアクセスを監視することができ、共有されたブロックにおけるメモリユニットの何れか１つがアクセスされた場合、前記共有されたブロックにおける全てのメモリユニットに、前記共有されるブロックを含むグループの数ｎの回数をマークすることができるように機能する仮想記憶管理システム。
【請求項１２】
前記メモリモニタを実行することにより、グループのメモリユニットへのメモリアクセスを監視することができ、グループのメモリユニットの何れか１つがアクセスされた場合、全ての前記メモリユニットがアクセスされたものとしてマークすることができるようにする、
請求項１１に記載する仮想記憶管理システム。
【請求項１３】
前記物理メモリマネージャを実行することにより、メモリユニットへのメモリアクセスを監視することができ、物理メモリに存在しないコードまたはデータに対する要求を満足させる必要がある場合に、物理メモリから２次記憶装置へメモリユニットをスワップすることができるようにする、
請求項１１に記載する仮想記憶管理システム。
【請求項１４】
前記メモリユニットがページである、
請求項１３に記載する仮想記憶管理システム。
【請求項１５】
前記物理メモリマネージャを実行することにより、前記メモリユニットに対するメモリ要求に応答して、当該メモリユニットが使用されたものとしてマークし、
前記物理メモリマネージャを実行することにより、前記グループのメモリユニットがアクセスされた場合は、常にグループの全てのメモリユニットが使用されたものとしてマークし、
前記物理メモリマネージャを実行することにより、リースト・リーセントリ・ユーズド方式でどのメモリユニットが該当するかを判断することによって、どの前記メモリユニットを物理メモリから２次記憶装置へスワップするかを選択して、物理メモリに対するメモリ要求を満足させるようにする、
請求項１３に記載する仮想記憶管理システム。
【請求項１６】
前記ＡＰＩモジュールを実行することにより、同時に実行される複数のアプリケーションプログラムに応答し、グループに存在するメモリユニットに対する不在割り込みに応答して物理メモリへ一緒にロードされる複数のアプリケーションプログラムに対するコードまたはデータのグループを表わすデータ構造を保持することができるようにする、
請求項１１に記載する仮想記憶管理システム。
【請求項１７】
前記ＡＰＩモジュールを実行することにより、前記アプリケーションプログラムの実行時にコードまたはデータを動的に前記グループから追加または削除することができるようにする、
請求項１１に記載する仮想記憶管理システム。
【請求項１８】
前記ＡＰＩモジュールを実行することにより、前記グループを生成するか、または、前記グループの前記コードまたはデータを変更するための前記アプリケーションプログラムによる要求に基づき、前記グループに含まれるメモリブロックのリストを保持するデータ構造を作成し、動的に更新することができるようにする、
請求項１７に記載する仮想記憶管理システム。
【請求項１９】
プログラムを格納するコンピュータ読み取り可能なメディアであって、
前記プログラムは、２次記憶装置及び物理メモリのアクセスを監視可能とするコンピュータに、仮想記憶を使用するマルチタスキング・オペレーティングシステム上で同時に実行される複数のアプリケーションプログラム間での物理メモリの共有制御を実行させ、物理メモリの割り振りを制御させるためのものであり、
前記プログラムは、前記コンピュータに、
仮想記憶管理の目的で、１つのメモリユニットとして扱われるアプリケーションプログラムに関連するコードまたはデータを表わすブロックについて、一連のブロックからなるグループに対応するデータ構造であって、各ブロックのメモリアドレスのリスト及び前記リストにおける各ブロックのサイズを含むデータ構造を格納させ、
前記データ構造に基づいて、不在割り込みを監視させ、前記グループ内の１つの前記ブロックに含まれる場所を参照する何れかのメモリアドレスに対する不在割り込みが生成された場合、前記グループに含まれる全てのブロックを物理メモリ内にロードさせ、
複数のグループ間で共有されるメモリブロックへのメモリアクセスを監視して、共有されたブロックにおけるメモリユニットの何れか１つがアクセスされた場合、前記共有されたブロックにおける全てのメモリユニットに、前記共有されるブロックを含むグループの数ｎの回数をマークさせるためのものである、プログラムを格納するコンピュータ読み取り可能なメディア。
【発明の詳細な説明】
【０００１】
発明の分野
本発明は、コンピュータにおける仮想記憶の管理に関するものであり、特に、仮想記憶を使用し、プログラムを同時に実行させ、物理メモリを共有するコンピュータにおける物理メモリの割り振りを制御する方法に関する。
【０００２】
発明の背景
用語「仮想記憶」は、幾つかの同時に実行されるアプリケーションプログラムに、コンピュータの物理メモリを共有させる方法を示すものである。この物理メモリは、コンピュータプログラムを実行するために使用され、コンピュータのメインメモリを意味するものであり、典型的にはランダムアクセスメモリ（ＲＡＭ）として実装される。マルチタスキング・オペレーティングシステムは、典型的には仮想記憶を使用して、コンピュータにおいて実行されるアプリケーションプログラムの各々に対して使用可能なメモリを拡張するものである。仮想記憶は、アプリケーションに対してより多くのメモリを与える効果を持つ。この効果を得るために、仮想記憶マネージャ（ＶＭＭ）は、物理メモリのサイズよりも大きい仮想メモリスペースを用いてメモリを割り振る。このＶＭＭは、ハードディスク等のコンピュータにおける２次記憶スペースを使用して、物理メモリの事実上のサイズを拡張する。例えばリードやライト要求を処理する時のように、あるアプリケーションが実際に物理メモリを必要とする場合に限り、このＶＭＭは、プログラムコードやデータを２次記憶装置から物理メモリにロードする。
【０００３】
プログラムが仮想記憶に対してリードやライト要求をする場合、仮想記憶マネージャは、要求されたコードやデータが物理メモリにあるか、または２次記憶装置にあるかを判断する。コードまたはデータが物理メモリにある場合、仮想記憶マネージャは、仮想アドレスから、それが物理メモリのどこに位置するかについてを示す物理アドレスへとマップする。一方、コードまたはデータが物理メモリに無い場合、仮想記憶マネージャは、それを２次記憶装置からフェッチして、物理メモリに置く。このようにして、メモリ要求を満足させる必要に応じて、物理メモリのコードまたはデータをスワップインやスワップアウトさせることによって、仮想記憶マネージャは、アプリケーションに対して物理メモリを大きくしたように見せる。
【０００４】
仮想記憶の概念を説明するために、４メガバイトの物理メモリのパーソナルコンピュータで実行されるオペレーティングシステム、及び無限のメモリスペースを追加できるハードディスクドライブ（ハードディスク駆動装置）を考えることとする。このオペレーティングシステム自身で、物理メモリを１メガバイトまで占有する。このユーザが、ハードディスクドライブから２メガバイトを占有するゲームプログラムを起動させた場合、物理メモリを占有するメモリの合計は、約３メガバイトとなる。今、このゲームプログラムが、１メガバイトを越える追加のコードまたはデータをロードしようと試みると仮定する。これらの状況下では、コンピュータで現在実行しているプログラムに対するコードまたはデータを保持するのに十分な物理メモリは存在しない。
【０００５】
ＶＭＭは、実行プログラムを稼動させる必要に応じて、物理メモリとハードディスクドライブとの間でコードまたはデータをスワップインやスワップアウトさせることによって、この問題を解決するものである。例えば、あるコードの特定箇所の命令が実行される場合、そのコードのその特定部分は、コンピュータの物理メモリ内へロードされなければならない。そのコードのその他の部分は、それらが必要となるまで、ハードディスク内にとどまることができる。コードまたはデータが物理メモリに保持されていない時は、オペレーティングシステムは、常に、そのコードまたはデータに関するフラグを設定（またはクリア）することによって、それが不在であるとマークする。その後、そのコードまたはデータに対してアクセスが試行された場合、プロセッサは、不在割り込み（not present interrupt）を生成してオペレーティングシステムに問題を通知するであろう。このオペレーティングシステムは、それから、不在のコードまたはデータを、物理メモリの使用可能なエリア中にロードする手配を行い、割り込みを引き起こしたプログラムを再スタートさせる。ハードディスクドライブにおけるコードまたはデータのスワップインやスワップアウトと割り込みは、アプリケーションプログラムが割り込みを処理せず、データのスワップインやスワップアウトを管理しないという意味において、コンピュータで実行されるアプリケーションプログラムにとってはトランスペアレントである。むしろ、アプリケーションプログラムは、仮想記憶における仮想メモリアドレス空間だけを扱い、オペレーティングシステムが、仮想記憶に対する要求について物理メモリをマップし、物理メモリとハードディスクドライブ間でデータのスワップインやスワップアウトをするものである。
【０００６】
典型的な仮想記憶システムでは、幾つかのオペレーティングシステム・コンポーネントが、物理メモリにアクセスすることを保証され、そして幾つかのその他のソフトウェアコンポーネントが残りの物理メモリを取り合う。常に物理メモリを占有するオペレーティングシステム・コンポーネントには、オペレーテイングシステムのカーネル、及びディスクキャッシュといったメモリ常駐型コンポーネントが含まれる。残りの物理メモリは、動的にロードされるオペレーティングシステム・コンポーネント（ＤＬＬ）、アプリケーションプログラムやデータ、及び、オペレーティングシステムのファイルシステムに対するダイレクト・メモリ・アクセス（ＤＭＡ）バッファやキャッシュ領域のように動的に割り振られるメモリ領域、等のその他のソフトウェア間で共有する。
【０００７】
常に物理メモリを占有するオペレーティングシステム・コンポーネントは、物理メモリ上に「ロック」を持つ。「ロック」は、メモリ管理システムの属性であって、コードまたはデータに対して物理メモリの確約や予約、即ち保証を行う。そのメモリが割り込み時に実行可能でなければならないコードの一部、または割り込み時にアクセス可能である必要があるデータの一部を含む場合、または、データがコンピュータのハードウェア装置によって非同期的にアクセスされる必要がある場合に、多くのオペレーティングシステムは、典型的には物理メモリ上にそれをロックする。
【０００８】
初めに、このオペレーティングシステムは、アプリケーションプログラムに対して仮想メモリを割り振る。しかしながら、このオペレーティングシステムは、プログラムがメモリへのアクセスを試行するまでは、実際にはアプリケーションプログラムに対して物理メモリを割り振らないであろう。このシステムで実行されるコードが、プログラムに割り振られたメモリへのアクセスを試行すると、このオペレーティングシステムは、満杯になるまで物理メモリを割り振るであろう。そして、その後、一部の物理メモリのハードディスクドライブへのスワップを開始して、メモリへのアクセスを調整する。
【０００９】
この仮想記憶システムは、典型的には、スワップファイルと呼ばれるハードディスクドライブを使用し、コードまたはデータを物理メモリ上でスワップインやスワップアウトする。オペレーティングシステムは、ハードディスクドライブから直接的にアプリケーションプログラムの実行可能なコード（例えば、実行ファイル）等のコードをロードする。アプリケーションがプログラムデータへのアクセスを要求すると、オペレーテイングシステムは、物理メモリを割り振り、次に、一旦物理メモリが満杯になると、このプログラムデータを物理メモリからスワップアウトする。
【００１０】
実行時に、アプリケーションは、暗黙的にまたは明示的にメモリの追加を要求することができる。アプリケーションが、オペレーティングシステムに新規のウィンドウ等の資源を要求する場合に、暗黙的な要求が発生し、この資源の要求に応答する副次的な効果として、オペレーティングシステムは、メモリを割り振る。明示的な要求は、アプリケーションが直接的に機能を呼び出し、追加のメモリをアプリケーションに割り振るようにオペレーティングシステムに対して明確に要求した場合に起こる。両者の場合とも、オペレーテイングシステムは、仮想アドレススペースから資源を割り振るためにメモリを要求する。
【００１１】
現在、一般的に使用される仮想記憶の形態の１つは、ページ式仮想記憶と呼ばれるものである。ページ式仮想記憶機構では、オペレーテイングシステムが、ページと呼ばれるメモリユニットを用いて、全てのメモリの割り振り、割り振り解除、及びスワップ処理を実行する。例えば、インテル社の３８６アーキテクチャ互換のマイクロプロセッサでは、メモリは４Ｋのページであり、各々のメモリセグメントは、４Ｋページから構成される。ウィンドウズ（登録商標）９５オペレーテイングシステムは、ページ式仮想記憶システムを実現するオペレーティングシステムの一例である。
【００１２】
ページ式仮想記憶機構を説明するのに一般的に使用される用語には、ページング、ページファイル、及びページフォルトが含まれる。用語「ページング」は、物理メモリと２次記憶装置間におけるコードまたはデータのスワップのプロセスを示すものである。用語「ページファイル」は、２次記憶装置に格納され、物理メモリ上でスワップインやスワップアウトされるコードまたはデータのぺージを保持するスワップファイルを示すものである。最後に用語「ページフォルト」は、要求されたコードまたはデータを含むページが物理メモリ内に位置していないため、そのメモリ要求が物理メモリからは満足されなかったことを示すマイクロプロセッサによって生成される割り込みを示すものである。
【００１３】
どのような仮想記憶システムでも、詳細は、プロセッサの設計及びメモリアドレッシング機構に依存して変わるものである。パーソナルコンピュータ業界で最も広まっているプロセッサアーキテクチャの１つは、インテル社の３８６アーキテクチャである。このアーキテクチャの基本的なメモリ管理機能は、インテル社の４８６、ペンティアム、ペンティアムII、ペンティアムプロ・マイクロプロセッサでも使用されている。この３８６アーキテクチャは、リアルモード、プロテクトモード、及びバーチャルモードの３つのオペレーティングモードをサポートしている。リアルモードは、８０８６系列プロセッサとの互換性を保持するために使用されるモードを指すものである。このモードは、１メガバイトのメモリまでアドレス処理できる４つのセグメントレジスタを使用するセグメント式メモリアーキテクチャを持つものである。各々のセグメントレジスタは、メモリセグメントの最初の１バイト目をポイント(point)する。アドレスレジスタは、メモリセグメントの1バイト目のオフセットアドレスを格納する。このプロセッサは、セグメントレジスタとアドレスレジスタとの内容物を組み合わせ、完全なアドレスを生成させる。
【００１４】
プロテクトモードでは、このプロセッサは、セグメントレジスタの内容物を使用して、ディスクリプタ（descriptor）と呼ばれる８バイトのメモリエリアにアクセスする。このセグメントレジスタは、ディスクリプタテーブルへのインデックスを含むものである。このプロセッサは、ディスクリプタ内の情報を使用して、基底アドレス(base address)を生成する。その後、プロセッサは、アプリケーションプログラムからのオフセットアドレスと基底アドレスとを組み合わせ、物理メモリアドレスを計算する。このモードでは、オペレーティングシステムは、セグメントとして、物理メモリの任意の適切なエリアを使用することができる。アプリケーションのセグメントは、連続的な場所である必要はなく、違うサイズを有することができる。
【００１５】
バーチャルモードは、１つのセグメントが１メガバイトのみではなく４ギガバイトも可能であることを除いて、同じセグメントの概念を使用するという点でプロテクトモードに似ていて、そしてこのモードによってオペレーティングシステムは仮想記憶機構を実現することができる。プロテクトモードと同様に、バーチャルモードのプロセッサは、ディスクリプタテーブルへのインデックスとして、セグメントレジスタの内容物を使用する。このディスクリプタテーブルは、メモリセグメントの基底アドレスを指定するものである。オペレーティングシステムは、基底レジスタを設定し、コードまたはデータにおけるセグメントの最初の１バイト目をポイントする。プロセッサは３２ビットのオフセットアドレスと基底アドレスとを組み合わせて、最終的な３２ビットのアドレスを計算する。
【００１６】
３８６アーキテクチャにおいて仮想記憶が有効になっている場合、プロセッサは、この最終的に３２ビットアドレスに変換されたものを変更して、３２ビット物理アドレスへのマップを行う。初期化中に、オペレーティングシステムは、プロセッサをプロテクトモードにスイッチし、その後ページングを有効にする。基底アドレスとプログラムからのオフセットとを組み合わせることで計算されるこの３２ビットアドレスが、仮想メモリスペースにおけるアドレスである。
【００１７】
ページングが有効化されると、プロセッサは、仮想メモリスペースにおけるこのアドレスから、物理メモリスペースにおけるアドレスへマップする。図１は、プロセッサが、アプリケーションからの３２ビットアドレスをどのように変換するのかを説明するものである。上位１０ビット（ビット３１から２２）（図１の２０を参照されたい）は、ページテーブルディレクトリ（図１の２２）へのインデックスである。ページテーブルディレクトリにおける３２ビットの各々の部分は、ページテーブル（図１の２４）をポイントするものである。元のアドレスの次の１０ビット（ビット２０から１２）（図１の２６を参照されたい）は、個々のページテーブルへのインデックスである。ページテーブルエントリ（２８）の各々は、物理メモリのページをポイントするものである。仮想アドレスの残りの１２ビットは（ビット１１から０）（図１の３０を参照されたい）、メモリ上において、このページのオフセットを生成する。
【００１８】
オペレーテイングシステムは、実行中のプログラムに対するページテーブルディレクトリのアドレスをＣＲ３（３２）と呼ばれるプロセッサの特別なレジスタ内に格納する。新しいプログラムに対してオペレーティングシステムがページディレクトリをポイントすることができるように、オペレーティングシステムがタスクをスイッチするときは、毎回、ＣＲ３を再ロードする。仮想アドレスを物理アドレスへマッピングするプロセスは、プロセッサによって実行される。メモリキャッシング技術は、頻繁に使用されるページテーブルエントリが追加のメモリを参照することなく使用可能であることを保障する。
【００１９】
仮想記憶機構を完全にサポートするためには、ページテーブルエントリは、ページテーブルまたは物理アドレスへのポインタだけでなく、それ以外のものも含むものである。図２は、ページテーブル・ディレクトリ及びページテーブル構造（図２のアイテム４０と４２を参照されたい）内における１つの３２ビットワードの内容物を示すものである。ページテーブルディレクトリ及び各ページテーブルは、１つの４Ｋメモリページ（各々に１０２４エントリ）を消費する。これは、全体で４ＧＢのプログラム・アドレス・スペースを適切にアドレス処理させる。ページテーブル・ディレクトリ内のフラグビットによって、システムがページングファイルのあるディスク上へページテーブルを格納することを許される。このようにして、大きなプログラムに対して（例えば、２５６ページのページテーブルを必要とする１ＧＢのプログラム）、システムは、コードやデータのページと同様に、ページテーブルを物理メモリ上でスワップインやスワップアウトさせるであろう。
【００２０】
仮想記憶処理及び３８６メモリ保護システムを完全にサポートするためには、ページディレクトリ及びページテーブルエントリには幾つかのフラグビットを含ませる必要がある。プロセッサ自身は、これらのフラグビットの幾つかを直接変更する。オペレーティングシステムはその他について管理する。図２に示すように、これらのフラグは次のビット：Ｄ、Ａ、Ｕ／Ｓ、Ｒ／Ｗ、及びＰを含むものである。
【００２１】
プログラムがメモリページの内容物を変更した場合は、プロセッサは常に、対応するページテーブルにダーティ・ビット（図２のＤビット）をセットする。このことは、メモリからページを削除してスペースを開放したい場合には、最初にページをディスク上に書き出して、変更を保持しなければならないことを意味する。
【００２２】
リード、ライト、或いは実行等のページへの何らかの参照によって、プロセッサは、対応するページテーブルエントリ内のアクセスビット（図２のAビット）をセットする。仮想記憶マネージャは、このフラグを使用して、ページがどのくらいの頻度でアクセスされたかを判断することができる。ページがどのくらいの頻度でアクセスされたかを知る１つの方法は、このビットをセットし、定期的にチェックし、そのページがアクセスされたか否かを判断する方法である。使用の頻度が低いぺージのアクセスビットは、ハードウェアがアクセスビットをセットしない限り、変更されないであろう。同じ周期で確実に使用されるページを削除するよりも、このようなページをメモリから削除することは、賢明な選択である。ウィンドウズ（登録商標）９５オペレーティングシステムは、リースト・リーセントリ・ユーズド（ＬＲＵ）として知られるアルゴリズムを使用して、どのページをメモリから削除するかを決定する。最も新しく参照されたページほど、そのページは再割り振りされにくくなる。
【００２３】
テーブルエントリによってアドレス処理されるページテーブルまたはメモリページが、実際にメモリ内に存在する場合のみ、プレゼント（present）ビット（Ｐビット）を1にセットする。不在のページまたはページテーブルの参照が試行された場合、プロセッサは、不在割り込みを生成し、オペレーティングシステムは、ページをメモリにロードする手配をさせなければならず、そしてそのページを必要とするプログラムを再スタートさせる。
【００２４】
ユーザ／スーパーバイザ・ビット（U/Sビット）は、３８６の全体的な保護システム部である。U/Sビットが０にセットされた場合、このメモリページはスーパーバイザページであり、即ち、オペレーティングシステム自身のメモリ部であり、ユーザレベルのプログラムはそのページにアクセスすることができない。この部分への何らかのアクセスによって、オペレーティングシステムが取り扱わなければならない割り込みが引き起こされる。
【００２５】
リード／ライト ビット（R/Wビット）によって、対応するメモリページへのアクセスを望むプログラムが、そのページの内容物を変更できるか否かを判断する。１の値の場合は、ページ内容物の変更が許される。０の値の場合は、いかなるプログラムであっても、ページ内のデータの変更が許されない。通常、コードを含むページは、読み取り専用ぺージとしてセットされる。
【００２６】
上述したメモリアドレッシング機構によって、オペレーティングシステムは、仮想記憶システムを実現できる。今日のオペレーティングシステムにおける制限の１つとしては、仮想記憶が有効となっている場合に、どのように物理メモリが割り振られるかを制御してアプリケーションに柔軟性を与えることができないことである。アプリケーションプログラムは、典型的には、仮想メモリスペースのみアクセスを行い、どのように物理メモリを割り振るかを、殆ど、または全く制御することはない。このことは、アプリケーション開発を容易にするが、同時にアプリケーションのパフォーマンスの低下をもたらす。例えば、マルチメディアアプリケーションは、典型的には、アクティブ状態のときに大量のメモリを使用する。アプリケーションがアクティブ状態ではなくなった場合、仮想記憶システムは、アプリケーションのコード及びデータをハードディスク記憶装置にスワップする傾向がある。仮想記憶システムが、メモリ要求を満足させるようにスワッピング処理を実行する場合、ディスプレイ上のオブジェクトのスムーズで連続的な動き及びユーザインターフェイスの応答性が低下する。これは、アプリケーションがメモリにアクセスを試行する場合に、少量のコードまたはデータが、ハードディスクドライブからスワップインされるという仮想記憶システムの設計が原因である。
【００２７】
上述したように、マイクロソフト社のウィンドウズ（登録商標）９５オペレーティングシステム等の幾つかのオペレーテイングシステムは、ＬＲＵアルゴリズムを使用して、物理メモリ上におけるページのスワップインやスワップアウトを制御して、仮想記憶を実現している。一般的なルールとして、この仮想記憶システムは、オペレーティングシステムの動的にロードされたコンポーネントのページ、及びアプリケーションプログラムの全てのページに同じ優先度を与えている。このようにして、ゲームアプリケーションが、一時的にアクティブ状態でなくなった場合、オペレーティングシステムは、そのページを物理メモリからスワップアウトし易い状態となる。このアプリケーションが再びアクティブ状態になった場合、オペレーティングシステムが物理メモリにページを徐々にスワップインするため、ディスプレイ上のオブジェクトの動き及びユーザ入力に対するゲームの応答性が悪くなってしまう。
【００２８】
この問題を解決する１つの方法は、その他のコードがその物理メモリ部へアクセスしないように、アプリケーションに割り振られたその物理メモリをロックすることである。例えば、ウィンドウズ（登録商標）オペレーティングシステムでは、アプリケーションは、物理メモリに対してページロックを要求することができる。このページロックによって、オペレーティングシステムは、物理メモリを確実に予約して、その他の実行中のコードが使用可能な物理メモリのグループから、その物理メモリを削除する。同時に実行されるアプリケーションであって、物理メモリにアクセスする必要があるものが、物理メモリ上におけるその他のアプリケーションのロックのために物理メモリにアクセスできないという点で、システムパフォーマンスの極度の低下を招きかねないという理由によって、これは許容し得る解決策ではない。
【００２９】
発明の概要
本発明は、アプリケーションにコードまたはデータをグループに分類させ、アプリケーションがグループのコードまたはデータの何れかの部分にアクセスを試行する場合に、常にこのグループのコードまたはデータを一緒に物理メモリへロードさせるアプリケーション・プログラミング・インターフェイス（ＡＰＩ）に関するものである。このＡＰＩは、アプリケーションがリードやライトの要求をコード及びデータに対して行う際のページフォルトの過度な分散を防止することによって、アプリケーションに、仮想記憶システムにおけるパフォーマンスの改善をさせる。アプリケーションは、グループに必須の要素であるコード及びデータを指定する。物理メモリ内に存在しないグループのコードまたはデータに対してアプリケーションがアクセスを試行したため、オペレーティングシステムの仮想記憶システムが、不在割り込みの信号を発する場合、このＡＰＩは、このグループの全てのデータ及びデータを一緒に、物理メモリ内にロードさせる（例えば、このアプリケーションが実行を再開する前に、一連のメモリはロード処理される）。このようにして、２次記憶装置からコードまたはデータをロードする待ち時間は、一回の周期に圧縮され、これ以後、このグループの全てのコード及びデータは、物理メモリに存在することとなる。
【００３０】
本発明における追加の機能及び利点は、後述する詳細な説明及び添付の図面でより明確となるであろう。
【００３１】
本発明は、仮想記憶システムにおける物理メモリの割り振りをアプリケーションプログラムに制御させる仮想記憶管理システム及び方法を目的とするものである。本発明の一実施例では、ワシントン州レッドモンドのマイクロソフト社により市販されるウィンドウズR９５オペレーティングシステム用の「ダイレクトメモリ」と名づけれたアプリケーション・プログラミング・インターフェイス（ＡＰＩ）に本発明を適用する。簡単に説明すると、このＡＰＩは、オペレーティングシステムが物理メモリへのアクセスをどのように管理するかを、アプリケーションに制御させることをできるようにする一連の機能またはＡＰＩコールを提供するものである。
【００３２】
図３及び下記の説明は、本発明を具体化することができる適切なコンピューティング環境における簡単で一般的な説明の提供を意図するものである。本発明を、パーソナルコンピュータで実行されるコンピュータプログラムにおけるコンピュータ実行可能な命令の一般的な文脈で説明することとなるが、当業者は、本発明がその他のプログラムモジュールとの組み合わせでも実現することができることを理解するであろう。一般的に、プログラムモジュールは、個々のタスクを実行する、或いは個々の論理的なデータタイプを作成するルーチン、プログラム、コンポーネント、データ構造等を含むものである。更に、当業者は、本発明が、その他のハンドヘルドの装置、マイクロプロセッサシステム、マイクロプロセッサ型の或いはプログラム可能な大衆家電製品、ミニコンピュータ、メーンフレームコンピュータ等を含むコンピュータシステム構成で実施することができることを、理解するであろう。また、本発明は、通信ネットワークを介して接続されるリモート演算装置によってタスクが実行される分散コンピューティング環境でも実施できる。分散コンピューティング環境では、プログラムモジュールを、ローカル及びリモートの記憶装置に置くこともできる。
【００３３】
図３は、本発明の処理環境を提供するコンピュータシステムの実施例を説明するものである。このコンピュータシステムは、演算ユニット１２１と、システムメモリ１２２と、システムメモリを含む様々なシステムコンポーネントと演算ユニット１２１とを相互接続するシステムバス１２３と、を有するパーソナルコンピュータ１２０を含むものである。このシステムバスは、メモリバス、メモリコントローラ、周辺機器バス、及びＰＣＩ、ＶＥＳＡ、マイクロチャネル（ＭＣＡ）、ＩＳＡ、ＥＩＳＡ等のバスアーキテクチャを使用するローカルバスを含む何らかの幾つかのバス構造のタイプを含むこともできる。このシステムメモリは、読み取り専用メモリ（ＲＯＭ）１２４、ランダムアクセスメモリ（ＲＡＭ）１２５を含むものである。起動時等の場合に、パーソナルコンピュータ１２０の要素間で情報の伝達を助ける基本ルーチンを含む基本入出力システム１２６（ＢＩＯＳ）は、ＲＯＭ１２４に格納される。このパーソナルコンピュータ１２０は、ハードディスクドライブ１２７、磁気ディスクドライブ１２８、例えば読み書きできるリムーバブルディスク１２９、光学ディスクドライブ１３０、例えば読み取り用にＣＤ−ＲＯＭディスクドライブ１３１、及び読み書きできるその他の光学メディアをも含むものである。このハードディスクドライブ１２７、磁気ディスクドライブ１２８、及び光学ディスクドライブ１３０は、それぞれハードディスクドライブインターフェイス１３２、磁気ディスクドライブインターフェイス１３３、及び光学ディスクドライブインターフェイス１３４を介して、システムバス１２３に接続されている。これらのドライブ及びこれらに関するコンピュータ読み取り可能なメディアは、パーソナルコンピュータ１２０に対して、データ、データ構造、或いはコンピュータ実行可能な命令（ダイナミックリンクライブラリ、実行ファイル等のコード）等の不揮発性の記憶装置を提供する。上記ではハードディスク、リムーバブル磁気ディスク、及びＣＤと呼ばれるコンピュータ読み取り可能なメディアの説明をしたが、これらには、磁気カセット、フラッシュメモリカード、デジタルビデオディスク、或いはベルヌーイカートリッジ等のその他のタイプのコンピュータ読み取り可能なメディアも含むことができる。
【００３４】
ドライブ及びＲＡＭ１２５には、多数のプログラムモジュールを格納することができ、これには、オペレーテイングシステム１３５、アプリケーションプログラム１３６、その他のプログラムモジュール１３７、及びプログラムデータが含まれる。ユーザは、キーボード１４０及びマウス１４２等のポインティングデバイスを介して、コマンド及び情報を、パーソナルコンピュータ１２０に入力することができる。その他の入力装置（図には示さず）としては、マイクロフォン、ジョイスティック、ゲームパッド、パラボラアンテナ、及びスキャナ等を含むことができる。これらの及びその他の入力装置は、しばしば、システムバスに接続されるシリアルポートインターフェイス１４６を介して演算ユニット１２１に接続されるが、パラレルポート、ゲームポート、或いはユニバーサルシリアルバス（ＵＳＢ）等のその他のインターフェイスに接続することもできる。モニタ１４７或いはその他のタイプのディスプレイ装置も、ビデオアダプタ１４８等のインターフェイスを介してシステムバス１２３に接続される。このモニタに加えて、パーソナルコンピュータは、典型的には、スピーカ及びプリンタ等のその他の周辺出力装置（図には示さず）を含むものである。
【００３５】
このパーソナルコンピュータ１２０は、リモートコンピュータ１４９等のリモートコンピュータの論理的な結合を使用するネットワーク環境で動作させることもできる。このリモートコンピュータ１４９は、サーバ、ルータ、端末、或いはその他の一般的なネットワークノードとすることができ、典型的には、パーソナルコンピュータ１２０に関して説明した全ての要素或いは多くの要素を含むものであるが、図３においては記憶装置１５０のみを図示する。図３で図示される論理的な結合は、ローカルエリアネットワーク（ＬＡＮ）１５１、ワイドエリアネットワーク（ＷＡＮ）１５２を含むものである。このようなネットワーキング環境は、オフィス、企業間広域コンピュータネットワーク、イントラネット、或いはインターネットでは一般的なものである。
【００３６】
ＬＡＮネットワーキング環境で使用する場合は、このパーソナルコンピュータ１２０は、ネットワークインターフェイス或いはネットワークアダプタ１５３を介してローカルネットワーク１５１に接続される。ＷＡＮネットワーキング環境で使用する場合は、典型的には、このパーソナルコンピュータ１２０は、モデム５４、またはインターネットのようなワイドエリアネットワークを介して通信を確立させるその他の手段を含むものである。このモデム１５４は、内部または外部装置とすることができ、シリアスポートインターフェイス１４６を介してシステムバス１２３に接続される。ネットワーク環境では、パーソナルコンピュータ１２０に関して説明したプログラムモジュール、またはその中の一部は、リモート記憶装置に格納することができる。示されたネットワーク環境は、典型的なものであり、コンピュータ間で通信リンクを確立させるその他の手段を使用することもできることは理解されるであろう。
【００３７】
本発明の好適実施例の１つは、マルチタスキング・オペレーティングシステムで実行されるアプリケーションプログラムに、仮想記憶管理システムがどのように物理メモリを割り振るかを制御させるＡＰＩである。より具体的に言えば、このＡＰＩは、そのグループのコード及びデータが、物理メモリ内に一緒にロードされるように、アプリケーションに、そのコード及びデータをグループに分類させる機能を含むものである。この機能を実施させるためには、仮想記憶マネージャは、グループのコード及びデータを監視し続ける。アプリケーションがそのグループの命令またはデータ構造にアクセスを試行した場合は、常に仮想記憶システムは、そのコード及びデータのグループ全体を物理メモリ内にロードするであろう。
【００３８】
アプリケーションは、ＡＰＩ機能コールを呼び出して、そのグループに加えられるコードやデータのアドレス及びサイズを指定することによって、グループに分類される具体的なコード及びデータを指定する。コードに対しては、アプリケーションは、アプリケーションの機能または機能名を指定することができ、これは黙示的に実行コードのアドレスを提供する。データに対しては、アプリケーションは、構造のサイズと同様に、データ構造のポインタを指定することができる。
【００３９】
このＡＰＩの実施例では、ＡＰＩは、コード及びデータのグループへの分類に関連する４つの機能コール：１）CreateGroup、２）AddMemoryToGroup、
３）DestroyGroup、４）DeleteMemoryFromGroup、を含むものである。アプリケーションは、CreateGroup機能を呼び出し、グループのコードまたはデータの監視を続けるデータ構造を作成する。その後、アプリケーションは、AddMemoryToGroup機能を呼び出し、指定されたグループにコード及びデータを追加することができる。アプリケーションが、AddMemoryToGroup機能を呼び出す場合、機能名及びそのサイズを提供することによって、
AddMemoryToGroup機能はグループに追加されるコードを識別し、データ構造に対するポインタ及び構造のサイズを提供することによって、データ構造を識別する。グループから仮想メモリを削除するためには、アプリケーションは、DeleteMemoryFromGroup機能を呼び出し、削除されるコードまたはデータを指定する。グループから仮想メモリを追加または削除する場合、アプリケーションは、仮想メモリのブロックまたはブロックのセットを指定することによって、追加または削除される部分を指定することができる。ブロックは、仮想メモリの部分の開始アドレス及びそのサイズによって定義することができる。DestroyGroup機能は、以前に作成されたグループを破棄するために使用される。
【００４０】
コード及びデータをグループに分類するためのこのＡＰＩの実施例では、ウインドウズ（登録商標）９５オペレーティングシステムの仮想記憶管理システムと共同で処理を行う。特に、オペレーティングシステムの物理メモリマネージャのサービスを使用して、物理メモリを割り振り、コード及びデータを物理メモリ内にロードする。
【００４１】
図４は、コード及びデータをグループに分類するＡＰＩの実施例と、物理メモリマネージャとの関係を説明するものである。これらのアプリケーション（app.1-3）(161-163)は、アプリケーションがコンピュータで同時に実行され、コンピュータの物理メモリを共有することを表わすものである。これらのアプリケーションは、ＡＰＩ機能１６４を呼び出すことによって、物理メモリの割り振りを制御することができる。ＡＰＩ機能に付属する説明及び具体的な実施例については、下記の通りである。
【００４２】
このＡＰＩ機能１６４は、不在割り込みを監視するメモリモニタ１６５を含むものである。不在割り込みが検知された場合、メモリモニタ１６５は、割り込みが、アプリケーションによって指定されたグループのコードまたはデータが存在する場所で起きたか否かを判断する。もしも、そうであるならば、物理メモリマネージャ１６６を呼び出し、グループのコード及びデータを物理メモリ内（コンピュータのＲＡＭ）にロードさせる。メモリモニタ１６５によって提供されるそのグループのメモリの定義を使用して、物理メモリマネージャ１６６は、まだ物理メモリ内に存在しないそのグループのコードまたはデータをロードする。
【００４３】
図４は、あるアプリケーション（app.1）の仮想メモリスペース１７０を示して、このＡＰＩ処理を説明する。仮想メモリスペース１７０は、アプリケーション１６０に割り振られた仮想メモリの線形アドレススペースである。このマークされた区画１７２、１７４，１７６、及び１７８は、アプリケーションがメモリのグループに追加したコードまたはデータに関するこのアプリケーションの仮想メモリスペースの区画である。
【００４４】
グループを作成するためには、アプリケーションが、ＡＰＩ機能１６５の或る機能（CreateGroupと呼ばれる）を呼び出し、そのグループのコード及びデータのリストを保持するデータ構造を作成する。アプリケーションは、作成されるグループに入れられるコードまたはデータの区画を指定することができる。アプリケーションは、コード及びデータを格納するために使用される仮想メモリの区画のアドレス及びサイズを提供することによって、グループに入れられるコード及びデータを指定する。例えば、この実施例では、アプリケーションは、グループに入れられるメモリブロックのポインタの配列、及びブロックのサイズを提供するパラメータの配列を提供する。
【００４５】
グループを作成するための要求に応答して、このＡＰＩ機能は、メモリの全ての区画をリストアップしたデータ構造１９０を作成する。図４の例では、このデータ構造は、４つのメモリブロックのリストを含むものである。ブロックの各々のアドレスは、ブロックが存在する仮想メモリの位置（この場合は、マークされた区画１７２、１７４、１７６、及び１７８）をポイントする。また、このデータ構造１９０は、グループの仮想メモリにおけるブロックの各々のサイズを監視し続ける。
【００４６】
このデータ構造１９０から、ＡＰＩ機能は、グループのコードまたはデータに対応するメモリユニットのリストを生成する。このリストにおけるメモリユニットとは、物理メモリマネージャが、物理メモリを割り振り、仮想記憶機構を実現させるのに使用したメモリユニットを指すものである。このＡＰＩ機能は、メモリユニットが４Ｋページ等のページ式仮想記憶システム用に設計されたものである。物理メモリマネージャ１６６は、メモリユニットを４Ｋページ単位でハードディスクドライブ上でスワップインやスワップアウトさせる。
【００４７】
以前に作成されたグループにコードまたはデータを追加するためには、アプリケーションは、グループに追加されるコードまたはデータの仮想メモリにおける区画のアドレス及びサイズを指定する。これに対応して、ＡＰＩ機能１６４は、データ構造１９０を更新し、新しいメモリブロックを含ませる。また、これは、そのブロックに関する新しいメモリユニット（ページ）を計算し、ページ１９２の連結リストに追加する。
【００４８】
この連結リスト構造１９２は、アプリケーションがグループで指定したコードまたはデータを格納するのに使用されたページを監視し続ける。アプリケーションが、CreateGroup、またはAddMemoryToGroupでコードまたはデータのアドレス及びサイズを指定する場合、このＡＰＩ機能は、このコードまたはデータに相当するページを計算する。その後、連結リスト構造を使用して、これらのページをリング状に繋げる。連結リストは、可能な実施例の１つであり、ハッシュテーブルまたは他のリスト構造を使用するもの等、その他のものに代替できるものであることに留意されたい。
【００４９】
物理メモリマネージャ１６６は、２次記憶装置から物理メモリにページをロードすることを管理する。また、このマネージャは、物理メモリからのページのスワップを取り扱い、複数のアプリケーションは物理メモリを共有することができるようになる。この実施例では、物理メモリマネージャは、ウィンドウズR９５オペレーティングシステムの一部である。これは、物理メモリ及び２次記憶装置間でページをスワップするＬＲＵ機構を実現させ、物理メモリ内にページをロードするサービスを含むものである。ページまたはページのリストへの参照がされた場合、物理メモリマネージャ１６６は、指定されたページを物理メモリ内にロードすることができ、これらのページに対して、物理メモリ内に存在するということをマークすることができる。
【００５０】
メモリモニタ１６５は、不在割り込み（即ち、ページフォルト）を監視する。ページフォルトを検知すると、そのページのアドレスをチェックし、そのページが何れかのグループのページのリストに存在するか否かを判断する。このＡＰＩ機能では、幾つかの異なるグループを保持することができる。従って、メモリモニタ１６５は、各々のグループのページをチェックし、ページフォルトが、何れのグループのページに対するものであるかを判断する。この割り込みが、グループ（図４のアドレス１８０のように）のページに関連する場合、メモリモニタ１６５は、その一つ（または複数の）グループの一つ（または複数の）ページリストを物理メモリマネージャ１６６に渡し、そのページを含む各々のグループにおける各々のページをロードさせることを指示する。
【００５１】
物理メモリマネージャ１６６は、アプリケーションが実行を再開する前に、これらのページの全てを１回でロードする。このようにして、アプリケーションから見れば、これらのページは一緒にロードされることとなる。物理メモリマネージャは、メモリモニタによって提供されたグループのページのリストを詳細に検討し、物理メモリ内にまだロードされていないページを全てロードする。各々のページを保持するデータ構造が、物理メモリに存在するものとしてマークされているため、物理メモリマネージャは、ページが既に物理メモリ内に存在するか否かを判断する。
【００５２】
仮想記憶管理に対するコード及びデータをグループに分類する機能は、そのグループに存在する全てのページを一回でロードする待ち時間の点で、アプリケーションにとって不利になる。しかしながら、待ち時間は一回のロード処理に圧縮され、ページフォルトの過度な分散が起りにくくなるであろう。その上、グループの再ロードは、ディスクのシーク時間を最少化するように最適化されるが、これはページがランダムにロードされる場合には達成できないことである。
【００５３】
メモリをグループに分類するこのＡＰＩによって、仮想記憶管理の目的のためにグループのコード及びデータを等しく取り扱わせることとなる。更に、一緒にロードされるためには、仮想記憶管理の目的のために、このグループは１つのメモリユニットとして取り扱われる。具体的には、いつページを２次記憶装置にスワップアウトさせ、物理メモリに存在しないページに対するメモリ要求に応答して物理メモリを開放するのかを判断する目的のために、各々のグループの全てのページの使用が監視される。
【００５４】
ＬＲＵスワッピング機構の実施例では、グループの何れかのページがアクセスされた場合、グループの全てのぺージが、アクセスされたものとして取り扱われる。１つのグループにのみ存在するメモリブロックは、グループの何れかのページがアクセスされた場合、一旦使用されたものとしてマークされる。共有されるブロックの何れかのページがアクセスされた場合、複数のグループによって共有されるブロックは、常に、それが存在する各々のグループに対して使用されたものとしてマークされる。しかしながら、共有ブロックを含む何れかのグループにおいて共有ブロック以外のページがアクセスされた場合は、複数のグループで共有されたブロックであっても、常に、一回だけ使用されたものとしてマークされる。ここでは、ブロックは、一組のページを指す。ブロックがマークされた場合、そのブロックにある全てのページがマークされる。グループにある全てのぺージの使用が等しいものとされるため、実際の使用状況に拘わらず、後にＬＲＵ機構はグループのページブロックをほぼ同時に２次記憶装置へスワップすることになる。
【００５５】
物理メモリマネージャ１６６は、ページがアクセスされた場合に、そのページに対する参照回数を１つだけ増加させることによって、そのページの使用を監視する。この機構では、或るグループのページがアクセスされた場合、そのグループに含まれるすべてのブロックの参照回数が１つ増加される。共有ブロックにあるページがアクセスされた場合、ブロックを共有するグループの数だけ共有ブロックの参照回数を増加させる。
【００５６】
図５は、アプリケーションの仮想メモリスペース２００の実施例を示すものであって、仮装記憶管理システムが、どのようにアプリケーションのコード及びデータをグループに分類するかを説明するものである。この実施例におけるマークされた仮装メモリの区画（２０２、２０４、２０６，２０８，２１０，２１２，２１４，２１６）は、連結リスト構造でグループに分類され、アプリケーションによって指定されたコードまたはデータの第１グループを表わすものである。この実施例において、マークされた仮装メモリの区画（２２０，２０６，２２２，２２４，２２６）は、第２の連結リスト構造でグループに分類され、アプリケーションによって指定されたコードまたはデータの第２グループを表わすものである。実線の矢印は、第１グループのメモリ区画の連結を表わすものであり、破線の矢印は、第２グループのメモリ区画の連結を表わすものである。
【００５７】
これらのグループを作成したアプリケーションが第１グループのコードまたはデータ構造（例えばブロック２１４）の一部にアクセスを試行した場合、メモリモニタは、物理メモリマネージャに、番号２０２、２０４、２０６、２０８、２１０、２１２、２１４、及び２１６と呼ばれるブロックを物理メモリ内へロードするよう指示する。同様に、これらのグループを作成したアプリケーションが第２グループのコードまたはデータ構造（例えばブロック２１４）の一部にアクセスを試行した場合、メモリモニタは、物理メモリマネージャに、番号２２０、２０６、２２２、２２４、及び２２６と呼ばれるブロックを物理メモリ内へロードするよう指示する。アプリケーションがブロック２０６にアクセスを試行した場合、メモリモニタは、物理メモリマネージャに、第１及び第２グループ両方の全てのブロックをロードさせるよう指示するであろう。
【００５８】
物理メモリ内に一旦ロードされると、グループのメモリユニット（即ちページ）の参照回数がカウントされる。例えば、アプリケーションがブロック２１４にアクセスした場合、ブロック２１４及び第１グループにあるその他の全てのブロックのページの参照回数がカウントされる。同様に、アプリケーションがブロック２０４にあるコードへアクセスした場合、ブロック２０４及び第２グループにあるその他の全てのブロックにあるページの参照回数がカウントされる。アプリケーションが第１及び第２グループで共有されるブロックであるブロック２０６にあるコードへアクセスした場合、ブロック２０６のページを除いて、第１及び第２グループの各々のブロックにあるページの参照回数が一回カウントされる。ブロック２０６は２つのグループによって共有されているため、このブロック２０６のページの参照回数は、２回カウントされる。
【００５９】
「ダイレクトメモリ」と呼ばれる１つの実現可能なＡＰＩ機能の説明を、以下に示す。仮装記憶管理に対するコードまたはデータのグループへの分類に関する機能は、CreateGroup、AddMemoryToGroup、DeleteMemoryFromGroup、及びDestroyGroupを含むものである。
【００６０】
DirectMemory:::AddMemoryToGroup
HRESULT
DirectMemory::AddMemoryToGroup(dwGroupHandle,dwCount,lplpAddr,lpdwSize)
目的
以前に作成したグループに指定されたメモリブロックを加える。
パラメータ
dwGrouphandle
これは、以前に作られたグループを識別するために使用されるハンド
ル（handle）である。
dwCount
これは、lplpAddrによってポイントされたリスト内のメモリブロックの
数を示す。
lplpaddr
これは、このグループに加えられるべきメモリブロックのポインタの
配列である。
lpdwSize
これは、lplpAddrによってポイントされたメモリブロックの長さを示
すDWORDの配列である。
戻り値
DM_OK                処理成戟B
DMERR_BADGROUP       このグループはCreateGroupによって作成
されなかった。
【００６１】
DirectMemory:::CreateGroup
HRESULTDirectMemory::CreateGroup(dwFlags,lpdwGroupHandle,dwCount,lplpAddr,lpdwSize)
目的
仮想記憶管理の目的で１つのユニットとして取り扱われるべきメモリ区画を
含むグループを作成する。グループは、ページイン、ページアウト、ソフト
ロックされ、１つのものとして参照回数がカウントされるであろう。
パラメータ
dwFlags
DMGROUP_SOFTLOCK
DMGROUP_PRELOAD
lpdwGroupHandle
新グループハンドルが返されるＤＷＯＲＤをポイントする。
dwCount
これは、lplpAddrにポイントされたリスト内のメモリブロック
の数である。
lplpAddr
これは、作成されたものとして、このグループに加えられるメモリ
ブロックへのポインタの配列である。
lpdwSize
これは、lplpAddrによってポイントされたメモリブロックの長さを
示すDWORDの配列である。
戻り値
DM_OK                処理成功。
DMERR_BADDADDRESS     物理アドレス失敗。
【００６２】
DirectMemory::DeleteMemoryFromGroup
HRESULT DirectMemory::DeleteMemoryFromGroup(dwGroupHandle,
dwCount,lplpAddr)
目的
指定されたメモリブロックを以前に作成されたグループから削除する。この
コールは、指定されたブロックの全てが指定されたグループ内に存在しない場
合は失敗するであろう。
パラメータ
dwGroupHandle
これは、以前に作成したグループを識別するハンドルである。
dwCount
これは、lplpAddrによってポイントされたリスト内のメモリブロック数
である。
lplpAddr
これは、このブロックに加えられるメモリブロックのポインタの配列で
ある。
戻り値
DM_OK              処理成功。
DMERR_BADGROUP     このグループはCreateGroupによって作成されな
＝@      かった。
DMERR_BADBLOCKS    指定されたブロックの幾つかは、このグループを
＝@    構成するものではなかった。
【００６３】
DirectMemory::DestroyGroup
HRESULT DirectMemory::DestroyGroup(dwGroupHandle)
目的
この機能は、以前に作成されたグループを破棄する。このグループを構成す
る全てのページを開放する。これを破棄する前にグループから全てのページ
を開放する必要はない。
パラメータ
dwGroupHandle
CreateGroupによって以前に作成されたグループのハンドル。
戻り値
DM_OK               処理成功。
DMERR_BADGROUP      このグループハンドルはCreateGroupによっ
て作成されなかった。
【００６４】
DirectMemory::GetMaxPhysicalMemory
HRESULT     DirectMemory::GetMaxPhysicalMemory(dwFlags,lpdwNumPages)
目的
最高の場合にアプリケーションが使用可能な物理メモリのページ数を、アプ
リケーションに返す。
パラメータ
dwFlags
DMGMPM_EXCLUSIVEMODE  アプリケーションがフォーカス
（focus）を持つ場合の、そのアプリケーション用の物理メモリページ。      DMGMPM_SHARED    ＜Aプリケーションがフォーカスを持たない場合の、
≠サのアプリケーション用の物理メモリページ。
lpdwNumPages
物理メモリの４Ｋページの数。
戻り値
DM_OK                処理成功。
【００６５】
DirectMemory::GetProcessWorkingSetSize
HRESULT DirectMemory::GetProcessWorkingSetSize
(dwFlags,lpdwNumPages)
目的
このＡＰＩは、オペレーティングシステムがアプリケーションの現在のワ―
キングセットとして必要であると考えるものを返す。
パラメータ
dwFlags
DMSPWS_EXCLUSIVEMODE    アプリケーションがフォーカスを持
つ場合のアプリケーションのワーキングセット。
DMSPWS_SHARED                アプリケーションがフォーカスを持
たない場合のアプリケーションのワーキングセット。
lpdwNumPages
このアプリケーションが予約していた物理メモリの４Ｋページの数であ
るDWORDをポイントする。
戻り値
DM_OK                    処理成功。
DMERR_OUTOFMEMORY   要求されたワーキングセットサイズは、この
システムの物理メモリ制限を越えている。このアプリケーション用のワー
キングセットは変更されなかった。
【００６６】
DirectMemory::SetCooperativeLevel
HRESULT DirectMemory::SetCooperativeLevel(hWnd,dwFlags)
目的
アプリケーションが、ダイレクトメモリを使用し、ダイレクトメモリが、
このアプリケーションのフォーカスを監視するのに使用するべきhWndを
提供する方法を指定すること。
パラメータ
hWnd
これは、アプリケーションのフォーカスを表わすhWndである。
dwFlags
DMSCL_PRESERVESTATE    アプリケーションがフォーカスを失い、
リストアされた場合に、保持されるアプリケーションのメモリ状
況が、このフラグにセットされていれば、実行を開始する前にアプリーシ
ョンがフォーカスを回復する。
DMSCL_EXCLUSIVEMODE    使用されていないとマークさ
れ、あるアプリケーション専用であるページのＬＲＵ状況が、このフラ
グにセットされている場合、アプリケーションはフォーカスを失う。いか
なるソフトロックも開放される。そのアプリケーションがフォーカスを回
復した場合に、ソフトロックはリストアされる。
DMSCL_SHARED              開放されていないアプリケーシ
ョンの共有ソフトロックが、このフラグにセットされている場合、アプ
リケーションはフォーカスを失う。アプリケーションがフォーカスを持
たない場合は、ソフトロックを介してアプリケーションが使用可能なメ
モリは少ない。フォーカスを失うことを回避するソフトロックの方法はロ
ックを参照されたい。
戻り値
DM_OK                    処理成功。
DMERR_BADHWND        指定されたhwndは、不正、または、間違
ったタイプである。
【００６７】
DirectMemory::SetProcessWorkingSetSize
HRESULT DirectMemory::SetProcessWorkingSetSize
(dwFlags,dwNumPages)
目的
物理メモリの量がフリーの状態でアプリケーションに対して保持されるように、
アプリケーションが、オペレーティングシステムが必要とするそのワーキング
セットと通信することを、このＡＰＩは許可するものである。
パラメータ
dwFlags
DMSPWS_EXCLUSIVEMODE  アプリケーションがフォーカスを持つ
場合のアプリケーションのワーキングセットである。
DMSPWS_SHARED            アプリケーションがフォーカスを持
たない場合のアプリケーションのワーキングセットである。
DwNumPages        通常考えられる使用においてスラッシン
グを回避するために、このアプリケーションが必要とする、メモリの４Ｋ
ページの数。
戻り値
DM_OK                     処理成功。
DMERR_OUTOFMEMORY    要求されたワーキングセットは、このシ
ステムの物理メモリの限界を超えている。このアプリケーション用のワー
キングセットは変更されなかった。
【００６８】
DirectMemory::Lock
HRESULT Lock(dwFlags,lpAddr,dwsize)
目的
このＡＰＩは、ダイレクトメモリによって、監視されるメモリセグメントを
指定する。このセグメントは、ソフトロック、または
MOSTRECENTRYUSEDのグループに加えられる。アプリケーションがフ
ォーカスを回復した場合、ソフトロックのグループはリストアされ、そしてペ
ージはロックされる。エンドユーザによって指定された物理メモリの制限を越
える物理メモリの量が要求された場合、このコールは失敗することとなる。ソ
フトロック要求は、MOSTRECENTLYUSED要求よりも高優先度である。オ
ペレーティングシステムがメモリを必要とする場合、ソフトロックは上書きさ
れる。ソフトロックのメモリは、ＤＭＡ、または割り込みサービスルーチンに
使用すべきではない。
パラメータ
dwFlags
DMLOCK_SOFTLOCK        アプリケーションがフォーカスを持つ
場合、このメモリをページロックする。
DMLOCK_SHAREDSOFTLOCK  アプリケーションがフォーカスを持た
ない場合でさえ、このメモリをページロックする。その他のソフトロック
用ルールの全てが適用され、オペレーティングシステムは、依然として、
このメモリを再要求することができる。フォーカスを有しないアプリケー
ションによってソフトロックされたメモリ量は、著しくより抑圧されたも
のである。フォーカスを持つアプリーケーションは、優先度を持つ。
DMLOCK_MOSTRECENTLYUSED
lpAddr
作用するメモリの始点へのポインタ。このポインタは、３８６アーキテク
チャシステム上の最も近い４Ｋページ境界に切り下げされる。dwSize
パラメータは、同じ量に切り上げされる。
dwsize
作用するメモリの長さ。この、dwsizeパラメータは、最も近い４Ｋペー
ジ境界に切り上げされる。
戻り値
DM_OK                        処理成功。
DMERR_OUTOFMEMORY      要求を満足させる物理メモリが残ってい
ない。
【００６９】
DirectMemory::Unlock
HRESULT DirectMemory::Unlock(lpaddr)
目的
以前にロックされたメモリ区画上のソフトロック、または
MOSTRECENTLYUSED指定を開放すること。
パラメータ
lpaddr
以前にロックに渡されたポインタ
戻り値
DM_OK                    処理成功。
DMERR_NOTLOCKED      物理アドレスはロックされていなかった。
【００７０】
本発明を、具体的な実施例を参照して説明してきたが、本発明は、この特定の実施例に限定されるものではないことが、重要であることに留意されたい。この機能コールは、データ構造の様々な形態を使用する様々なプログラミング言語で実施することができる。例えば、メモリのグループを保持するためのデータ構造は、連結リストである必要はなく、ハッシュテーブル等のその他の通常のリストまたはテーブルの種類を使用して実施することもできる。この実施例は、ＬＲＵ機構を使用して、ページを物理メモリ上でスワップインやスワップアウトするページ式仮装記憶システムによって実現される。しかしながら、物理メモリを管理するために使用されるメモリユニットを変更することや、任意のサイズでさえ可能である。更に、物理メモリを開放する必要がある場合に、どのメモリユニットを２次記憶装置に戻すのかを判断するために、その他の通常のキャッシングアルゴリズムを使用することができる。
【００７１】
メモリブロックまたは潜在的なページの使用を監視するプロセスも、同様に変更できる。例えば、参照回数をカウントするのでなく、アクセスされた場合は、メモリブロックを、使用されたものとしてマークすることができ、所定の時間内にアクセスされない場合は、クリアすることができる。
【００７２】
このＡＰＩ機能は、ウィンドウズ（登録商標）９５またはウィンドウズ（登録商標）ＮＴオペレーティングシステムのようなマルチタスキング・オペレーティングシステムの仮装記憶システムの変形として実施することができる。或いは、オペレーティングシステムの機能を拡張させる分離されたモジュールとして実施することもできる。
【００７３】
本発明の原理は多数の可能な実施例に適用することが可能であり、説明された実施例は、本発明の好適な実施例に過ぎないと理解すべきであり、本発明の範囲を限定するものと解釈すべきではない。むしろ、本発明の範囲は、以下の請求の範囲で定義してある。従って、我々は、これらの請求の範囲及びその本質の範囲にある全てのものを、我々の発明として請求する。
【図面の簡単な説明】
【図１】  ３８６アーキテクチャにおける仮想記憶アドレッシング機構を説明する図である。
【図２】  図１に示したページテーブルディレクトリ及びページテーブルエントリを説明する図である。
【図３】  本発明を実施するためのオペレーティング環境を提供するコンピュータシステムを説明する図である。
【図４】  仮想記憶管理においてコード及びデータをグループに分類させるアプリケーション・プログラミング・インターフェイスの実施例を説明する図である。
【図５】  アプリケーションの仮想メモリスペースの実施例を説明し、仮想記憶管理システムが、どのようにアプリケーションのコード及びデータをグループに分類するかを示す図である。
【図１】
0004366012.tif 000002
【図２】
0004366012.tif 000003
【図３】
0004366012.tif 000004
【図４】
0004366012.tif 000005
【図５】
0004366012.tif 000006