(57)【要約】【課題】マルチプロセッサ・コンピュータ上で実行するプロセスにより生成されるスレッドによってメモリへのアクセスを制御する方法、コンピュータ・プログラムおよびシステムを提供する。【解決手段】ページ・テーブル構造が、新しいスレッドごとに割当てられ、実在するスレッドからコピーされる。ページのアクセスは、ページ存在ビットおよび書込み可能ビットにより制御される。ページ・フォールトの際は、アクセスが一つのスレッドに与えられる。カーネルは新しいページ・エントリ生成プロセスを処理し、ページ・フォールトを生成する前記ページ存在ビットをゼロにセットする。第２の実施例では、２つのページ・テーブル構造が生成される。一つは前記アドレス空間へのアクセスを有する一つのスレッドのためのものであり、もう一つのページ・テーブル構造は前記アドレス空間へのアクセスを有しなかった他のスレッド全てにより共有されるものである。
2010514030.tif 000002
【特許請求の範囲】
【請求項１】
マルチプロセッサ・コンピュータ上で実行するプロセスにより生成されるスレッドによってメモリへのアクセスを制御する方法であって、 
新しいスレッドの生成を前記プロセスがリクエストするステップと、
新しいページ・テーブル・ディレクトリをメモリ記述子の中に割当て、かつ現在あるスレッドのページ・テーブルのコピーを生成するステップと、
イベントを待つステップと、
ページ・フォールトが生じるとき、メモリにページが有るか、そして書込み可能であるかを示す２個のビットをテストするステップと、
もし前記ページが有り、かつ書込み可能であれば、そしてもし前記スレッドがまさに出ようとするところかをテストされるなら、
前記ページ・フォールトを生じさせた前記スレッドに前記ページへのアクセスを許可し、そして前記ページがメモリに有り、かつ書込み可能であることを示すビットをセットし、かつ
イベントを待つ前記ステップに進むステップと、
もし前記ページが有り、かつ書込み可能であるなら、そしてもし他のスレッドが前記ページへのアクセスを有し、そして前記他のスレッドによる前記ページのリリースを待つなら、前記他のスレッドがリリースするのを待つステップと、
前記スレッドがアクセスをリリースしたとき、
前記ページ・フォールトを生じさせた前記スレッドに前記ページへのアクセスを許可し、かつ
前記ページがメモリに有りかつ書込み可能であることを示す前記ビットをセットするステップと、
イベントを待つ前記ステップに進むステップと
を含む方法。
【請求項２】
前記ページがメモリに有りかつ書込み可能であることを示す前記２個のビットをテストする前記ステップの後、もし前記ページが無いかもしくは書込み可能でないなら、前記カーネルに前記ページ・フォールトを処理させるステップと、
前記カーネル・プロセスによる前記新しいページの生成後、前記新しいページが前記対応するビットをテストすることにより書込み可能であるかテストするステップと、
もし前記新しいページが書込み可能であれば、前記新しいページの前記有りビットをリセットするステップと、
前記カーネルにより生成される前記ページ・テーブル・エントリを、前記スレッド全ての前記他のページ・テーブルに伝播するステップと、
イベントを待つ前記ステップに進むステップと
を更に含む、請求項１に記載の方法。
【請求項３】
前記イベントを待つ前記ステップの後、
スレッドがスケジュールされるとき、スケジュールされる予定の前記スレッドの前記ページ・テーブルに前記メモリの前記ハードウエア・コンテキストを切換えるステップと、
イベントを待つ前記ステップに進むステップと
を更に含む、請求項１または２に記載の方法。
【請求項４】
イベントを待つ前記ステップの後、
スレッドが存在するとき、当該スレッドのために前記ページ・ディレクトリをリリースするステップと、
当該スレッドのために前記メモリ・アクセ制御を終了させるステップと
をコンピュータで実行可能にするよう更に含む、請求項１または２に記載の方法。
【請求項５】
前記メモリ記述子において新しいページ・テーブル・ディレクトリを割当て、かつ前記存在するスレッドの前記ページ・テーブルのコピーである新しいページ・ディレクトリを生成する前記ステップが、前記存在するスレッドが前記第１のスレッドである場合にのみ実行され、かつ
前記書込み可能なビット・セットを有する前記ページ全ての前記ページ有りフラグをリセットするステップを更に含む、請求項１ないし４のいずれかに記載の方法。
【請求項６】
前記メモリの前記ハードウエア・コンテキストを、スケジュールされるべき前記スレッドの前記ページ・テーブルに切換える前記ステップに代えて、
もし前記スレッドが前記アドレス空間へのアクセスを有するなら前記存在するページ・テーブルに前記メモリの前記ハードウエア・コンテキストを切換えるステップと、
もし前記スレッドが前記アドレス空間へのアクセスを有しなければ、前記新しく生成されたページ・ディレクトリに前記メモリの前記ハードウエア・コンテキストを切換えるステップと
を更に含む、請求項５に記載の方法。
【請求項７】
前記ページ・ディレクトリをリリースする前記ステップは、スレッドの出口が、
前記プロセスにあと一つだけスレッドが残っているときに前記新しく生成されたページ・ディレクトリをリリースするステップに置き換えられた、請求項５または６に記載の方法。
【請求項８】
請求項１ないし７のいずれか一つに従う方法のステップをコンピュータ上で実行するプログラミング・コード命令を含むコンピュータ・プログラム。
【請求項９】
請求項１ないし７のいずれか一つに従う方法を実行するように適用された手段を含むシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチプロセッサ・システム上で実行する複数のマルチスレッド・アプリケーション・プログラム相互間の共有メモリ・アクセスに関し、本発明は特に、たとえば仮想化マルチスレッド・アプリケーションの複製(replication)を容易にするために、共有メモリ・アクセスの決定論的イベント(deterministic events)を作ることに関する。
【背景技術】
【０００２】
スレッド相互間の共有メモリ・アクセスを仮想化するための安全で素朴な方法はメモリへの全てのアクセスをログして、その複製マシンにおいてこれらを再生(replay)することである。これはパフォーマンスの観点から特に非効率である。
【０００３】
例えば複製マシン上のアプリケーション・プログラムのコードを単に再実行するだけで、プライマリ・マシン上で仮想化されるアプリケーションをバックアップ・マシン上で複製することができるようにするため、順序の決定づけられたマルチスレッド・プログラムの共有メモリ・アクセスを行う必要がある。
【０００４】
そのための主な用途としてフォールト・トレラントなシステムがある。フォールト・トレラント・システムでは、（大きな故障の場合に回復ざせるために）アプリケーションが主マシン上で実行され、その実行結果が第２のマシン上で完全に複製される。その複製は、非決定的結果を生じるイベントの記録および再生、あるいは決定的結果を生じるイベントを複製するためのコードの再実行によって達成される。決定論的マルチスレッド・プログラムにより共有メモリ・アクセスを行う他の一用法は、必要なだけの回数（このケースでは同じマシン上で）そのコードを再実行することにより行われる仮想化プログラムのデバッギングである。
【０００５】
書込み可能な共有領域に関するプロセスのインターリーブされた実行は、非決定であることの潜在的な原因となる。決定論的な共有メモリ・アクセスを行うことができるためには、共有メモリが並行プロセスによってアクセスされる順序が記録される必要がある。ユニプロセッサ・マシンの場合は、スケジューリング期間あたり一つのレコードを単にロギングすることによってその記録動作が最適化される。共有メモリ領域へのアクセスごとにロギングする代わり、もしそのレコードが、スケジューリング期間中にアクセスされた第１の命令の場所、ならびにそのスケジューリング期間の終わりまでにそのプロセスにより実行されたユーザー命令の数とともにプロセス識別子を特定するなら、その共有メモリがアクセスされた、スケジューリング期間あたり一つのレコードをログするのに十分である。その結果、あるスケジューリング期間に対し、共有メモリ・アクセスは決定論的イベントになる。バックアップ・マシンでこのイベントを再現（reproduce）するには、そのスケジューリング期間のレコードを復元し（restore）かつこの期間の間そのコードを再実行するので十分である。
【０００６】
マルチプロセッサ・マシンにこの最適化を拡張（extend）するためには、その共有メモリ領域へのアクセスを直列化するように相互排斥(mutual exclusion)のユニプロセッサの性質が課される必要がある。特許文献１はマルチプロセッサ・システム上のマルチプロセス・アプリケーションの決定論的再生（replay）をどのようにして実施するかを説明している。共有メモリ・アクセス制御機構が記述され、そこではそれはプロセッサのメモリ管理ユニット（ＭＭＵ）を使用する。共有メモリへのアクセスの制御は一つのプロセッサのＭＭＵ（メモリ管理ユニット）ハードウエア・デバイスをあるメモリ・ページへのアクセスを許可するのを可能ならしめるようにプログラムし、他のプロセッサのＭＭＵが同じページへ何らかのアクセスがあっても拒否するようにプログラムされていることによって行われる。
【０００７】
あるスケジューリング期間において、マルチプロセッサ・マシン上では共有メモリへの排他的アクセスが各々の個別のプロセスに与えられる。そのプロセスのページ・テーブルが各スケジューリング期間における１回のプロセスへのアクセスを選択的に許可する手段を備えている。しかし、マルチスレッド・プログラムの場合には、参加プロセスがそれらのアドレス・スペースを共有し、その共有されたページ・テーブルを備えることによる単一プロセッサの解決策はその全体のスレッド・グループに影響を及ぼすことであろう。更に、単一プロセッサ環境におけるプロセスと比べて、全アドレス空間がそれらのスレッドの間で共有されることになり、これらのアクセスを監視し制御するためにその共有アドレス空間の書込み可能な部分へのアクセスが追跡される必要がある。これは、メモリ・ページが共有されていても各タスクがそれ自身のプライベートなメモリ記述子のセットを有することができることを暗示する。これは全てのメモリ記述子が共有されるマルチスレッド・プログラムの場合はそうではない。特許文献１は、一つよりも多くのスレッドを作成する一つのタスクによる共有メモリ・アクセスを追跡するために、その発明において示されるようにモニターされる各タスク内でクローンにされる各スレッドにページ・テーブル・エントリの構造が拡張される必要のあることを示唆する。その発明原理は各タスクもしくは１個のタスクの中の各スレッドに与えられることができ、共有メモリ・ページへのアクセスはスケジューラにより定義された活性化期間(activation period)の全期間(entire duration)に亘って排他的である。この期間中、共有メモリ・ページはコヒーレントに維持される。
【０００８】
こうして全てが（それらのメモリ空間のサブセットのみを共有するプロセスというよりも）それらの全メモリ空間を共有するマルチスレッド・プログラムに適用することができるように、従来技術の共有メモリ・アクセス空間の直列化の機構にするためにカーネルの仮想メモリ・マネジャ・モジュールを拡張する必要がある。
【０００９】
特許文献２はマルチプロセッサ上で分散されたマルチスレッド化されたプログラムのランタイムの挙動を決定論的に再生するための方法を開示する。この方法はＪＶＭ（Ｊａｖａ仮想マシン）におけるルーチンをロックする手段に依存する。この解決策はＪＶＭの修正を暗示し、ＪＶＭのトップでランする純Ｊａｖaアプリケーションに限定され、かつ全てのメモリ・アクセスがＪＶＭにより為されるべきロックにより保護される必要があるという事実によって限定される。
【００１０】
汎用的でかつ任意のタイプのアプリケーションに透過的すなわちトランスペアレントに適用でき、マルチプロセッサ・コンピュータ上のマルチスレッド化されたプロセスに適用する、共有メモリ・アクセス制御を提供する必要がある。
【特許文献１】フランス国特許出願ＷＯ２００６／０７７２６１号
【特許文献２】米国特許第６８５４１０８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
従って本発明の目的は、マルチスレッド・プログラムによる共有メモリ・アクセスを直列化するためそしてそれらを決定論的イベントとなるようにするために、そのようなアクセスをモニター可能かつ制御可能に行うことである。
【００１２】
本発明の他の目的は、アプリケーションにトランスペアレントに実施される方法を提供することにある。
【００１３】
本発明の他の一つの目的は、任意のタスクもしくはスレッドに排他的アクセスをより効果的に提供する、マルチプロセッサ環境において共有リソースへのアクセスを管理するための実在する(exsisting)方法を使用することである。
【課題を解決するための手段】
【００１４】
これらの目的は、特許請求の範囲の請求項１にあるように、マルチプロセッサ・コンピュータ上で実行するプロセスにより生成されるスレッドによってメモリへのアクセスを制御する方法であって、以下を含む方法によって達成される。すなわち、
新しいスレッドの生成を前記プロセスがリクエストするステップと、
新しいページ・テーブル・ディレクトリをメモリ記述子の中に割当て、かつ現在あるスレッドのページ・テーブルのコピーを生成するステップと、
イベントを待つステップと、
ページ・フォールトが生じるとき、メモリにページが有るか、そして書込み可能であるかを示す２個のビットをテストするステップと、
もし前記ページが有り、かつ書込み可能であれば、そしてもし前記スレッドがまさに出ようとするところかをテストされるなら、
前記ページ・フォールトを生じさせた前記スレッドに前記ページへのアクセスを許可し、そして前記ページがメモリに有り、かつ書込み可能であることを示すビットをセットし、かつ
イベントを待つ前記ステップに進むステップと、
もし前記ページが有り、かつ書込み可能であるなら、そしてもし他のスレッドが前記ページへのアクセスを有し、そして前記他のスレッドによる前記ページのリリースを待つなら、前記他のスレッドがリリースするのを待つステップと、
前記スレッドがアクセスをリリースしたとき、
前記ページ・フォールトを生じさせた前記スレッドに前記ページへのアクセスを許可し、かつ
前記ページがメモリに有りかつ書込み可能であることを示す前記ビットをセットするステップと、
イベントを待つ前記ステップに進むステップと
を含む方法である。
【００１５】
これらの目的はまた請求項１の方法により、さらに以下を備えた請求項２に従って達成される。すなわち、
前記ページがメモリに有りかつ書込み可能であることを示す前記２個のビットをテストする前記ステップの後、もし前記ページが無いかもしくは書込み可能でないなら、前記カーネルに前記ページ・フォールトを処理させるステップと、
前記カーネル・プロセスによる前記新しいページの生成後、前記新しいページが前記対応するビットをテストすることにより書込み可能であるかテストするステップと、
もし前記新しいページが書込み可能であれば、前記新しいページの前記有りビットをリセットするステップと、
前記カーネルにより生成される前記ページ・テーブル・エントリを、前記スレッド全ての前記他のページ・テーブルに伝播するステップと、
イベントを待つ前記ステップに進むステップと
を更に含む方法である。
【００１６】
これらの目的はまた本発明の好適な実施例の解決のための請求項３ないし４の方法、および第２の実施例の２つのテーブル構造のための請求項５ないし７の方法でもって達成される。
【００１７】
これらの目的はまた請求項８および９によるコンピュータ ・プログラムおよびシステムによって達成される。
【００１８】
本発明の解決策は、マルチプロセッサ・システム上で実行する各マルチヘッド・アプリケーションのための共有メモリ・ページを参照する別個のメモリ記述子を管理することができるようにする。
【００１９】
マルチスレッド・プログラムにより共有メモリ・アクセスを行うことによって本発明の主たる目的を達成するほかに、以下のような他の効果がある。
―  性能：この共有メモリ・アクセス制御は、それが、共有オブジェクト上の競合度合いを減じるので、粒度（granularity）が変化するとき（時間：命令期間からスケジューリング期間まで、スペース：４バイトのワードから４Ｋバイトのページまで）そのアプリケーションの性能を改良するかもしれない。
―  本発明の第３の目的により記述されるようなこの解決策は、プロセッサにおける現存するハードウエア機能の使用を最適化するのに十分なほど効果的である。好適な実施例の詳細な記述で述べるように、本発明の解決策は、プロセッサにおけるハードウエア変形例だけでなく、オペレーティング・システムのカーネルにおけるいくつかの重いソフトウエアの変化をも避けることによって、現存するコンピュータの変形例を制限する。
―  仮想化されていないタスクはその変形例によるインパクトを受けない。このオリジナルのメモリ管理システムは仮想化していないタスクのために保持される（preserve）。 他の解決策は、予測できない結果をもたらすかもしれない全てのタスクのための変形例を大域化する(globalize)かもしれない。この解決策は選択的に実施されることができる。例えば、メモリの追加的な使用は全てのタスクのためには受け入れることはできない。また、幾つかのタスクは粒度の変化をサポートしないかもしれない。（ハードウエアにより保証される(warrant））自然なアクセス制御は１個の命令ごとであり、またメモリ中の１個のメモリ・ワードのサイズごとである。それを監視するもしくは制御するという能力がない場合でさえそうである。望ましくない効果の一例は、２個のタスクが共有ページを交互にアクセスする場合のピンポン効果であるが、本発明の解決策はこの場合の性能を隠す。何故ならば排他的メモリ・ワードが或る時間スライスに割当てられ、その次のタスクが幾千もの命令を待たなければならないからである。これには一つの解決策があり、特定の命令によりそのページのリリースを特別に許可するようにそのアプリケーションを修正することである。
【図面の簡単な説明】
【００２０】
【図１】本発明が導入されないときのマルチスレッド・アプリケーションにおけるメモリ記述子の構造を示す図である。
【図２】本発明の好適な実施例による、タスクあたり１個のテーブルというメモリ記述子の構造を示す。
【図３】第２の実施例によるメモリ記述子の単純化した構造を示す。
【図４】好適な実施例による方法のフローチャートである。
【図５】第２の実施例による方法のフローチャートである。
【発明を実施するための形態】
【００２１】
マルチスレッドでないアプリケーションでは、共有メモリ・アクセスの順序を効果的に再生するために、共有メモリへの排他的アクセスがスケジューリング期間中の個別のプロセスに与えられる。プロセスのページ・テーブルは各スケジューリング期間中の単一のプロセスへのアクセスを選択的に許可するように装備(instrument)される。しかし、マルチスレッド・プログラムの場合は、そこに参加するプロセスがそれらのアドレス空間を共有し、その共有されたページ・テーブルを道具化することがその全体のスレッド・グループに影響を及ぼす。更に、マルチスレッドでないアプリケーションにおけるプロセスに比べて、全アドレス空間がそれらのスレッド間で共有されるであろう。そしてこれらのアクセスを監視し制御するために共有アドレス空間の書込み可能な部分への任意のアクセスが追跡される必要がある。それから、フォールト・トレラント・システムにおける共有されたアドレス空間へのマルチスレッド・プログラム・アクセスを複製するには、そのアクセス情報がログされ、そしてバックアップ・マシンにおいてプログラム・コードを再実行するによりそのアクセスを再生するのに使用されることになる。
【００２２】
プロセスがその共有されたメモリ領域をアクセスする順序を追跡するために、アクセスが空間と時間において追跡されるときの粒度を変えることによって種々のデザイン選択が浮上する。空間の粒度は個別のメモリ・ロケーションから、ページまで、その全アドレス空間に変化することができるが、時間の粒度は共有領域をアクセスする単一命令から全スケジューリング期間まで変化する。命令レベルの粒度で個別のメモリ・ロケーションへのアクセスを追跡することによって、そのプライマリ上でのアプリケーションの実行は正確に複製されることができる。しかし、そのようにすることは望ましくないし実現可能性もない。
【００２３】
カーネル・スレッドの従来の実装は全スレッド・グループに単一のページ・テーブルを提供する。メモリ・アクセスの順序を追跡するために、以下の技法を用いることができる。その共有ページ・テーブルはアドレス空間の全ての書込み可能な部分へのアクセスを否定するように修正される。そうすることはその領域をアクセスしようとする任意のスレッドがページ・フォールトを生じさせるのを強制するであろう。ページ・フォールト・ハンドラでは、そのアクセスがログされ、現在の命令は、そのメモリ・ロケーションへのアクセスがイネーブルされるようにして、再実行される。これは個々のスレッドによる共有メモリへの個々のアクセスがログされるのを確保する。しかし、この方法はまた個々のメモリ・アクセスを遮ることにより高いオーバーヘッドを課する。
【００２４】
以前の方法の効率を改良するためには、粒度が命令レベルのものからスケジューリング期間のものに変更されても良い。これはスケジューリング期間中のアクセスの相互除外を必要とし、またスレッド・グループ中のスレッド毎に一つ、同期されたセットのページ・テーブルを維持することにより全スケジューリング期間のための個別のプロセスへのアクセスを選択的に与えることができる。スレッドがランするようにスケジュールされていると、その対応するページ・テーブルがＭＭＵのコンテキスト中にロードされる。
【００２５】
スレッド・グループごとに使用されるページ・テーブルのセットは完全に同期されていなければならない。そのセット中の２つのページ・テーブルにまたがる、対応するエントリ相互間の現在フラグに差があり得る。任意のページ・テーブルのエントリが修正されるときは常にその残りのページ・テーブルにその変更が伝播される必要がある。（ａｉｏ、ｓｗａｐなど ）多くのカーネル・サブシステムがページ・テーブルを修正し、各インスタンスではその修正がそのグループのページ・テーブルに一つ残らず伝播される必要がある。
【００２６】
メモリの粒度は考慮すべきもう一つの要素である。バイト（またはプロセッサ・ワード）レベルの粒度が共有メモリ・アクセスの命令を追跡するために必要とされる最適の度合いの直列化を提供する。もしメモリの単位が例えばページであれば、競合するプロセスは競合のロケーションだけというのではなく全ページへのアクセスを否定されることになる。これは多くのリソースへのロックがその同じページに置かれるとき特に問題となる。そのページへのアクセスを直列化することはリソースの全セットへのアクセスを直列化することになる。ワード・レベルの粒度が望ましいが、それはその背景となるアーキテクチャにより使用されるメモリの単位に依存する。典型的なＭＭＵアーキテクチャは最適のページ・テーブル・サイズのためのページ・レベルの粒度でメモリを管理する。
【００２７】
全く反対に、もしアドレス空間レベルの粒度が使用されるなら、スケジューリング期間中に排他的アクセスを提供するのに必要とされるページ・テーブルの数は、スレッド・グループ中のスレッドの数に関係なく２に圧縮される。１個のスレッドのための書込み可能なアドレス空間に排他的アクセスを与えるためには、そのスレッドのページ・テーブル中の対応するエントリが有りとマークされ、一方でその残りのページ・テーブルの書込み可能なエントリが無しとマークされることになる。そのアドレス空間へのアクセスが否定されてきたスレッドの複数のページ・テーブルが同一なので、単一のページ・テーブル（アンチ・ページ・テーブルと呼ぶ）が使用され得る。実際、アンチ・ページ・テーブルの実際のエントリは、ページ変換(translation)で決して使用されないので、無関係である。アクセスを否定されるスレッドのコンテキストからメモリ・アクセスが行われるときは、アンチ・ページ・テーブルがフォールトを強制するように使用されるだけである。あるスレッドがそのアドレス空間へのアクセスを否定されるべきときは、そのページ・テーブルがアンチ・ページ・テーブルに切換えられ、またその逆もありえる。
【００２８】
以下はリナックス・カーネル（Linux kernel、商標）およびリナックス・ページング・モデル（Linux paging model)のコンテキストにスレッドのための共有メモリ排他的アクセス・メカニズムの実装を説明する。その記述はリナックスの特定の用語を使用するが、その方法は他のオペレーティング・システムおよびアーキテクチャにも適用可能とされるように十分一般的である。
【００２９】
特許文献１の特許出願の発明を適用して、共有メモリへの排他的アクセスを与えるためには、その実装が単一のプロセスへのアクセスをシームレスに許可する能力を提供するべきであり、そしていずれかの他のスレッドがその領域をアクセスしようとするときフォールトを生じさせるべきである。最近のアーキテクチャで利用することができるページング・メカニズムはこの目的のために活用される。特定のページが物理メモリに割当てられるかを表す「ページ有り」ビットは、またそのページへの排他的アクセスが他のプロセスに割当てられるときページ・フォールトをトリガーするように人為的にリセットされる。そうすることは、普通のページング・メカニズムと潜在的にぶつかることもあり得る。これはカーネルのファイル交換者がそのページを決して交換しないようにその使用カウンタを増分させることによってそのページ上でのロックを獲得することによって回避される。
【００３０】
図１は本発明が実装されないときのマルチスレッド・アプリケーションにおけるメモリ記述子の構造を示す。それは従来のスレッドによって頁テーブルがどのようにして共有されるかを図式的に示す。図１では、仮想メモリ管理を含む多くのオペレーティング・システムに見出されるようなページ・テーブル階層の一例が示される。メモリ記述子１１０はメモリをアクセスする必要があるプロセスの全てのスレッド１００によりアクセスされる。メモリ記述子は高レベルのページ・テーブル階層である。それはツリーのルートとなるページ・グローバル・ディレクトリ即ちＰＧＤ１３０へのポインタ１２０を含む。そのＰＧＤは、物理メモリへのページ・フレーム１６０、１６５へのポインタであるページ・エントリ（ＰＴＥ）１５０のリストにインデックスを付けるページ・ミドル・ディレクトリ即ちＰＭＤ１４０をポイントする。これらのＰＧＤ、ＰＭＤ、およびＰＴＥがページ・テーブル構造１７０を構成し、スレッドがそれらの共通のアドレス空間のページをアクセスするのを可能にする。その同じページ・フレーム１６０および１６５は前述のページ・テーブル構造１７０を介しその３つのスレッド１００によってアクセスされる。
【００３１】
図２は本発明の好適な実施例による、タスクあたり１個のテーブル、メモリ記述子の構造を示す。
【００３２】
特許文献１の発明を適用する第１のアプローチでは、１個のスレッド毎に排他的アクセスが保障されるように各スレッドのためのＰＴＥを複製するので十分である。これは所与のページ・テーブル・エントリのために対応するページ・テーブルにおける現在のフラグを選択的にオンにすることによって行われる。しかし、アドレス返還がＣＰＵのＭＭＵの中にハードワイヤで行われるので、その全体のページ・テーブル階層は複製される必要がある。実際にも、メモリ記述子２００のさらに高いレベルでその分離が行われることができるが、これにはアドレス空間を処理するのに関係するページ・テーブル階層および他のパラメータを含む。各スレッドには、このアプローチでは、別箇のメモリ識別子が与えられる。リナックスでもって新しいプロセスを生み出し、そのページ・テーブルを複製するフォーク・システム・コールの実装を活用することができよう。フォークを用いることは困難な同期を招来することを暗示するであろう。メモリ識別子広く使用される、アーキテクチャと独立のデータ構造であり、スレッドのための意味論（semantics）を変えることは拡張したカーネル修正を必要とするであろう。更に、集中ロックがスレッド・グループ中の種々のメモリ記述子にまたがるページ・テーブルを同期させるのに必要とされるであろう。
【００３３】
図２に示されるように、好適な実施例では、グループ中の各スレッドがプライベート・ページ・テーブル２１０に割当てられる。これらのプライベート・ページ・テーブル２１０のハッシュ・テーブルは、これにはスレッドｉｄによるインデックスが付けられるが、そのスレッド・グループにより共有されるメモリ記述子２００に維持される。更に、ページ・ディレクトリがコンテキスト切換え動作中に迅速にアクセスされ得るように、そのページ・ディレクトリへのポインタ２２０が、対応するスレッドのプロセス記述子中に置かれる。プロセスのメモリ記述子のみが、カーネルの仮想メモリ管理サブシステム中で動作している際に利用できるとき、このハッシュ・テーブルが特定のスレッドのページ・ディレクトリを得るのに使用される。各スレッドがそのプライベート・ページ・テーブル２１０を一旦有すると、特許文献１の解決策に従う通常のプロセスのための共有メモリ・アクセス制御の場合に行われるのとまさに同じ態様でメモリの書込み可能部分へのアクセスが制御される。スレッドの場合はそのアドレス空間の全てのページが共有されるが、プロセスの場合は共有ページにそのような特定のマークが付けられる。図５に関連して記されるようなプロセスを用いると、そのメモリの幾つかのアクセスが２個のスレッド（スレッド１およびスレッド２）には許可され（２５５、２５７）、全てのスレッドへは幾つかの他のアクセス（２６３、２６５、２６７、２６９）が否定される。
【００３４】
各スレッドが一旦そのプライベート・ページ・テーブル２１０をもつと、メモリの書込み可能部分へのアクセスがそのグループ中の複数のスレッドのうちの１つに選択的に許可される。その許可は、その許可されるスレッドのためのアクセスされたページのＰＴＥにおいてページ有りビットをセットし、一方で他の全てのスレッドのためのビットを、それらがそのページをアクセスしようとすると、ページ・フォールトを発生するようにリセットすることによって行われる。
【００３５】
図３は、あるスレッドに全アドレス空間へのアクセスが与えられるときの、マルチスレッド・アプリケーションの特定の場合におけるメモリ記述子を単純化した構造を示す。本発明の第２の実施例は本書における前述のようなアドレス空間レベルの粒度を適用する。この場合、スケジューリング期間中の排他的アクセスを提供するのに必要とされるページ・テーブルの数は２まで圧縮されることができる。あらゆるスレッド・グループはそれと関連して１対のページ・テーブルを有することになる。それは、プロ・ページ・テーブル３７０とアンチ・ページ・テーブル３７５である。プロ・ページ・テーブル３７０はアドレス変換のために使用され、そのスケジューリング期間中のアドレス空間へのアクセスが与えられるスレッド（図３のスレッド１）に割当てられる。そのスケジューリング期間中はアクセスを否定される、残りのスレッド（スレッド２およびスレッド３）にはアンチ・ページ・テーブル３７５が割当てられる。図示されたページ・テーブル構造はそのスレッド・グループにより共有される独特のメモリ記述子３００を含む。メモリ記述子は２個のページ・テーブル３７０、３７５の其々のページ・ディレクトリ３３０、３３５への２個のポインタ３１０、３２０を含む。各ページ・テーブル構造は、夫々がエントリ３５０、３５５のリストにインデックスを付けるページ・ミドル・ディレクトリ３４０、３４５を含む。図３では、図５と関連して記されるようなプロセスを用いて、２個のページ・フレーム１６０、１６５をアクセスするためのスレッド１へのアクセスが許可され（３６５、３６７）、またそのような２個のページ・フレーム１６０、１６５をアクセスするためのそのグループの他のスレッド、スレッド２およびスレッド３へのアクセスが否定される（３６２、３６４）。
【００３６】
図４は好適な実施例によるスレッド・グループのスレッドからメモリをアクセスするための方法のフローチャートである。
【００３７】
クローン・システム・コールの一部としてプライベート・ページ・テーブルが生成される。もし仮想化されたプロセスがＶＭ＿クローン・フラグ・セット付きのシステム・コールを呼び出さないなら、スレッドのためのアクセス制御システムは使用されず、また今日の方法も実行されない。仮想化プロセスがＶＭ＿クローン・フラグ・セット付きのクローン・システム・コールを呼び出すとき、現在あるコピー＿ＭＭ機能は、生成されているスレッドのためのプライベート・ページ・テーブルを保持するように、またそれをハッシュ・テーブルに加えるようにして新しいページ・ディレクトリを割当てるように修正される。それはそれから全ページ・テーブル階層を対称的にコピーするための新しい機能、ｒｒ＿ｄｕｐ＿ｖｍａｓを呼び出す。この機能は、新しく生成された子プロセスのための新しいページ・テーブルを生成するためフォークによって呼び出されるｄｕｐ＿ｖｍａｓを実在する機能が呼び出された後にモデル化される。これらの二つの機能の間の重要な差は以下のとおりである。ｒｒ＿ｄｕｐ＿ｖｍａｓの場合、全てのページ・テーブル・エントリが例外なくコピーされるが、ｄｕｐ＿ｖｍａｓは、実在するフラグが呼び出したＶＭ＿ＤＯＮＴ＿ＣＯＰＹがセットされるページをスキップする。 更に、ｄｕｐ＿ｖｍａｓ機能が書込み時のコピーオンライト（書換え時コピー）を採用するため親および子の両方のためにアドレス空間読み出し専用の書換え可能部分をマークするが、ｒｒ＿ｄｕｐ＿ｖｍａｓは全ての書換え可能なエントリを無し(absent)にする。あるグループ中の複数のスレッドにより使用されるページ・テーブルのセットはそれらのスレッドのメモリ共有意味論を保存するために同期を維持される。いずれかのページ・テーブルに修正が有れば、これらの変化が他のピアなスレッドのコンテキストに反映されるようにその残りに伝播される。
【００３８】
スレッドのための共有メモリ・アクセス制御の実装は、プロセスの場合には起こらない特定の問題に取り組む必要がある。カーネルはプロセスのアドレス空間をしばしば直接アクセスする。例えば、ユーザー・レベルのスレッドもしくはプロセスがメモリ・バッファを呼び出されたシステム・コールにパスすると、カーネルのファイル・システム・コンポーネントはユーザーにより供給されるバッファに空間プログラムを直接書き込む。共有メモリへのこのようなアクセスはアクセス制御メカニズムにより通常は調停(arbitrate)される。しかし、スレッドの場合は、スレッドがまさに出口から出ようとするとき、カーネルがプロセス・アドレス空間におけるユーザーが供給するメモリ・ポインタにスレッド識別子の値を直接書き込む。このようなアクセスはＰＦ＿ＥＸＩＴＩＮＧと呼ばれるプロセス記述子中の実在するフラグをチェックすることによってアクセスが検知され、そしてもしフラグがセットされるなら、その特定のアクセスが通常のアクセス制御から除外され、そしてカーネルに無条件アクセスが与えられる。
【００３９】
一般に、スレッド単位のページ・テーブルはその対応するスレッドが出口から出るとき出口のシステム・コールを呼び出すことにより明示的に、あるいはカーネルによりキル(kill)されるとき黙示的にフリーにされる。特に、プロセスにおける複数のスレッドのうちの一つがシステム・コール実行(exec system call)を呼び出すと、それはそのプロセスの現在のアドレス空間をアンマップし、システム・コール実行を呼び出したスレッドを除きそのプロセス中の他の全てのスレッドを生成し、キルする。カーネルのスレッド出口動作は、その出口を出るスレッドと関連するページ・テーブル階層およびページ・ディレクトリをリリースするように修正される。システム・コール実行の終了時に、ただ一つのプロセスがページ・テーブルの新たなセットとともに残る。このプロセスにより生成される任意の皇族のスレッドがそのページ・テーブルのコピーを受け継ぎ、その排他的アクセス制御が再び行われる。
【００４０】
図４のフローチャートで、以下のような対応するステップを説明する。
ＶＭ＿クローンを備える新しいスレッドの生成をリクエストするステップ４０５、
メモリ中の新しいページ・テーブル・ディレクトリを記述子に割当て、そしてそのとき存在しているスレッドのページ・テーブルのコピーを生成するステップ４１０、
イベントを待つステップ４２０、
ページ・フォールトが生じる（ステップ４３０）とき、２個のビットがそのページがメモリに有り、そして書込み可能かを示す２個のビットがテストされるステップ４３５、
もし前記ページが有り、かつ書込み可能であれば（イエス・テスト４３５）、そしてもし前記スレッドがまさに出ようとするところかをそのスレッドがテストされるなら（リナックスＰＦビットがテストされるステップ４５５  イエス）、
前記ページ・フォールトを生じさせた前記スレッドに前記ページへのアクセスを許可し、そして前記ページがメモリに有り、かつ書込み可能であることを示すビットをセットし（ステップ４６５）、かつ
イベントを待つ前記ステップ４２０に進むステップ、
もし前記ページが有り、かつ書込み可能であるなら、そしてもし他のスレッドが前記ページへのアクセスを有し、そして前記他のスレッドによる前記ページのリリースを待つ（ステップ４７０）なら、前記他のスレッドがリリースするのを待つステップ４６０、
前記スレッドがアクセスをリリースしたとき、
前記ページ・フォールトを生じさせた前記スレッドに前記ページへのアクセスを許可し、かつ
前記ページがメモリに有りかつ書込み可能であることを示す前記ビットをセットするステップ、および
イベントを待つ前記ステップに進むステップがある。
【００４１】
前記ページがメモリ中に有り、書込み可能であることを示す２個のビットをテストするステップ４３５の後、もし前記ページが有るのではなく、もしくは書込み可能でえないなら、カーネルに前記ページ・フォールトを処理させるステップ４４０、
新しいページが前記カーネル・プロセスによるその生成後に、その対応するビットをテストすることにより書込み可能になるかテストするステップ４４５、
その新しいページが書込み可能であれば、その新しいページの「有り」ビットをリセットするステップ４５０、
カーネルにより生成されたページ・テーブル・エントリを、全てのスレッドの他のページ・テーブルに伝播するステップ４２５、
イベントを待つ前記ステップに進むステップ４２０がある。
【００４２】
イベントを待つ前記ステップの後、
スレッドがスケジュールされる（ステップ４７５）とき、スケジュールされる予定の前記スレッドの前記ページ・テーブルに前記メモリの前記ハードウエア・コンテキストを切換えるステップ４８０、および
イベントを待つ前記ステップに進むステップ４２０がある。
【００４３】
イベントを待つ前記ステップの後、
スレッドが出口から出る（ステップ４８５）とき、当該スレッドのために前記ページ・ディレクトリをリリースするステップ４９０、および当該スレッドのために前記メモリ・アクセ制御を終了させるステップがある。
【００４４】
図５は２個のページ・テーブルの実施例によるスレッド・グループのスレッドからメモリをアクセスするための方法のフローチャートである。
【００４５】
アンチ・ページ・テーブルは、現在のフラグをリセットすることによりディスエ―ブルされるアドレス空間の書込み可能な部分の全てを備えたプロ・ページ・テーブルのレプリカである。それはそのグループの第１のスレッドにより最初に生成され、そのときそれは第２のスレッドをフォークし、スレッド・カウントが１よりも大きくなる。親スレッドおよび子スレッドの両方が初期的にアンチ・ページ・テーブルに割当てられる。その後生成されたスレッドはアンチ・ページ・テーブルをその生成時に割当てられる。フォークから戻る前に、親のハードウエア・コンテキストがアンチ・ページ・テーブルを採用するように切換えられる。子が初めてランするようにスケジュールされると、そのコンテキスト切換えルーチンはアンチ・ページ・テーブルを割当てるであろう。
【００４６】
そのグループ中の任意のスレッドがそのアドレス空間の書込み可能部分をアクセスしようとすると、ページ・フォールト割り込みが発生される。そのページ・フォールト割り込みはプロセッサにより提供される割り込みであり、カーネルを助けてデマンド・ページングおよびコピーオンライトのような機能を実装する。この割り込みをサービスする割り込みハンドラは、プロ・ページ・テーブルにおける対応するエントリの存在（有り）フラグおよび書込みフラグを調べることによって、アクセス制御により引き起こされるフォールトから、カーネルの通常の機能の一部として発生されるページ・フォールト割り込みを区別する。もしそのページが存在し、かつ書込み可能であれば、そのフォールトはアクセス制御により引き起こされたに違いない。そしてそのスレッドは他のスレッドがすでにアクセスをホールドしていないならそのアドレス空間へのアクセスを与えられる。もしそのページが存在しないもしくは、もしそれが読み出し専用ページへの書込みアクセスであったなら、ページ・フォールトは真性であり、カーネルにより提供されるレギュラー・チャネルを介して処理されるであろう。もしそのページがプロおよびアンチのページ・テーブルの両方に存在しないなら、ページ・フォールトがまずはカーネルにより与えられる通常のチャネルを介し、通常のページ・フォールトとして処理されるであろう。もしそのページがプロおよびアンチのテーブルの両方に存在しないなら、ページ・フォールトはそのアドレス空間へのアクセスをアービトレートする前に先ずは通常のページ・フォールトとして処理される。
【００４７】
所与のタイミングで、スレッド・グループ中のスレッドの一つだけがそのアドレス空間へのアクセスをするであろう。そのアクセスをホールドするスレッドのスレッド識別子（ｔｉｄ）がメモリ記述子にストアされ、ロックによって保護される。スレッドがスケジューリング期間中、初めて共有メモリをアクセスしようと試み、そしてその共有メモリが任意の他のプロセスにより既にホールドされているというのでないなら、そのｔｉｄがメモリ記述子の中にストアされ、そのタスクのハードウエア・コンテキストがその新しいページ・テーブルを反映するように変更され、古いページ・テーブルのＴＬＢエントリが無効にされる。ページ・フォールトが生じたものとは異なるプロセッサ叙ウデランするようにタスクがスケジュールされることがあり得る。しかし、これは問題を生じさせない。何故ならばその新しいページ・テーブルが、そのページ・フォールト・ハンドラから戻る前に、ロードされるからである。
【００４８】
もしそのアクセスがすぐに許可されることができないなら、他のタスクがランするようにスケジュールされる。この待機しているスレッドはそのアドレス空間がオーナー・スレッドによりリリースされるときに時としてアクセスを得ることになろう。あるタスクが中断され、あるいはそのタスクが出口を呼び出すと、メモリ記述子にストアされたそのｔｉｄを取り除くことによってそのアクセスがリリースされる。
【００４９】
図５のフローチャートで、対応するステップを説明する。
【００５０】
この第２の実施例の場合、メモリ記述子中に新しいページ・テーブル・ディレクトリを割当て（ステップ４１０）、そしてその存在するスレッドのページ・テーブルのコピーである新しいページ・ディレクトリを生成することはそれが第１のスレッドである場合のみ実行される。そしてそれは更に
書込み可能なビット・セットを有する全てのページのページ存在フラグをリセットするステップを含む。
【００５１】
メモリのハードウエア・コンテキストをスケジュールされるスレッドのページ・テーブルへ切換えるというステップが以下で置き換えられる（ステップ５００）。  もしスレッドがアドレス空間（プロＰＧＤ）へのアクセスを有するなら、メモリのハードウエア・コンテキストをその存在するページ・テーブルに切換え、
もしそのスレッドがそのアドレス空間へのアクセスを有していないなら、そのメモリのハードウエア・コンテキストをその新しく生成されたページ・ディレクトリ（アンチＰＧＤ）に切換える。
【００５２】
スレッドが存在するときにそのページ・ディレクトリをリリースするステップ４９０（図４）がステップ５１０（図５）に置き換えられる。
すなわち、そのプロセスにもう一つだけスレッドが残っているときに、その新しく生成されたページ・ディレクトリをリリースするステップ５１０に置き換えられる。
【００５３】
この好適な実施例の解決策の欠点はページ・テーブルがスレッドごとにインスタンス化されるので、メモリ管理の複雑さを増すかもしれないことである。一つのスレッドにおけるマッピングでの変化はそのグループにおける他のスレッドに伝播される必要がある。２個のページ・テーブルの実施例の場合、アクセス制御の実施はもっと単純である。 
【図１】
2010514030.tif 000003
【図２】
2010514030.tif 000004
【図３】
2010514030.tif 000005
【図４】
2010514030.tif 000006
【図５】
2010514030.tif 000007
【国際調査報告】
2010514030.tif 000008
2010514030.tif 000009
2010514030.tif 000010