(57)【特許請求の範囲】
【請求項１】
コンピュータで同時に実行中のアプリケーションプログラム間でフォーカスが変更されたときに、オペレーティングシステムでの前記フォーカスを監視し、前記コンピュータ内の物理メモリ割当ての状態を復元する方法において、
前記オペレーティングシステムに実装されたアプリケーションプログラムインタフェース（ＡＰＩ）を介して、前記オペレーティングシステムのフォーカスを監視するためのメモリモニタが実行され、前記アプリケーションプログラムから渡されたパラメータに基づいて、前記メモリモニタを実行するコンピュータが前記オペレーティングシステムから前記アプリケーションプログラムへのメッセージをフックして、前記フォーカスを監視する第１ステップと、
前記アプリケーションプログラムが前記フォーカスを失ったときに、前記メモリモニタを実行するコンピュータが物理メモリマネージャに要求して、物理メモリ内にある前記アプリケーションプログラムのコードまたはデータの部分を識別する状態情報を含むページテーブルから前記フォーカスを失ったアプリケーションプログラムの状態情報を受け取り、前記コードまたはデータの部分を記憶するページのリストを保存する第２ステップと、
前記アプリケーションプログラムを実行するコンピュータが前記ＡＰＩの関数を呼び出すと、前記アプリケーションプログラムが前記フォーカスを回復したときに、前記メモリモニタを実行するコンピュータが、前記保存されたページのリストを使用して前記物理メモリマネージャに命令し、前記物理メモリマネージャを実行するコンピュータが、前記アプリケーションプログラムの実行が再開される前に前記アプリケーションプログラムの前記コードまたはデータの部分を、前記保存されたページのリストに基づいて、２次記憶装置から前記物理メモリに再ロードする第３ステップと
を備えることを特徴とする方法。
【請求項２】
請求項１に記載の方法において、前記第１ステップは、
前記フォーカスが変更されたときを判定するために前記同時に実行中のアプリケーションプログラムのグラフィカルユーザインタフェースへのユーザ入力を監視するステップを含むことを特徴とする方法。
【請求項３】
請求項１に記載の方法において、
前記物理メモリの割当ての状態を保存するための前記アプリケーションプログラムからのＡＰＩ関数呼出しに応答して、請求項１に記載の第１から第３ステップを実行することを特徴とする方法。
【請求項４】
請求項１に記載の方法において、
別の同時に実行中のアプリケーションプログラムに対して請求項１に記載の第１から第３ステップを繰り返すことを特徴とする方法。
【請求項５】
コンピュータに、請求項１に記載の方法を実行させるための命令を記憶するコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【０００１】
（発明の分野）
本発明は、コンピュータのメモリ管理に関し、より詳細には、同時に実行中のプログラムが、物理メモリを共用することを仮想メモリを使用して可能とするマルチタスクオペレーティングシステム内で、物理メモリの状態を制御する方法に関する。
【０００２】
（発明の背景）
「仮想メモリ」という用語は、同時に実行中のいくつかのアプリケーションプログラムが、コンピュータの物理メモリを共用できるようにする方法を指す。物理メモリは、コンピュータプログラムの実行に使用されるコンピュータのメインメモリを指し、一般にランダムアクセスメモリ（ＲＡＭ）を用いて実装される。マルチタスクオペレーティングシステムは、一般に、仮想メモリを使用して、コンピュータで実行されるそれぞれのアプリケーションプログラムが使用可能なメモリを拡張する。仮想メモリは、アプリケーションから見たときにメモリがはるかに大きく見える効果を有する。この効果を生み出すために、仮想メモリマネージャ（ＶＭＭ）が、物理メモリのサイズよりもはるかに大きな仮想メモリ空間からメモリを割り当てる。ＶＭＭは、ハードディスクなどのコンピュータの２次記憶空間を使用して、物理メモリの有効サイズを拡大する。ＶＭＭが、２次記憶装置から物理メモリにコードおよびデータをロードするのは、アプリケーションが実際にそれを必要としているときだけであり、例えば、読取りまたは書込み要求を処理するときである。
【０００３】
プログラムが仮想メモリに対する読取りまたは書込み要求をすると、仮想メモリマネージャは、要求されたコードまたはデータが物理メモリと２次記憶装置のどちらに存在するかを判断する。物理メモリ内にある場合、仮想メモリマネージャは仮想アドレスを、物理メモリ内のコードまたはデータが存在する物理アドレスにマッピングする。一方、コードまたはデータが物理メモリにない場合には、仮想メモリマネージャは、２次記憶装置からそれを取り出して物理メモリの中に置く。このように仮想メモリマネージャは、メモリ要求を満たす必要に応じて物理メモリとの間でプログラムコードおよびデータをスワッピングすることにより、アプリケーションから見た場合に物理メモリが大きく見えるようにする。
【０００４】
仮想メモリの概念を示すため、４メガバイトの物理メモリおよび追加の空きメモリ空間を有するハードドライブを備えたパーソナルコンピュータ上で実行されるオペレーティングシステムの例を考える。オペレーティングシステムは、それ自体が最大１メガバイトの物理メモリを占有するとする。ユーザが、２メガバイトを占有するゲームプログラムをハードドライブから起動したい場合、占有される物理メモリは全体で約３メガバイトとなる。次に、ゲームプログラムが、１メガバイトを超える追加のコードまたはデータファイルをロードしようとすると仮定する。この状況では物理メモリが不足し、コンピュータで現在実行中のプログラムのこれらコードおよびデータを保持することができない。
【０００５】
ＶＭＭはこの問題を、実行中のプログラムを走らせるのに必要なコードおよびデータを、物理メモリとハードドライブの間でスワップすることによって解決する。例えば、特定のコードからなる命令を実行する場合には、このコードをコンピュータの物理メモリにロードしなければならない。その他のコードは、必要となるまでディスク上に置いておいてかまわない。あるコードまたはデータが物理メモリにない場合、オペレーティングシステムは、そのコードまたはデータに関連したフラグをセット（またはクリア）することによってその不在を常に記録している。そのコードまたはデータへのアクセスが試みられた場合、プロセッサは、オペレーティングシステムに問題があることを知らせる不在割込みを生成する。オペレーティングシステムは、不在のコードまたはデータを物理メモリの使用可能領域にロードするよう手配し、割込みの原因となったプログラムを再起動させる。ハードドライブと割込みとの間のコードおよびデータのスワッピングは、アプリケーションプログラムがこの割込みを処理せず、データのスワッピングも管理しないという意味において、コンピュータで実行中のアプリケーションプログラムに対して透過である。アプリケーションプログラムは、仮想メモリの仮想アドレス空間のみを取り扱い、オペレーティングシステムは、仮想メモリに対する要求を物理メモリにマッピングし、また、物理メモリとハードドライブの間でデータをスワップする。
【０００６】
一般的な仮想メモリシステムでは、いくつかのオペレーティングシステムコンポーネントに物理メモリの一部分へのアクセスが保証されており、その他のいくつかのソフトウェアコンポーネントが残りの物理メモリを争う。物理メモリを常時占有するオペレーティングシステムコンポーネントには、オペレーティングシステムのカーネルのメモリ常駐コンポーネントおよびディスクキャッシュなどがある。残りの物理メモリは、動的にロードされるオペレーティングシステムコンポーネント（ＤＬＬ）、アプリケーションプログラムのコードおよびデータなどのその他のソフトウェア、ならびにダイレクトメモリアクセス（ＤＭＡ）バッファ、オペレーティングシステムのファイルシステム用のキャッシュ領域などの動的に割り当てられるメモリ領域によって共用される。
【０００７】
物理メモリを常時占有するオペレーティングシステムコンポーネントは、物理メモリの一部分を「ロック」する。「ロック」は、物理メモリの一部分をコードまたはデータにコミットすなわち予約するメモリ管理システムの属性である。多くのオペレーティングシステムでは、割込み時に実行可能でなければならないコード、割込み時にアクセス可能である必要があるデータ、またはコンピュータのハードウェア装置が非同期にアクセスする必要があるデータを物理メモリが含む場合に、一般に物理メモリの一部分がロックされる。
【０００８】
最初に、オペレーティングシステムは、アプリケーションプログラムに仮想メモリを割り当てる。しかし、オペレーティングシステムは、アプリケーションプログラムがメモリへのアクセスを試みない限り、そのプログラムに実際に物理メモリを割り当てることはしない。システムで実行中のコードがそれに割り当てられたメモリへのアクセスを試みると、オペレーティングシステムは、物理メモリをそれがいっぱいになるまで割り当て、次いで、物理メモリの一部をハードドライブにスワップして、メモリアクセスに対応する。
【０００９】
仮想メモリシステムは一般に、ハードドライブのスワップファイルと呼ばれる部分を使用して、物理メモリとの間でコードおよびデータをスワッピングする。オペレーティングシステムは、アプリケーションプログラムの実行可能コード（例えば．ａ．ｅｘｅファイル）などのプログラムコードをハードドライブから直接にロードする。アプリケーションがプログラムデータへのアクセスを要求すると、オペレーティングシステムは物理メモリを割り当て、物理メモリがいっぱいになると、続いて物理メモリとの間でのこのプログラムデータをスワップする。
【００１０】
実行時、アプリケーションは、追加メモリを暗黙的にまたは明示的に要求する。暗黙的要求は、アプリケーションが、新たなウィンドウなどのリソースをオペレーティングシステムに要求したときに生じ、オペレーティングシステムは、このリソース要求に対する応答の副次的結果としてメモリを割り当てる。明示的要求は、アプリケーションが、追加メモリの割当てをオペレーティングシステムに明確に要求する関数を直接に呼び出したときに生じる。どちらの場合もオペレーティングシステムは、リソース割当て用のメモリを仮想アドレス空間から要求する。
【００１１】
現在一般に使用されている仮想メモリの一形態が、ページド仮想メモリと呼ばれるものである。ページド仮想メモリ方式では、オペレーティングシステムが、メモリ割当て、割当て解除およびスワッピング操作の全てを、ページと呼ばれるメモリ単位で実行する。例えば、Ｉｎｔｅｌ社の３８６アーキテクチャと互換のマイクロプロセッサでは、１メモリページが４Ｋであり、それぞれのメモリセグメントが、１ページまたは複数の４Ｋページから成る。Ｗｉｎｄｏｗｓ（登録商標）９５オペレーティングシステムは、ページド仮想メモリシステムを実装するオペレーティングシステムの一例である。
【００１２】
ページド仮想メモリ方式を説明するのに一般に使用される用語には、ページング、ページファイル、ページフォールトがある。用語「ページング」は、物理メモリと２次記憶装置の間でコードまたはデータをスワッピングする処理を表す。用語「ページファイル」は、物理メモリとの間でスワップされたコードおよびデータのページを保持するために２次記憶装置に保持されたスワップファイルを表す。最後に、用語「ページフォールト」は、要求されたコードまたはデータを含むページが物理メモリにないため、物理メモリでメモリ要求を満たすことができないことを示す、マイクロプロセッサによって生成される割込みを表す。
【００１３】
仮想メモリシステム実装の詳細は、プロセッサの設計およびメモリアドレッシング方式によって変わってくる。Ｉｎｔｅｌ社の３８６アーキテクチャは、パーソナルコンピュータ産業界で最も広範に普及しているプロセッサアーキテクチャの１つである。このアーキテクチャの基本メモリ管理機能は、Ｉｎｔｅｌ社の４８６、Ｐｅｎｔｉｕｍ、Ｐｅｎｔｉｕｍ  ＩＩ、およびＰｅｎｔｉｕｍ  Ｐｒｏマイクロプロセッサで使用されている。３８６アーキテクチャは、３つの動作モード、すなわちリアルモード、プロテクトモードおよび仮想モードをサポートする。リアルモードは、８０８６系プロセッサとの互換性を維持するために使用されるモードである。このモードは、４つのセグメントレジスタを使用して最大１メガバイトのメモリをアドレス指定するセグメント化メモリアーキテクチャを有する。それぞれのセグメントレジスタは、メモリセグメントの最初のバイトを指す。アドレスレジスタは、メモリセグメント内のバイトに対するオフセットアドレスを記憶する。プロセッサは、セグメントレジスタの内容をアドレスレジスタと結合し、完全なアドレスを生成する。
【００１４】
プロテクトモードでは、プロセッサがセグメントレジスタの内容を使用して、ディスクリプタと呼ばれる８バイトのメモリ領域にアクセスする。セグメントレジスタは、ディスクリプタのテーブルの索引を含む。プロセッサは、ディスクリプタの中の情報を使用してベースアドレスを生成する。プロセッサは次いで、アプリケーションプログラムからのオフセットアドレスをベースアドレスに結合して、物理メモリを計算する。このモードではオペレーティングシステムが、適当な任意の物理メモリ領域をセグメントとして使用することができる。１つのアプリケーションのセグメントは、連続している必要はなく、異なるサイズを有することができる。
【００１５】
仮想モードは、同じ概念のセグメントを使用する点でプロテクトモードと類似しているが、１セグメントが１メガバイトどころか４ギガバイトとなる点が異なり、仮想モードによって、オペレーティングシステムは仮想メモリ方式を実装することができる。プロテクトモードと同様に、仮想モードにあるプロセッサは、セグメントレジスタの内容をディスクリプタテーブルの索引として使用する。ディスクリプタテーブルは、メモリセグメントのベースアドレスを指定する。オペレーティングシステムは、このベースレジスタをプログラムのコードまたはデータセグメントの最初のバイトを指すようにセットする。プロセッサは、３２ビットのオフセットアドレスをベースアドレスに結合して、最終的な３２ビットアドレスを計算する。
【００１６】
３８６アーキテクチャで仮想メモリが使用可能となると、プロセッサは、３２ビットの物理アドレスにマッピングするための最終的な３２ビットアドレスの解釈を変更する。初期化中にオペレーティングシステムは、プロセッサをプロテクトモードに切換え、次いでページングを使用可能にする。ベースアドレスをプログラムからのオフセットと結合することによって計算される３２ビットアドレスは、仮想メモリ空間のアドレスである。
【００１７】
ページングが使用可能な状態で、プロセッサは、この仮想メモリ空間のアドレスを物理メモリ空間のアドレスにマッピングする。図１は、アプリケーションからの３２ビットアドレスをプロセッサが解釈する方法を示す図である。先頭の１０ビット（３１．．２２）（図１の２０参照）は、ページテーブルディレクトリ（図１の２２）の索引である。ページテーブルディレクトリ中の３２ビット部分はそれぞれ、ページテーブル（図１の２４）を指す。オリジナルアドレスの次の１０ビット（２１．．１２）（図１の２６参照）は、特定のページテーブルの索引である。ページテーブルエントリ部分（２８）はそれぞれ、１ページの物理メモリを指す。仮想アドレスの残りの１２ビット（１１．．０）（図１の３０）は、このメモリページ内のオフセットを構成する。
【００１８】
オペレーティングシステムは、カレントプログラムのページテーブルディレクトリのアドレスを、ＣＲ３（３２）と呼ばれる専用プロセッサレジスタに記憶する。タスクを切り換えるたびにオペレーティングシステムは、ＣＲ３を再ロードすることができ、そのためＣＲ３は新たなプログラムのページディレクトリを指す。仮想アドレスを物理アドレスにマッピングする処理は、プロセッサで実行される。メモリキャッシング手法が、頻繁に使用するページテーブルエントリが追加のメモリ参照なしに使用可能であることを保証する。
【００１９】
仮想メモリ方式を十分にサポートするため、ページテーブルエントリは、ページテーブルまたは物理アドレスへのポインタ以外のものも含む。図２に、ページテーブルディレクトリとページテーブルエントリの構造の双方について１つの３２ビットワードの内容を示す（図２のアイテム４０および４２参照）。ページテーブルディレクトリおよびそれぞれのページテーブルは、１つの４Ｋメモリページ（それぞれ１０２４エントリ）を消費する。これは全体で４ＧＢのプログラムのアドレス空間を適切にアドレス指定することができる。ページテーブルディレクトリのフラグビットは、システムがページテーブル自体をディスク上のページングファイルに記憶することを許す。したがって、大きなプログラム（例えば２５６ページ分のページテーブルを必要とする１ＧＢのプログラム）では、システムは、プログラムのコードおよびデータページと同様にページテーブルも物理メモリとの間でスワップする。
【００２０】
仮想メモリ操作および３８６メモリ保護システムを十分にサポートするため、ページディレクトリおよびページテーブルのエントリは、いくつかのフラグビットを含む。これらフラグのうちのいくつかは、プロセッサ自体が直接に変更する。その他のフラグは、オペレーティングシステムが管理する。図２に示すようにこれらのフラグには、Ｄ、Ａ、Ｕ／Ｓ、Ｒ／ＷおよびＰなどのビットがある。
【００２１】
プログラムがメモリページの内容を変更すると、プロセッサは、対応するページテーブルのダーティビット（図２のＤビット）をセットする。このことは、メモリからページを削除して空間を空けたい場合には、まずそのページをディスクに書き込んで変更を保存しなければならないことを、オペレーティングシステムに通知する働きをする。
【００２２】
ページに対して何らかの参照（読取り、書込みまたは実行）が行われると、プロセッサは、対応するページテーブルエントリのアクセスビット（図２のＡ）をセットする。仮想メモリマネージャは、このフラグを使用してどのくらい頻繁にページがアクセスされたかを知ることができる。どのくらい頻繁にページがアクセスされたかを知る１つの方法は、このビットを周期的にセットおよびチェックして、そのページがアクセスされているかどうかを判定することである。ハードウェアがアクセスビットをセットしないのであれば、たまにしか使用されないページのアクセスビットは変更されない。このページをメモリから除去することは、同じ期間中に確かに使用されたページを除去するよりもおそらくはよい選択であろう。Ｗｉｎｄｏｗｓ（登録商標）９５オペレーティングシステムは、最低使用頻度（ｌｅａｓｔ  ｒｅｃｅｎｔｌｙ  ｕｓｅｄ）（ＬＲＵ）として知られるアルゴリズムを使用して、どのページをメモリから除去するかを決定する。より最近に使用されたページほど、再割り当てされる確率は低くなる。
【００２３】
プレゼントビット（Ｐビット）は、テーブルエントリによってアドレス指定されたページテーブルまたはメモリページが、実際にメモリに存在する場合にのみ、１にセットされる。プログラムが存在しないページまたはページテーブルを参照しようとした場合、プロセッサは、不在割込みを生成し、オペレーティングシステムは、メモリにそのページをロードするよう手配し、そのページを必要としたプログラムを再起動させなければならない。
【００２４】
ユーザ／スーパバイザビット（Ｕ／Ｓビット）は、３８６保護システムの一部である。Ｕ／Ｓビットが０にセットされている場合、そのメモリページはスーパバイザページである。すなわちそのページは、オペレーティングシステム自体のメモリの一部であり、ユーザレベルのプログラムは、このページに一切アクセスできない。アクセスを試みると、オペレーティングシステムが処理しなければならない割込みが生じる。
【００２５】
読取り／書込みビット（Ｒ／Ｗビット）は、対応するメモリページへのアクセスを許されたプログラムが、そのページの内容を変更することができるかどうかを示す。値が１の場合はページ内容を変更することができる。値が０の場合には、どんなプログラムもページ中のデータを変更することができない。通常、プログラムコードを含むページは、読取り専用ページとしてセットアップされている。
【００２６】
以上に説明したメモリアドレッシング方式によって、オペレーティングシステムが仮想メモリシステムを実装することが可能になる。現代のオペレーティングシステムの限界の１つは、マルチタスクオペレーティングシステムでフォーカスが変更されたときにアプリケーションの性能を低下させる傾向がある方法で、仮想メモリが実装されることである。フォーカスとは、マルチタスクオペレーティングシステムという状況では、ディスプレイモニタ上でアクティブであり、ユーザ入力を受け取っているアプリケーションプログラムの状態をいう。言い換えると、たとえオペレーティングシステムが他のプロセスにＣＰＵ時間を使用させているとしても、フォアグラウンドのアプリケーションプログラムがフォーカスを有する。
【００２７】
あるアプリケーションがフォーカスを失ったとき、仮想メモリシステムは、このアプリケーションのコードおよびデータの一部をハードドライブにスワッピングする傾向がある。このことは、ゲームのように、フォーカスを有するときには物理メモリの大きな部分を使用し、フォーカスを失ったときにはめったにメモリにアクセスしない対話性の高いアプリケーションに特に当てはまる。
【００２８】
この種類のアプリケーションプログラムがフォーカスを回復したときには、ディスプレイ上のオブジェクトの動きおよびユーザ入力に対するプログラムの応答がぎこちなくなる。オペレーティングシステムが必要なコードおよびデータを物理メモリに再ロードしようとするからである。これは、このようなアプリケーションがメモリにアクセスしようとすると、アプリケーションのコードおよびデータの小さい部分がハードドライブからスワップインされる、仮想メモリシステムの設計に起因する。
【００２９】
マイクロソフト社のＷｉｎｄｏｗｓ（登録商標）９５オペレーティングシステムなどのいくつかのオペレーティングシステムは、ＬＲＵアルゴリズムを使用して物理メモリとの間でのページのスワッピングを制御する仮想メモリを実装する。一般にこの仮想メモリシステムは、オペレーティングシステムの動的にロードされるコンポーネントのページと、アプリケーションプログラムの全てのページに同じ優先順位を与える。したがって、ゲームアプリケーションが一時的に非アクティブになった場合、オペレーティングシステムは、そのアプリケーションのページを物理メモリからスワップアウトしがちである。このアプリケーションが再びアクティブになると、オペレーティングシステムは物理メモリにページを少しずつスワップインするので、ディスプレイ上のオブジェクトの動きおよびユーザ入力に対するゲームの応答はぎごちなくなる。
【００３０】
この問題に対処する１つの方法は、アプリケーションに割り当てられた物理メモリをロックし、その他のコードが物理メモリのこの部分にアクセスできないようにするものである。例えば、Ｗｉｎｄｏｗｓ（登録商標）オペレーティングシステムでは、アプリケーションが、物理メモリの一部に対してページロックを要求することができる。ページロックは、オペレーティングシステムが物理メモリの一部分をコミットし、その他の実行コードが利用できる物理メモリのプールからその一部分を除去する。しかしこの解決策は受け入れがたい。なぜなら、同時に実行中のアプリケーションが物理メモリにアクセスする必要が生じたが、アプリケーションが物理メモリをロックしているためにこれにアクセスすることができない場合に、システム性能が非常に低下するからである。
【００３１】
（発明の要旨）
本発明は、仮想メモリを使用するマルチタスクオペレーティングシステムにおいてアプリケーションの性能を向上させる方法である。この方法では、どのアプリケーションがマルチタスクオペレーティングシステムのフォーカスを有するかを監視する。フォーカスは、アクティブ状態にあって、現在、ユーザから入力を受け取る準備ができているアプリケーションを指す。この方法では、アプリケーションがフォーカスを失ったときに、仮想メモリシステムの状態、詳細には、物理メモリに存在したアプリケーションに関連するコードおよびデータを記録する。アプリケーションが後にフォーカスを回復したときに、この方法では、以前に物理メモリ内にあったコードまたはデータを、アプリケーションが実行を再開する前に物理メモリに再ロードする。
【００３２】
この方法の一手段は、アプリケーションプログラミングインタフェースの一部であり、仮想メモリを使用して物理メモリを共用させるオペレーティングシステムにおける物理メモリ割当てをアプリケーションが制御することができる。アプリケーションは、フォーカスを失ったときに物理メモリ内のコードまたはデータの状態を記憶し、その後、フォーカスを回復したときに復元することを要求することができる。この実施態様でこの要求を実施するためには、アプリケーションがＡＰＩ関数呼出しを発生し、ユーザインタフェース上のメインウィンドウの識別子を指定し、この手段がアプリケーションの状態を保存しなければならないことを指示するパラメータを渡す。
【００３３】
この手段においては、メモリモニタが、同時に実行中のアプリケーションプログラム間のフォーカスの変更を監視する。別のアプリケーションのウィンドウに切り換えるなどによって、ユーザがフォーカスを変更すると、オペレーティングシステムは、メモリモニタにメッセージを送る。メモリモニタは、物理メモリマネージャに、現在、物理メモリ内に存在するアプリケーションの全てのメモリ単位を識別させる。メモリモニタは、この状態情報を、アプリケーションのプロセスＩＤとともに保管する。
【００３４】
メモリモニタは、フォーカスの変更を監視し続け、アプリケーションがフォーカスを回復したことを検出する。アプリケーションが再開される前にメモリモニタは、物理メモリに存在しなければならないメモリ単位のリストを物理メモリマネージャに渡す。物理メモリマネージャは、アプリケーションがフォーカスを持たない間に２次記憶装置にスワップされた一切のメモリ単位を再ロードする。ページド仮想メモリシステムの一部として、この手段のメモリ単位はページである。しかし本発明の概念は、ページングに基づかないその他の形態の仮想メモリシステムにも適用することができる。
【００３５】
以上説明した方法およびＡＰＩインプリメンテーションは、いくつかの利点を有する。その１つは、フォーカスの変更が行われたときに、ページフォールトによってアプリケーションの性能が低下することを防ぐ傾向を有することである。この方法は、アプリケーションが実行を再開する前に物理メモリ割当ての状態が復元されることを保証し、これによって、ページフォールトが起こりにくくなる。アプリケーションは、フォーカスを失う前にアクセスしたのと同じコードまたはデータにアクセスしようとする可能性が高いので、物理メモリ割当ての状態を復元することによって、アプリケーションがフォーカスを回復した後のページフォールトの機会は低減する。さらに、アプリケーションの動作をぎこちなくするページフォールトの時間的広がりが起こりにくくなる。この方法の他の利点は、アプリケーションがコードまたはデータへのアクセスを明確に要求しなくても物理メモリの状態が復元されることである。この方法では、アプリケーションが実行を再開する前に自動的に状態が復元される。本発明の追加の特徴および利点は、以下の詳細説明および添付図面からより明白となろう。
【００３６】
（詳細な説明）
本発明は、コンピュータのアプリケーションプログラム間でフォーカスが変更されたときに物理メモリの状態を復元する方法を指向する。一実施形態では、本発明が、米ワシントン州レドモンドのマイクロソフト社からのＷｉｎｄｏｗｓ（登録商標）９５オペレーティングシステム向けの「ＤｉｒｅｃｔＭｅｍｏｒｙ」という名称のアプリケーションプログラミングインタフェース（ＡＰＩ）に組み込まれる。簡単に説明すると、このＡＰＩは、オペレーティングシステムが物理メモリへのアクセスをどのように管理するかを、アプリケーションが制御できるようにする一連の関数またはＡＰＩ呼出しを提供する。
【００３７】
図３および以下の議論は、本発明を実装することができる適当なコンピューティング環境の概要を簡潔に示すことを目的としたものである。本発明は、パーソナルコンピュータ上で実行されるコンピュータプログラムの、コンピュータが実行可能な命令に一般的に関連して説明されるが、その他のプログラムモジュールと組み合わせて本発明を実装することもできることを当業者は認識されたい。一般に、プログラムモジュールには、特定のタスクを実行し、または特定の抽象データ型を実装するところのルーチン、プログラム、コンポーネント、データ構造などが含まれる。また本発明を、ハンドへルド装置、マルチプロセッサシステム、マイクロプロセッサベースの、またはプログラム可能な民生用電子機器、ミニコンピュータ、メインフレームコンピュータなどを含むその他のコンピュータシステムの構成を用いて実施することができることを当業者は理解されたい。本発明は、通信網を介してリンクされた遠隔処理装置によってタスクが実行される分散コンピューティング環境で実施することもできる。分散コンピューティング環境ではプログラムモジュールを、ローカルとリモートの両方のメモリ記憶装置に配置することができる。
【００３８】
図３に、本発明の動作環境として機能するコンピュータシステムの一例を示す。このコンピュータシステムは、パーソナルコンピュータ１２０を含む。パーソナルコンピュータ１２０は、処理装置１２１、システムメモリ１２２、およびシステムメモリを含むさまざまなシステムコンポーネントを処理装置１２１に相互接続するシステムバス１２３を含む。このシステムバスは、メモリバスまたはメモリコントローラ、周辺バス、および、例えばＰＣＩ、ＶＥＳＡ、Ｍｉｃｒｏｃｈａｎｎｅｌ、ＩＳＡおよびＥＩＳＡ等のバス構成を使用したローカルバスを含むいくつかの種類のいずれかのバス構造を含むことができる。システムメモリは、リードオンリーメモリ（ＲＯＭ）１２４およびランダムアクセスメモリ（ＲＡＭ）１２５を含む。スタートアップ中など、パーソナルコンピュータ１２０内の要素間の情報転送を手助けする基本ルーチンを含む基本入出力システム（ＢＩＯＳ）は、ＲＯＭ１２４に記憶される。パーソナルコンピュータ１２０はさらに、ハードディスクドライブ１２７、例えばリムーバブルディスク１２９に書込みまたは読取りを実施する磁気ディスクドライブ１２８、および例えばＣＤ−ＲＯＭディスク１３１を読んだり、あるいはその他の光学的媒体から読取りまたは書込みを実施する光ディスクドライブ１３０を含む。ハードディスクドライブ１２７、磁気ディスクドライブ１２８および光ディスクドライブ１３０はそれぞれ、ハードディスクドライブインタフェース１３２、磁気ディスクドライブインタフェース１３３および光ディスクドライブインタフェース１３４によってシステムバス１２３に接続される。これらのドライブおよびその関連するコンピュータが読取り可能な媒体は、データ、データ構造、コンピュータ実行可能命令（ダイナミックリンクライブラリなどのプログラムコードと、実行可能ファイル）などの不揮発性の記憶をパーソナルコンピュータ１２０に提供する。以上に述べたコンピュータが読取り可能な媒体の記述はハードディスク、リムーバブル磁気ディスクおよびＣＤについてのものだが、さらに、磁気カセット、フラッシュメモリカード、デジタルビデオディスク、ベルヌーイカートリッジ等の、コンピュータが読取り可能な他の種類の媒体を含めることができる。
【００３９】
いくつかのプログラムモジュールは、オペレーティングシステム１３５、１つまたは複数のアプリケーションプログラム１３６、その他のプログラムモジュール１３７およびプログラムデータ１３８を含む、ドライブおよびＲＡＭ１２５に記憶することができる。ユーザは、キーボード１４０およびマウス１４２などのポインティングデバイスを介して、コマンドおよび情報をパーソナルコンピュータ１２０に入力することができる。その他の入力装置（図示せず）には、マイクロホン、ジョイスティック、ゲームパッド、衛星アンテナ、スキャナ等がある。これらおよびその他の入力装置は、システムバスに結合されたシリアルポートインタフェース１４６を介して処理装置１２１に接続されることが多いが、パラレルポート、ゲームポート、ユニバーサルシリアルバス（ＵＳＢ）など他のインタフェースによって接続することもできる。モニタ１４７またはその他の種類のディスプレイ装置が、ビデオアダプタ１４８等のインタフェースを介してシステムバス１２３に接続される。モニタに加えて、パーソナルコンピュータは一般に、スピーカやプリンタ等の、その他の周辺出力装置（図示せず）を含む。
【００４０】
パーソナルコンピュータ１２０は、リモートコンピュータ１４９等の１つまたは複数のリモートコンピュータへの論理接続を使用したネットワーク環境で動作することができる。リモートコンピュータ１４９は、サーバ、ルータ、ピア装置、またはその他の一般的なネットワークノードであり、図３には記憶装置１５０のみを示したが、一般にはパーソナルコンピュータ１２０に関して説明した要素の全てまたは多くを含む。図３に示した論理接続は、ローカルエリアネットワーク（ＬＡＮ）１５１およびワイドエリアネットワーク（ＷＡＮ）１５２を含む。このようなネットワーキング環境は、オフィス、企業規模のコンピュータネットワーク、イントラネットおよびインターネットに普通に見られる。
【００４１】
ＬＡＮネットワーキング環境で使用されるとき、パーソナルコンピュータ１２０は、ネットワークインタフェースまたはアダプタ１５３を介してローカルネットワーク１５１に接続される。ＷＡＮネットワーキング環境で使用されるとき、パーソナルコンピュータ１２０は一般に、モデム１５４、またはインターネット等のワイドエリアネットワーク１５２上で通信を確立するその他の手段を含む。モデム１５４は、内部モデムでもまたは外部モデムでもよく、シリアルポートインタフェース１４６を介してシステムバス１２３に接続される。ネットワーク化された環境では、パーソナルコンピュータ１２０に関して図示したプログラムモジュールまたはそれらの部分を、リモートメモリ記憶装置に記憶することができる。図示のネットワーク接続は例示的なものであり、コンピュータ間に通信リンクを確立するその他の手段を使用することもできることを理解されたい。
【００４２】
本発明の一実施形態は、アプリケーションプログラミングインタフェースの一部分であり、マイクロソフト社のＷｉｎｄｏｗｓ（登録商標）オペレーティングシステムのメモリ管理機能をアプリケーションが制御できる。このオペレーティングシステムの仮想メモリマネージャは、背景の項で説明した３８６プロセッサアーキテクチャ用に設計されたものである。詳細には、仮想メモリマネージャはページド仮想メモリ方式を実装する。このオペレーティングシステムは、４Ｋページ単位の仮想および物理メモリの割当てを管理し、ページテーブルディレクトリおよびページテーブルのエントリに記載された状態情報を使用して物理メモリの割当てを管理する。
【００４３】
本手段は、メモリモニタでありオペレーティングシステムの仮想メモリマネージャと連携して働く。メモリモニタは、オペレーティングシステムのフォーカスの変更を監視する。１つのアプリケーションがフォーカスを失うと、メモリモニタは、このアプリケーションに関連したどのコードおよびデータが物理メモリ内にあるかを調べる。メモリモニタは、このアプリケーションに対する物理メモリ割当ての状態を保管する。このアプリケーションがフォーカスを回復すると、メモリモニタはオペレーティングシステムに指示して、以前に物理メモリ内にあった全てのコードまたはデータをアプリケーションが実行を開始する前に物理メモリに再ロードさせる。
【００４４】
図４は、本発明の実施形態を示す図である。アプリケーション（ａｐｐ．１〜３）（１６１〜１６３）は、１台のコンピュータで同時に実行され、このコンピュータの物理メモリを共用しているアプリケーションプログラムを表す。これらのアプリケーションは、ＡＰＩインプリメンテーション１６４の関数を呼び出すことによって物理メモリの割当てを制御することができる。ＡＰＩインプリメンテーションの特定の例および付随する説明を以下に示す。
【００４５】
ＡＰＩインプリメンテーション１６４は、オペレーティングシステムでのフォーカスを監視するメモリモニタ１６５を含む。メモリモニタ１６５は、フォーカスが、１つのアプリケーションから別のアプリケーションに変更されたことを指示するオペレーティングシステムからのメッセージ（例えばメッセージ１６６）をフックする。アプリケーションプログラムは、ＡＰＩインプリメンテーション中のＡＰＩ関数を呼び出すことによってフォーカスを回復したときに、物理メモリ割当ての状態を復元させたい旨を指定することができる。詳細には、マイクロソフト社のＷｉｎｄｏｗｓ（登録商標）９５オペレーティングシステム用に設計されたＡＰＩでは、アプリケーションが、ＡＰＩインプリメンテーション中の関数を呼び出し、フォーカスを回復したときに物理メモリの状態を復元させたい旨を指示するパラメータおよびアプリケーションのウィンドウハンドルを指示する別のパラメータを渡す。メモリモニタ１６５はこのウィンドウハンドルを使用して、アプリケーションがフォーカスを獲得したことを判定する。
【００４６】
図４に、アプリケーションの物理メモリ割当ての状態の一例を示すため、１つのアプリケーションに割り当てられた仮想メモリ空間１７０の一部を示す。仮想メモリ空間のマークしたセクション（１７２、１７４、１７６および１７８）は、現在、物理メモリ内にあるアプリケーションのコードまたはデータの部分を表す。マークしたセクションは、仮想メモリの連続した部分では必ずしもないことに留意されたい。マークしたセクションの中のコードまたはデータを記憶したメモリ単位またはこの場合ページは、物理メモリ内の使用可能な任意の位置に存在することができる。
【００４７】
メモリモニタ１６５は、現在、どのページが物理メモリ内にあるかを、ページテーブルディレクトリおよびページテーブルのエントリから求めることによって、この状態情報を決定する。図４に示した例では、アプリケーションのコードおよびデータに関連したページテーブルが、マークしたセクションと一致するページが現在、物理メモリ内にあることを反映している。
【００４８】
図４に示す物理メモリマネージャ１８０は、オペレーティングシステムの一部であり、コンピュータハードウェアと対話して物理メモリ割当てを制御する。物理メモリマネージャ１８０は、ページド仮想メモリ方式を実装し、物理メモリの割当て、物理メモリへのページのロード、および不在割込み（ページフォールト）の処理が必要なときの物理メモリと２次記憶との間のページスワッピングに責任を負う。先に述べたとおり、Ｗｉｎｄｏｗｓ（登録商標）９５オペレーティングシステムの物理メモリマネージャは、ＬＲＵアルゴリズムを使用してページスワッピングを実装する。
【００４９】
物理メモリマネージャ１８０は、それぞれの同時に実行中のアプリケーションの物理メモリ割当てに関する状態情報を保持する。物理メモリマネージャ１８０は、同時に実行中のプロセス１８２のリスト、および現在物理メモリ（２次記憶ではなく）内にある各プロセスのページのリストを保持する。実行プロセスはそれぞれ、プロセスＩＤまたはＰＩＤを有する。この例では、３つの同時に実行中のアプリケーションプログラムがあり、したがって物理メモリマネージャ１８０は、これらのアプリケーションプログラムに対応する３つのＰＩＤを追跡する。
【００５０】
物理メモリマネージャ１８０によって維持されるこの構造では、ＰＩＤがそれぞれ、現在、物理メモリ内にあるページのリストに関連付けられる。この実施態様では、このリスト中に４つのセクションがあり、マークされた仮想メモリの４つのセクション１７２〜１７８にそれぞれ対応することに留意されたい。マークしたそれぞれのセクションに対して、対応するページ群があり、セクションの中のコードまたはデータを記憶するために使用する。
【００５１】
メモリモニタ１６５は、ウィンドウハンドルを使用し、アプリケーションのウィンドウに宛てたオペレーティングシステムからのメッセージをインターセプトすることによってフォーカスの変更を監視する。一実施態様では、ユーザ入力に対応した、オペレーティングシステムからアプリケーションの１つ（または複数）のウィンドウへのメッセージをフックする。これらのメッセージは、アクティブ状態にあって、現在、ユーザ入力に応答するアプリケーションを示す。別の実施態様では、オペレーティングシステムサービス、すなわちシェルフックを使用して、１つのアプリケーションから別のアプリケーションへのフォーカスの変更についての通知を受け取る。
【００５２】
アプリケーションがフォーカスを失うと、メモリモニタ１６５はこのアプリケーションの物理メモリ割当ての状態を保管する。詳細には、メモリモニタは、物理メモリマネージャ１８０に問い合わせ、フォーカスを失ったアプリケーションのページテーブルの状態のコピーを返すよう要求する。この実施態様におけるページテーブルの状態は、図４に示した構造１８４のコピーである。アプリケーションの物理メモリ割当ての状態を表す方法は、開発者が選択したデータ構造フォーマット、オペレーティングシステムの種類、および根底のメモリアーキテクチャを含むいくつかの因子に応じて変化することに留意されたい。この実施態様は、ページド仮想メモリシステムの一例に過ぎない。
【００５３】
図４に示すようにメモリモニタ１６５は、アプリケーションがフォーカスを失ったときに物理メモリに存在したページのリストを識別する状態情報１８６のコピーを保持する。アプリケーションがフォーカスを回復したとき、メモリモニタ１６５は状態情報を取り出し、このアプリケーションがフォーカスを失ったときに物理メモリに存在したページをそれぞれロードするよう物理メモリマネージャ１８０に命令する。
【００５４】
メモリモニタ１６５は、アプリケーションが実行を再開する前に、以前に物理メモリ内にあったページが全て再ロードされることを保証する。アプリケーションは、フォーカスを失ったときに実行を止めたところから実行を再開する。プログラムが実行を再開する命令のアドレスが、図４の矢印１９０でマークした箇所にある例を考える。アプリケーションがフォーカスを回復したときに、たとえプログラムが、仮想アドレス１９０に記憶された命令から実行を再開するとしても、メモリモニタ１６５は、セクション１７２〜１７８に関連した全てのページをロードする。したがってメモリモニタ１６５は、仮想アドレス１９０の付近のページだけをロードするのではなく、以前に割り当てられた全てのメモリが物理メモリのどこかに再ロードされることを保証する。
【００５５】
先に指摘したように、メモリモニタ１６５は、ページテーブルの状態に基づいて物理メモリにページを再ロードするよう物理メモリマネージャ１８０に命令する。図５は、ページテーブル１９０の一例、およびこれと物理メモリ１９２との関係を示す図である。ページテーブル１９０のそれぞれのエントリ（例えば１９４、１９６、１９８）は、メモリ単位（すなわちページ）に対応する。ページが現在、物理メモリ内にある場合には、ページテーブルエントリのプレゼントビット（Ｐ）がセットされる。ページが現在、物理メモリ内にある場合、ページテーブルエントリの一部分が、物理メモリ中の特定の位置を参照するアドレスとなる。図５ではこのアドレスが、物理メモリ１９２内の割当を指すポインタとして示されている。例えば、ポインタ（２００、２０２，２０４、２０６）は、物理メモリ１９２内の位置（２０８、２１０、２１２、２１４）を参照する。
【００５６】
正しいページを再ロードする目的には、メモリモニタ１６５は、Ｐビットがセットされたページのリストだけを記憶すればよい。この情報を用いて、メモリモニタ１６５は、物理メモリ中のリストにある全てのページをロードするよう物理メモリマネージャ１８０に命令することができる。メモリマネージャは、これらのページを物理メモリの使用可能部分にロードする。再ロード後、これらのページの実際の位置は、アプリケーションがフォーカスを失ったときのそれとはおそらく異なる。しかし、アプリケーションにとって、図４に示した仮想メモリの状態は同じなので、このことは問題ではない。
【００５７】
ＡＰＩの可能な一実施態様いわゆる「ＤｉｒｅｃｔＭｅｍｏｒｙ」を以下に記載する。アプリケーションプログラムは、ＳｅｔＣｏｏｐｅｒａｔｉｖｅＬｅｖｅｌ関数を呼び出し、ＤＭＳＣＬ＿ＰＲＥＳＥＲＶＥＳＴＡＴＥパラメータおよびアプリケーションメインウィンドウのウィンドウハンドルを渡すことによって、物理メモリ割当ての状態を復元したい旨を指定することができる。
【００５８】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＡｄｄＭｅｍｏｒｙＴｏＧｒｏｕｐ
ＨＲＥＳＵＬＴ
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＡｄｄＭｅｍｏｒｙＴｏＧｒｏｕｐ（ｄｗＧｒｏｕｐＨａｎｄｌｅ，ｄｗＣｏｕｎｔ，ｌｐｌｐＡｄｄｒ，ｌｐｄｗＳｉｚｅ）
【００５９】
目的
指定されたメモリブロックを以前に作成したグループに追加する。
【００６０】
パラメータ
ｄｗＧｒｏｕｐＨａｎｄｌｅ
これは、以前に作成したグループを識別するために使用するハンドルである。
ｄｗＣｏｕｎｔ
これは、ｌｐｌｐＡｄｄｒが指すリスト中のメモリブロックの数を示す。
ｌｐｌｐＡｄｄｒ
これは、このグループに追加するメモリブロックを指すポインタのアレイである。
ｌｐｄｗＳｉｚｅ
これは、ｌｐｌｐＡｄｄｒが指すメモリブロックの長さを示すＤＷＯＲＤＳのアレイである。
【００６１】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＢＡＤＧＲＯＵＰ  このグループは、ＣｒｅａｔｅＧｒｏｕｐによって作成されたものではない。
【００６２】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＣｒｅａｔｅＧｒｏｕｐ
ＨＲＥＳＵＬＴ  ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＣｒｅａｔｅＧｒｏｕｐ（ｄｗＦｌａｇｓ，ｌｐｄｗＧｒｏｕｐＨａｎｄｌｅ，ｄｗＣｏｕｎｔ，ｌｐｌｐＡｄｄｒ，ｌｐｄｗＳｉｚｅ）
【００６３】
目的
仮想記憶管理の目的のために１単位として取り扱わなければならないメモリのセクションを含むグループを作成する。１つのグループは、ページイン、ページアウト、ＳＯＦＴＬＯＣＫであり、ひとまとまりで参照カウントされる。
【００６４】
パラメータ
ｄｗＦｌａｇｓ
ＤＭＧＲＯＵＰ＿ＳＯＦＴＬＯＣＫ
ＤＭＧＲＯＵＰ＿ＰＲＥＬＯＡＤ
ｌｐｄｗＧｒｏｕｐＨａｎｄｌｅ
新たなグループハンドルが返されるＤＷＯＲＤを指す。
ｄｗＣｏｕｎｔ
これは、ｌｐｌｐＡｄｄｒが指すリスト中のメモリブロックの数である。
ｌｐｌｐＡｄｄｒ
これは、作成中のこのグループに追加されるメモリブロックを指すポインタのアレイである。
ｌｐｄｗＳｉｚｅ
これは、ｌｐｌｐＡｄｄｒが指すメモリブロックの長さを指示するＤＷＯＲＤＳのアレイである。
【００６５】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＢＡＤＤＡＤＤＲＥＳＳ  物理アドレスは失敗した。
【００６６】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＤｅｌｅｔｅＭｅｍｏｒｙＦｒｏｍＧｒｏｕｐ  ＨＲＥＳＵＬＴ  ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＤｅｌｅｔｅＭｅｍｏｒｙＦｒｏｍＧｒｏｕｐ（ｄｗＧｒｏｕｐＨａｎｄｌｅ，ｄｗＣｏｕｎｔ，ｌｐｌｐＡｄｄｒ）
【００６７】
目的
以前に作成したグループから指定されたメモリブロックを削除する。指定されたブロックが全て指定されたグループ内にない場合、この呼出しは失敗する。
【００６８】
パラメータ
ｄｗＧｒｏｕｐＨａｎｄｌｅ
これは、以前に作成したグループを識別するために使用するハンドルである。
ｄｗＣｏｕｎｔ
これは、ｌｐｌｐＡｄｄｒが指すリスト中のメモリブロックの数である。
ｌｐｌｐＡｄｄｒ
これは、このグループに追加されるメモリブロックを指すポインタのアレイである。
【００６９】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＢＡＤＧＲＯＵＰ  このグループは、ＣｒｅａｔｅＧｒｏｕｐによって作成されたものではない。
ＤＭＥＲＲ＿ＢＡＤＢＬＯＣＫＳ  指定されたブロックの中にこのグループに属さないものがある。
【００７０】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＤｅｓｔｒｏｙＧｒｏｕｐ
ＨＲＥＳＵＬＴ  ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＤｅｓｔｒｏｙＧｒｏｕｐ（ｄｗＧｒｏｕｐＨａｎｄｌｅ）
【００７１】
目的
この関数は、以前に作成したグループを破棄する。このグループの一部であるページの全てが解放される。破棄する前にグループから全てのページを削除する必要はない。
【００７２】
パラメータ
ｄｗＧｒｏｕｐＨａｎｄｌｅ
ＣｒｅａｔｅＧｒｏｕｐによって以前に作成されたグループのハンドル。
【００７３】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＢＡＤＧＲＯＵＰ  このグループハンドルは、ＣｒｅａｔｅＧｒｏｕｐによって作成されたものではない。
【００７４】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＧｅｔＭａｘＰｈｙｓｉｃａｌＭｅｍｏｒｙ
ＨＲＥＳＵＬＴ  ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＧｅｔＭａｘＰｈｙｓｉｃａｌＭｅｍｏｒｙ（ｄｗＦｌａｇｓ，ＩｐｄｗＮｕｍＰａｇｅｓ）
【００７５】
目的
ベストケースシナリオでアプリケーションが使用可能な物理メモリのページの数をアプリケーションに返す。
【００７６】
パラメータ
ｄｗＦｌａｇｓ
ＤＭＧＭＰＭ＿ＥＸＣＬＵＳＩＶＥＭＯＤＥ  フォーカスを有するときのアプリケーションの物理メモリページ。
ＤＭＧＭＰＭ＿ＳＨＡＲＥＤ  フォーカスを持たないときのアプリケーションの物理メモリページ。
ｌｐｄｗＮｕｍＰａｇｅｓ
物理メモリの４Ｋページの数。
【００７７】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
【００７８】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＧｅｔＰｒｏｃｅｓｓＷｏｒｋｉｎｇＳｅｔＳｉｚｅ
ＨＲＥＳＵＬＴ  ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＧｅｔＰｒｏｃｅｓｓＷｏｒｋｉｎｇＳｅｔＳｉｚｅ（ｄｗＦｌａｇｓ，ＩｐｄｗＮｕｍＰａｇｅｓ）
【００７９】
目的
このＡＰＩは、オペレーティングシステムがアプリケーションの現在のワーキングセットがそうである必要があると考えるものを返す。
【００８０】
パラメータ
ｄｗＦｌａｇｓ
ＤＭＳＰＷＳ＿ＥＸＣＬＵＳＩＶＥＭＯＤＥ  フォーカスを有するときのアプリケーションのワーキングセット。
ＤＭＳＰＷＳ＿ＳＨＡＲＥＤ  フォーカスを持たないときのアプリケーションのワーキングセット。
ｌｐｄｗＮｕｍＰａｇｅｓ
このアプリケーションが予約した物理メモリの４Ｋページの数であるＤＷＯＲＤを指す。
【００８１】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＯＵＴＯＦＭＥＭＯＲＹ  要求されたワーキングセットサイズがこのシステムの物理メモリの限界を越えている。このアプリケーションのワーキングセットは変更されていない。
【００８２】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＳｅｔＣｏｏｐｅｒａｔｉｖｅＬｅｖｅｌ
ＨＲＥＳＵＬＴ  ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＳｅｔＣｏｏｐｅｒａｔｉｖｅＬｅｖｅｌ（ｈＷｎｄ，ｄｗＦｌａｇｓ）
【００８３】
目的
このアプリケーションがＤｉｒｅｃｔＭｅｍｏｒｙの使用を望む方法を示し、ＤｉｒｅｃｔＭｅｍｏｒｙがアプリケーションのフォーカスを追跡するために使用しなければならないｈＷｎｄを提供すること。
【００８４】
パラメータ
ｈＷｎｄ
これは、アプリケーションフォーカスを表すｈＷｎｄである。
ｄｗＦｌａｇｓ
ＤＭＳＣＬ＿ＰＲＥＳＥＲＶＥＳＴＡＴＥ  このフラグがセットされている場合、アプリケーションがフォーカスを失ったときにアプリケーションのメモリの状態が保存され、アプリケーションがフォーカスを回復したときにアプリケーションのメモリの状態が実行開始前に復元される。
ＤＭＳＣＬ＿ＥＸＣＬＵＳＩＶＥＭＯＤＥ  このフラグがセットされている場合、アプリケーションがフォーカスを失ったときに、アプリケーションが所有するページのＬＲＵステータスが、ＮＯＴ  ＵＳＥＤとしてマークされる。ＳＯＦＴＬＯＣＫＳは解放される。アプリケーションがフォーカスを回復したときにＳＯＦＴＬＯＣＫＳは復元される。
ＤＭＳＣＬ＿ＳＨＡＲＥＤ  このフラグがセットされている場合、フォーカスを失ったときにアプリケーションのＳＨＡＲＥＤＳＯＦＴＬＯＣＫＳは解放されない。フォーカスを持たないとき、アプリケーションがＳＯＦＴＬＯＣＫＳを介して使用可能なメモリは小さくなる。フォーカスの喪失後も存続するＳＯＦＴＬＯＣＫＳを指定する方法についてはＬＯＣＫの項を参照されたい。
【００８５】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＢＡＤＨＷＮＤ  指定されたｈｗｎｄは無効であるか、または型が不正確である。
【００８６】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＳｅｔＰｒｏｃｅｓｓＷｏｒｋｉｎｇＳｅｔＳｉｚｅ
ＨＲＥＳＵＬＴ  ＤｉｒｅｃｔＭｅｍｏｒｙ：：ＳｅｔＰｒｏｃｅｓｓＷｏｒｋｉｎｇＳｅｔＳｉｚｅ（ｄｗＦｌａｇｓ，ｄｗＮｕｍＰａｇｅｓ）
【００８７】
目的
このＡＰＩは、アプリケーションがオペレーティングシステムを必要とするそのワーキングセットと対話するのを可能にし、ある量の物理メモリを、これに対して空けておくことができる。
【００８８】
パラメータ
ｄｗＦｌａｇｓ
ＤＭＳＰＷＳ＿ＥＸＣＬＵＳＩＶＥＭＯＤＥ  フォーカスを有するときのアプリケーションのワーキングセット。
ＤＭＳＰＷＳ＿ＳＨＡＲＥＤ  フォーカスを持たないときのアプリケーションのワーキングセット。
ｄｗＮｕｍＰａｇｅｓ
通常使用するシナリオでスラッシングを避けるのにこのアプリケーションが必要とする４Ｋメモリページの数。
【００８９】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＯＵＴＯＦＭＥＭＯＲＹ  要求されたワーキングセットサイズが、このシステムの物理メモリの限界を越えている。アプリケーションのワーキングセットは、変更されていない。
【００９０】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：Ｌｏｃｋ
ＨＲＥＳＵＬＴ  Ｌｏｃｋ（ｄｗＦｌａｇｓ，ｌｐＡｄｄｒ，ｄｗＳｉｚｅ）
【００９１】
目的
このＡＰＩは、ＤｉｒｅｃｔＭｅｍｏｒｙによって追跡するメモリセグメントを指定する。セグメントは、ＳＯＦＴＬＯＣＫプールまたはＭＯＳＴＲＥＣＥＮＴＬＹＵＳＥＤプールのいずれかに追加される。ＳＯＦＴＬＯＣＫプールは、アプリケーションがフォーカスを回復したときに復元され、ページロックされる。ＭＯＳＴＲＥＣＥＮＴＬＹＵＳＥＤプールは、アプリケーションがフォーカスを獲得したときに復元される。要求された物理メモリの量が、エンドユーザが指定したアプリケーションの物理メモリの限界を上回った場合、この呼出しは失敗する。
ＳＯＦＴＬＯＣＫ要求は、ＭＯＳＴＲＥＣＥＮＴＬＹＵＳＥＤ要求よりも優先順位が高い。
オペレーティングシステムがメモリを必要とするときには、ＳＯＦＴＬＯＣＫをオーバライドすることができる。
ＳＯＦＴＬＯＣＫメモリは、ＤＭＡまたは割込みサービスルーチンに対して使用してはならない。
【００９２】
パラメータ
ｄｗＦｌａｇｓ
ＤＭＬＯＣＫ＿ＳＯＦＴＬＯＣＫ  アプリケーションがフォーカスを有するときにこのメモリをページロックする。
ＤＭＬＯＣＫ＿ＳＨＡＲＥＤＳＯＦＴＬＯＣＫ  アプリケーションがフォーカスを持たない場合でも、このメモリをページロックする。ＳＯＦＴＬＯＣＫに対するその他の全てのルールが適用され、このメモリは、オペレーティングシステムにより再生利用することができる。フォーカスを持たないアプリケーションによりＳＯＦＴＬＯＣＫすることができるメモリの量は、かなり拘束される。フォーカスを有するアプリケーションが優先権を有する。
ＤＭＬＯＣＫ＿ＭＯＳＴＲＥＣＥＮＴＬＹＵＳＥＤ
ｌｐＡｄｄｒ
影響を受けるメモリの先頭を指すポインタ。このポインタは、３８６アーキテクチャシステムの４Ｋページに近い境界の端数は切り捨てられる。ｄｗＳｉｚｅパラメータは、同じ量だけ切り上げられる。
ｄｗＳｉｚｅ
影響を受けるメモリの長さ。ｄｗＳｉｚｅパラメータは、最も近い４Ｋページに切り上げられる。
【００９３】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＯＵＴＯＦＭＥＭＯＲＹ  この要求を満たすだけの物理メモリは残っていない。
【００９４】
ＤｉｒｅｃｔＭｅｍｏｒｙ：：Ｕｎｌｏｃｋ
ＨＲＥＳＵＬＴ  ＤｉｒｅｃｔＭｅｍｏｒｙ：：Ｕｎｌｏｃｋ（ｌｐＡｄｄｒ）
【００９５】
目的
以前にロックされたメモリセクションのＳＯＦＴＬＯＣＫまたはＭＯＳＴＲＥＣＥＮＴＬＹＵＳＥＤの指定を解放する。
【００９６】
パラメータ
ｌｐＡｄｄｒ
以前にＬｏｃｋに渡されたポインタ。
【００９７】
リターン値
ＤＭ＿ＯＫ  操作は正常に完了した。
ＤＭＥＲＲ＿ＮＯＴＬＯＣＫＥＤ  物理アドレスはロックされていなかった。
【００９８】
本発明を特定の実施態様に関して説明してきたが、本発明の範囲を逸脱することなくこの実施態様を変更できることを強調しておく。この実施態様は、コードおよびデータをページ単位で物理メモリとの間でスワッピングする仮想記憶管理システムに対して設計されている。しかし本発明を、コードおよびデータ単位のスワッピングを代替の方式を使用してオペレーティングシステムに適用することもできる。仮想メモリシステムの物理メモリ割当ての状態は、異なるさまざまなフォーマットで記憶することができ、物理メモリ割当ての状態を記憶するための特定フォーマットのデータ構造に対する開発者の設計上の選択、オペレーティングシステムの物理メモリマネージャの設計、および根底にあるプロセッサのメモリアーキテクチャに拠る。
【００９９】
以上に説明した実施態様の方法は、ウィンドウなどのグラフィカルユーザインタフェースからの入力を監視することによってフォーカスの変更を監視することができるマルチタスクオペレーティングシステムに適用される。フォーカスの変更は、ユーザが制御キーまたは１組のキーを押してフォーカスを変更するなどの非グラフィカル入力によっても引き起こされる。フォーカスの変更は、周辺装置によって生成された割込みなどのその他のイベントにオペレーティングシステムが応答することによっても開始される。
【０１００】
本発明の原理を適用することができる多くの可能な実施形態があることを考れば、本明細書に示した実施形態は、単に本発明の好ましい例であるに過ぎず、これを、本発明の範囲を限定するものと解釈してはならない。本発明の範囲は以下の特許請求の範囲によって定義される。したがって発明者らは、これらの特許請求の範囲および趣旨に包含される一切のものを我々の発明として請求する。
【図面の簡単な説明】
【図１】  ３８６プロセッサアーキテクチャにおける仮想メモリアドレッシング方式を示す図である。
【図２】  図１に示したページテーブルディレクトリおよびページテーブルのエントリを示す図である。
【図３】  本発明の実施形態の動作環境として機能するコンピュータシステムを示す図である。
【図４】  本発明の実施形態を示す図である。
【図５】  ページテーブルの一例およびこれと物理メモリとの関係を示す図である。
【図１】
0004718683.tif 000002
【図２】
0004718683.tif 000003
【図３】
0004718683.tif 000004
【図４】
0004718683.tif 000005
【図５】
0004718683.tif 000006