(57)【要約】【解決手段】ネットワーク接続型メモリの存在下でキャッシュコヒーレンシを維持することが開示されている。コンピュータシステムが、複数の物理ノードを備える。オペレーティングシステムが、複数の物理ノードにわたって集合的に実行される。物理ノードは、ネットワーク接続型メモリと通信するよう構成されている。複数の物理ノードに含まれる第１物理ノード上のページに関して実行される動作に少なくとも部分的に基づいて、ネットワーク接続型メモリは、メッセージを受信するよう構成されている。ネットワーク接続型メモリは、受信したメッセージに少なくとも部分的に基づいて、アクションを実行するよう構成されている。【選択図】図１７
2019500705.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータシステムであって、
複数の物理ノードを備え、オペレーティングシステムが、前記複数の物理ノードにわたって集合的に実行され、前記複数の物理ノードは、ネットワーク接続型メモリと通信するよう構成され、
前記複数の物理ノードに含まれる第１物理ノード上のページに関して実行される動作に少なくとも部分的に基づいて、前記ネットワーク接続型メモリはメッセージを受信するよう構成され、
前記ネットワーク接続型メモリは、前記受信したメッセージに少なくとも部分的に基づいて、アクションを実行するよう構成されている、コンピュータシステム。
【請求項２】
請求項１に記載のコンピュータシステムであって、前記ネットワーク接続型メモリの部分は、前記物理ノードの各々上で実行中の１セットのハイパーカーネルによって生成された仮想マシン内の物理メモリアドレスに対応する、コンピュータシステム。
【請求項３】
請求項１に記載のコンピュータシステムであって、前記第１物理ノード上の前記ページに関して実行される前記動作は、前記ページへの書き込みを含む、コンピュータシステム。
【請求項４】
請求項３に記載のコンピュータシステムであって、前記メッセージは、無効化要求を含む、コンピュータシステム。
【請求項５】
請求項４に記載のコンピュータシステムであって、前記ネットワーク接続型メモリによって実行される前記アクションは、前記ネットワーク接続型メモリ上に格納されている前記ページのコピーを無効化することを含む、コンピュータシステム。
【請求項６】
請求項５に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、前記無効化の完了を示唆する肯定応答を返すよう構成されている、コンピュータシステム。
【請求項７】
請求項６に記載のコンピュータシステムであって、前記ページへの前記書き込みは、前記返された肯定応答に少なくとも部分的に基づいて実行される、コンピュータシステム。
【請求項８】
請求項１に記載のコンピュータシステムであって、前記第１物理ノード上の前記ページに関して実行される前記動作は、前記ページの読み出し要求を含む、コンピュータシステム。
【請求項９】
請求項８に記載のコンピュータシステムであって、前記ネットワーク接続型メモリによって実行される前記アクションは、前記ページのコピーを受信することを含む、コンピュータシステム。
【請求項１０】
請求項１に記載のコンピュータシステムであって、障害が検出された場合に、前記ネットワーク接続型メモリは、前記複数の中の前記物理ノードに１または複数のページのコピーを要求するよう構成されている、コンピュータシステム。
【請求項１１】
請求項１０に記載のコンピュータシステムであって、コピーが要求された前記１または複数のページは、前記ネットワーク接続型メモリ上で無効であると判定されたページを含む、コンピュータシステム。
【請求項１２】
請求項１１に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、要求したページの対応する取得されたコピーで無効なページを更新するよう構成されている、コンピュータシステム。
【請求項１３】
請求項１に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、集中型の機器を含む、コンピュータシステム。
【請求項１４】
請求項１に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、前記物理ノードの少なくとも一部にわたって分散されている、コンピュータシステム。
【請求項１５】
請求項１に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、フラッシュメモリ、相変化メモリ、および、３Ｄ−Ｘｐｏｉｎｔメモリの内の少なくとも１つを含む、コンピュータシステム。
【請求項１６】
請求項１に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、前記ページの読み出し専用コピーを格納するよう構成されている、コンピュータシステム。
【請求項１７】
方法であって、
ネットワーク接続型メモリでメッセージを受信し、前記メッセージは複数の物理ノード内の第１物理ノード上のページに関して実行される動作に少なくとも部分的に基づいて受信され、
オペレーティングシステムが前記複数の物理ノードにわたって集合的に実行され、前記複数の物理ノードは前記ネットワーク接続型メモリと通信するよう構成され、
前記受信されたメッセージに少なくとも部分的に基づいてアクションを実行すること、
を備える、方法。
【請求項１８】
コンピュータプログラム製品であって、持続性のコンピュータ読み取り可能な記憶媒体内に具現化され、
ネットワーク接続型メモリでメッセージを受信するためのコンピュータ命令と、前記メッセージは複数の物理ノード内の第１物理ノード上のページに関して実行される動作に少なくとも部分的に基づいて受信され、
オペレーティングシステムが前記複数の物理ノードにわたって集合的に実行され、前記複数の物理ノードは、前記ネットワーク接続型メモリと通信するよう構成され、
前記受信されたメッセージに少なくとも部分的に基づいてアクションを実行するためのコンピュータ命令と、
を備える、コンピュータプログラム製品。
【請求項１９】
方法であって、
休止ページを割り当てるための指示を受信し、
１または複数のプロセッサを用いて、前記休止ページを割り当てることを備え、前記休止ページを割り当ては前記割り当てられた休止ページをゼロイングすることを含む、
方法。
【請求項２０】
請求項１９に記載の方法であって、前記割り当てられたページに関連するエントリが、第２レベルページテーブル内に配置される、方法。
【発明の詳細な説明】
【背景技術】
【０００１】
他の出願の相互参照
本願は、名称を「ＮＥＴＷＯＲＫ  ＡＴＴＡＣＨＥＤ  ＭＥＭＯＲＹ  ＵＳＩＮＧ  ＳＥＬＥＣＴＩＶＥ  ＲＥＳＯＵＲＣＥ  ＭＩＧＲＡＴＩＯＮ」とする、２０１５年１０月１日出願の米国仮特許出願第６２／２３６，０７６号に基づく優先権を主張し、当該出願は、すべての目的のために参照により本明細書に組み込まれる。
【０００２】
１つの典型的なフラッシュメモリ利用法は、サーバ内でディスクをシミュレートすることである。さらなる方法でフラッシュメモリを利用することが有益である。残念ながら、サーバのための既存のシステムソフトウェアソリューションは、ディスクストレージとして以外にフラッシュメモリを利用するためのメカニズムを提供していない。
【図面の簡単な説明】
【０００３】
以下の詳細な説明と添付の図面において、本発明の様々な実施形態を開示する。
【０００４】
【図１】コンピュータシステムの一実施形態を示す。
【０００５】
【図２】コンピュータシステムの物理構造を階層として示す図。
【０００６】
【図３Ａ】複数の仮想マシン（それぞれの複数のゲストオペレーティングシステムを備える）が単一の物理マシン上で動作する仮想コンピュータ環境を示す図。
【０００７】
【図３Ｂ】複数の物理マシンが単一の仮想オペレーティングシステムを集合的に実行する仮想コンピュータ環境を示す図。
【０００８】
【図４Ａ】ソフトウェアスタックの一例を示す図。
【０００９】
【図４Ｂ】ソフトウェアスタックの一例を示す図。
【００１０】
【図５】一例のシステム上のハードウェアに対するオペレーティングシステムの視点の一例を示す図。
【００１１】
【図６Ａ】単一のノード上のハードウェアに対するハイパースレッドの視点の一例を示す図。
【００１２】
【図６Ｂ】一例のシステム上のハードウェアに対するハイパーカーネルの視点の一例を示す図。
【００１３】
【図７】一例の企業スーパーコンピュータシステム上のハードウェアに対するオペレーティングシステムの視点の一例を示す図。
【００１４】
【図８】リソースを選択的に移動させるための処理の一実施形態を示す図。
【００１５】
【図９】階層的な動的スケジューリングを実行するための処理の一実施形態を示す図。
【００１６】
【図１０】初期のメモリ割り当ておよびプロセッサ割り当ての一例を示す図。
【００１７】
【図１１】更新後のメモリ割り当てと、未変更のプロセッサ割り当てとを示す図。
【００１８】
【図１２】メモリ割り当てと、更新後のプロセッサ割り当てとを示す図。
【００１９】
【図１３Ａ】ネットワーク接続型メモリが選択的リソースマイグレーションに用いられるシステムの実施形態の一例を示す図。
【００２０】
【図１３Ｂ】ネットワーク接続型メモリが選択的リソースマイグレーションに用いられるシステムの実施形態の一例を示す図。
【００２１】
【図１４】ネットワーク接続型メモリ機器の実施形態の一例を示す図。
【００２２】
【図１５】ページ割り当ての一実施形態を示す図。
【００２３】
【図１６】キャッシュコヒーレンシプロトコルに従ったノード間通信の一実施形態の一例を示す図。
【００２４】
【図１７】ネットワーク接続型メモリの存在下でキャッシュコヒーレンシを維持するための処理の一実施形態を示すフローチャート。
【００２５】
【図１８】ページをゼロイングするための処理の一実施形態を示すフローチャート。
【発明を実施するための形態】
【００２６】
本発明は、処理、装置、システム、物質の組成、コンピュータ読み取り可能な格納媒体上に具現化されたコンピュータプログラム製品、および／または、プロセッサ（プロセッサに接続されたメモリに格納および／またはそのメモリによって提供される命令を実行するよう構成されたプロセッサ）を含め、様々な形態で実装されうる。本明細書では、これらの実装または本発明が取りうる任意の他の形態を、技術と呼ぶ。一般に、開示された処理の工程の順序は、本発明の範囲内で変更されてもよい。特に言及しない限り、タスクを実行するよう構成されるものとして記載されたプロセッサまたはメモリなどの構成要素は、ある時間にタスクを実行するよう一時的に構成された一般的な構成要素として、または、タスクを実行するよう製造された特定の構成要素として実装されてよい。本明細書では、「プロセッサ」という用語は、１または複数のデバイス、回路、および／または、コンピュータプログラム命令などのデータを処理するよう構成された処理コアを指すものとする。
【００２７】
以下では、本発明の原理を示す図面を参照しつつ、本発明の１または複数の実施形態の詳細な説明を行う。本発明は、かかる実施形態に関連して説明されているが、どの実施形態にも限定されない。本発明の範囲は、特許請求の範囲によってのみ限定されるものであり、本発明は、多くの代替物、変形物、および、等価物を含む。以下の説明では、本発明の完全な理解を提供するために、多くの具体的な詳細事項が記載されている。これらの詳細事項は、例示を目的としたものであり、本発明は、これらの具体的な詳細事項の一部または全てがなくとも特許請求の範囲に従って実施可能である。簡単のために、本発明に関連する技術分野で周知の技術事項については、本発明が必要以上にわかりにくくならないように、詳細には説明していない。
【００２８】
図１は、コンピュータシステムの一実施形態を示す。システム１００は、本明細書では「企業向けスーパーコンピュータ」および「メインフレーム」とも呼ばれる。図の例において、システム１００は、近接して位置する（例えば、同じラック内に位置する）複数のノード（例えば、ノード１０２〜１０８）を含む。別の実施形態において、（例えば、同じ施設内に位置する）複数のラックのノードが、システムで用いられてもよい。さらに、本明細書に記載の技術は、分散型システムと併せて利用されてもよい。
【００２９】
ノードは、１０ギガビットＥｔｈｅｒｎｅｔ、ダイレクトＰＣＩ−ｔｏ−ＰＣＩ、および／または、ＩｎｆｉｎｉＢａｎｄなど、高速相互接続（１１０）と相互接続されている。各ノードは、コモディティサーバクラスのハードウェア構成要素（例えば、取り付けられた周辺機器または包含された周辺機器を備えるラック内のブレード）を備える。図１に示す例において、各ノードは、複数の物理プロセッサチップを備える。各物理プロセッサチップ（「ソケット」とも呼ぶ）は、複数のコアを備えており、各コアは、複数のハイパースレッドを有する。
【００３０】
図２に示すように、システム１００の物理構造は、（下から）ハイパースレッド（２３０）、コア（２１０〜２２４）、物理プロセッサチップ（２０２〜２０８）、および、ノード（１０２〜１０８（図から省略され省略記号で表されたノード１０４、１０６などを含む））の階層を形成する。図２に示すツリーは、ハードウェア構成によって規定された固定サイズである。
【００３１】
後に詳述するように、各企業向けスーパーコンピュータ（例えば、システム１００）は、単一のオペレーティングシステムを実行する。オペレーティングシステムおよび任意のアプリケーションの両方が、標準的な市販のソフトウェアであってよく、システム１００上で動作しうる。本明細書に記載の例において、オペレーティングシステムはＬｉｎｕｘ（登録商標、以下同じ）であるが、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ、Ｍａｃ  ＯＳ  Ｘ、または、ＦｒｅｅＢＳＤなど、その他のオペレーティングシステムが用いられてもよい。
【００３２】
従来の仮想コンピュータ環境では、複数の仮想マシンが、単一の物理マシン上で動作しうる。このシナリオは、図３Ａに図示されている。具体的には、３つの仮想マシン（３０２〜３０６）が、単一の物理マシン（３０８）上で３つのゲストオペレーティングシステムを実行しており、物理マシンは、独自のホストオペレーティングシステムを有する。対照的に、本明細書に記載の技術を用いると、複数の物理マシン（３５４〜３５８）が、図３Ｂに示すように、単一の仮想オペレーティングシステム（３５２）を集合的に実行する。
【００３３】
ソフトウェアスタックの一例が、図４Ａに示されている。かかるスタックは、通例、従来のコンピュータ環境で用いられてよい。図４Ａに示すスタック内では、アプリケーション（４０２）が、データベースエンジン（４０４）上にあり、次いで、データベースエンジン（４０４）は、オペレーティングシステム（４０６）上にあり、その下に、ハードウェア（４０８）がある。図４Ｂは、いくつかの実施形態において用いられるソフトウェアスタックを示している。図４Ａに示したスタックと同様に、アプリケーション（４５２）が、データベースエンジン（４５４）上にあり、次いで、データベースエンジン（４５４）は、オペレーティングシステム（４５６）上にある。しかしながら、オペレーティングシステムの下かつハードウェアの上には、システムの動作をリアルタイムで観察し、システムの動作時にシステムの要求に一致するようにシステムリソースを最適化するソフトウェアの層（本明細書ではハイパーカーネルと呼ぶ）がある。ハイパーカーネルは、概念的には、一群のコモディティサーバのＲＡＭ、プロセッサ、および、Ｉ／Ｏ（例えば、ストレージ、ネットワーキングリソースのための入力出力リソース）を統合し、その統合したセットをオペレーティングシステムに提示する。この抽象化のため、オペレーティングシステムからは、プロセッサ、メモリ、および、Ｉ／Ｏの集合的なセットを含む単一の大型コンピュータが見える。後に詳述するように、ハイパーカーネルは、リソースの利用を最適化する。ハイパーカーネルは、ネットワークおよびストレージなど、他のＩ／Ｏシステムリソースの最適化も助けうる。いくつかの実施形態において、実行中のソフトウェアの観察およびプロファイルに基づいて、パフォーマンス指標（ヒント）が、システムパフォーマンス全体をさらに改善しうるシステムの動的パフォーマンスについて、上層（例えば、データベース管理システム）に提供される。
【００３４】
ハイパーカーネルは、すべての主要なマイクロプロセッサ、メモリ、相互接続、永続記憶装置、および、ネットワーキングアーキテクチャに移植されうる。さらに、ハードウェア技術が（例えば、新たなプロセッサ、新たなメモリ技術、新たな相互接続などで）進化するにつれ、ハイパーカーネルは、産業の進化を活用する必要に応じて修正されうる。
【００３５】
図４Ｂに示すように、オペレーティングシステム４５６は、一連のノード（４５８〜４６２）にわたって集合的に実行しており、各ノードは、サーバハードウェア上で動作するハイパーカーネルを有する。具体的には、オペレーティングシステムは、一群のハイパーカーネルによって定義された仮想環境上で動作している。後に詳述するように、オペレーティングシステム４５６の視点では、オペレーティングシステムは、個々のノード４５８〜４６２のハードウェアリソースすべてを含む単一のハードウェアプラットフォーム上で動作している。したがって、各ノードが１ＴＢのＲＡＭを備える場合、オペレーティングシステムからは、自身が、３ＴＢのＲＡＭを備えたハードウェアプラットフォーム上で動作しているように見える。その他のリソース（処理能力およびＩ／Ｏリソースなど）も、同様に、オペレーティングシステムの視点で集合的に利用可能になりうる。
【００３６】
図５は、一例のシステム上のハードウェアに対するオペレーティングシステムの視点の一例を示す図である。具体的には、オペレーティングシステム（５０２）は、プロセッサ５０４〜５０８および物理共有メモリ５１０の上で動作する。上で説明したように、オペレーティングシステムは、従来のコンピュータシステム上または図１に示したような企業のスーパーコンピュータ上のいずれかで動作できる。いずれにしても、オペレーティングシステムから見ると、自身は、プロセッサ５０４〜５０８および物理共有メモリ５１０にアクセスできることになる。
【００３７】
図６Ａは、単一のノード上のハードウェアに対するハイパースレッドの視点の一例を示す図である。この例において、ノードは、Ｈ１（６０２）〜Ｈ４（６０８）で示された４つのハイパースレッドを有する。各ハイパースレッドは、物理共有メモリ６１２のすべての部分にアクセスできる。物理共有メモリ６１２は、線形メモリであり、位置０から最大量「ｍａｘ」までラベル付けされている。ノードは、３つのレベルのキャッシュ（６１０）も備える。
【００３８】
図６Ｂは、一例のシステム上のハードウェアに対するハイパーカーネルの視点の一例を示す図である。この例では、３つのノード（６５２〜６５６）が、企業向けスーパーコンピュータに含まれる。３つのノードの各々が、４つのハイパースレッド、物理共有メモリ、および、キャッシュを有する（すなわち、各ノードは、図６Ａに示したノード６００の一実施形態である）。所与のノード（例えば、ノード６５２）上のハイパースレッドは、図６Ａに示したのと同じ視点を有する。しかしながら、ハイパーカーネルは、すべてのノード上のすべてのリソースを認識している（すなわち、ハイパーカーネルには、１２のハイパースレッドおよびすべての物理共有メモリが見える）。図６Ｂに示した例において、所与のハイパースレッド（例えば、ハイパースレッド６５８、「Ｈ１−４」）は、ノード番号（例えば、「１」）の後にハイパースレッド番号（例えば、「４」）を続けてラベル付けされる。
【００３９】
図７は、一例の企業スーパーコンピュータシステム上のハードウェアに対するオペレーティングシステムの視点の一例を示す図である。オペレーティングシステムには、Ｐ１〜Ｐｍａｘ（７０２）として図７に示された複数の「仮想プロセッサ」が見える。仮想プロセッサは、企業スーパーコンピュータに含まれるすべてのノードにわたるハイパースレッドの総数に対応する。したがって、図６Ｂの例を用いると、合計１２のハイパースレッドが３つのノードにわたって存在する場合、企業向けスーパーコンピュータ上で動作するオペレーティングシステムにとっては、合計１２の仮想プロセッサが見えることになる。オペレーティングシステムには、すべてのノードにわたる物理メモリの総量に等しいサイズの大型の物理的な線形メモリのように見える「仮想物理メモリ」（７０４）も見える。
【００４０】
後に詳述するように、ハイパーカーネルは、実行中のシステムの観察に基づいて、キャッシュメモリの利用および仮想プロセッサの配置を動的に最適化する。「仮想プロセッサ」は、そのゲストオペレーティングシステムに知られている計算エンジン（すなわち、何らかのオペレーティングシステムコンテキストまたは状態を有するもの）である。後に詳述するように、「シャドープロセッサ」は、匿名の仮想プロセッサ（すなわち、仮想プロセッサであったが、現在は、そのオペレーティングシステムコンテキストを放棄しており、ハイパーカーネルにのみ知られるコンテキストを有するもの）である。
【００４１】
リソースの仮想化
【００４２】
メモリの仮想化
【００４３】
上述のように、物理構成において、各ノードは、メモリ内での位置を表す一連のメモリアドレスを有する。このように、（例えば、図６Ｂに示したように）３つのノードを有する物理構成においては、各々がアドレス０ｘ１２３４５６を有する３つのメモリ位置がある。対照的に、仮想構成においては、すべてのメモリアドレスが一意的であり、それらの３つのノードに含まれるすべてのメモリの総計を表す。仮想構成では、すべてのメモリが共有され、すべてのメモリキャッシュがコヒーレントである。いくつかの実施形態において、メモリは、単調増加するメモリアドレスで、一連の連続的なブロックにさらに分割される。本明細書に記載される例において、各ページは、４Ｋバイトのメモリを有するが、適用できる場合、その他の分割が用いられてもよい。「ブロック」という用語は、本明細書では、メモリ位置の連続的な配列を記述するのに用いられる。いくつかの実施形態において、「ブロック」は「ページ」である。
【００４４】
プロセッサの仮想化
【００４５】
オペレーティングシステムから見られる仮想プロセッサ（例えば、図７の仮想プロセッサ７０６）は、物理構成内のハイパースレッド上に実装されるが、位置独立でありうる。したがって、オペレーティングシステムは、単一の物理サーバ上で動作する５００のプロセッサを有すると考えるが、実際には、各々１００プロセッサの５ノードを有しうる。（つまり、図６Ｂに示したように、オペレーティングシステムは、単一の物理サーバ上で動作する１２のプロセッサを有すると考える）。仮想プロセッサ上で実行される計算は、計算が実行されている場合にハイパースレッド上の物理構成によって、または、仮想プロセッサが動作中ではない場合（すなわち、計算の中断またはストールの状態）に「継続（ｃｏｎｔｉｎｕａｔｉｏｎ）」で記述される。
【００４６】
本明細書で用いられているように、「継続」は、仮想プロセッサの状態を表す。各継続は：
【００４７】
・プロセッサ状態（すなわち、退避レジスタなど）を有する。
【００４８】
・実行に向けてリーフノードに継続をインテリジェントに割り当てる方法に関する情報でスケジューラオブジェクトを導く１セットのパフォーマンスインジケータを有する。
【００４９】
・オペレーティングシステムの考えるプロセッサがこの継続の割り当てられる物理プロセッサであることを示す仮想プロセッサ識別子を有する。
【００５０】
・この継続が待っている（おそらくは、エンプティである）イベントを有する。
【００５１】
・以下を含む状態を有する：「イベント待機」または「レディ」。
【００５２】
Ｉ／Ｏの仮想化
【００５３】
Ｉ／Ｏシステムは、プロセッサおよびメモリと同様のパラダイムに従う。デバイスは、物理構成における物理アドレスおよび仮想構成における仮想アドレスを有する。（後に詳述する）計算を移動させる時に、例えば、Ｉ／Ｏ動作に関連するメモリバッファがある場合、利用されるＩ／Ｏデバイスは、それらが関連するメモリと同じ場所に配置されれば、より性能が高くなる可能性があり、状況に応じて移動可能である。
【００５４】
リソースマップ
【００５５】
リソースマップは、仮想構成と物理構成との間の翻訳に用いられる。以下は、様々な実施形態において企業向けスーパーコンピュータによって用いられる３つのタイプのリソースマップである。
【００５６】
「物理リソースマップ」は、各ノードで利用可能な物理リソースを記述するテーブルである。それは、例えば、各ノード上のプロセッサ、デバイスの数およびタイプ、利用可能なメモリおよびその物理アドレスの範囲、などを含む。いくつかの実施形態において、このテーブルは、読み出し専用であり、起動時に固定される。
【００５７】
「初期仮想リソースマップ」が、オペレーティングシステムの起動の前に固定され、オペレーティングシステムの観点から利用可能な仮想リソースを記述する。構成は、オペレーティングシステムによって読み取り可能である。一部の例において、下層のハードウェアリソースと、一対一で一致しない（オペレーティングシステムの視点からの）システムを構成することが望ましい場合がある。一例として、オペレーティングシステムにとっては、より多くのメモリおよびより少ないコアを有することが望ましい場合がある。これは、メモリ対コアの比を変更することによって（すなわち、初期仮想リソースマップを修正することによって）達成できる。
【００５８】
「現行のリソースマップ」が、各ハイパーカーネルインスタンスによって作成および維持される。このマップは、各ノードの視点からの仮想リソースマップと物理リソースマップとの間の現行のマッピングを記述する。仮想リソースマップ内の各エントリに対して、仮想リソースへ現在割り当てられている物理リソースの定義が維持される。最初（例えば、起動時に）、現行のリソースマップは、初期仮想リソースマップのコピーである。ハイパーカーネルは、リソース負荷の特性を観察しながら、時間と共に現行のリソースマップを修正し、仮想リソースに対する物理リソースのマッピングを動的に変更する（および逆も行う）。例えば、仮想化マシンにおけるイーサネットコントローラｅｔｈ２７の位置の定義は、異なるハードウェアコントローラを、異なる時間に参照しうる。現行のリソースマップは、必要に応じて、仮想ハードウェアリソースマッピングを動的に修正するためにハイパーカーネル（仮想メモリサブシステムなど）によって用いられる。
【００５９】
リソースマイグレーション（移動）の概要
【００６０】
本明細書に記載の技術を用いれば、仮想リソースを物理位置の間で移動できる。上述のように、オペレーティングシステムは、仮想システムに関する情報を提供されるが、その情報は、物理システムと一致する必要はない。
【００６１】
以下の例において、企業のスーパーコンピュータが、単一のノードに収まりうるよりも大きい大型のインメモリデータベースを保持すると仮定する。データベースの一部は、第１ノード「ノード１」にある。異なるノード「ノード２」上のコアの１つが、ノード１によって所有されノード２上のキャッシュにローカルに存在しないデータにアクセスを試みていると仮定する。ノード２上のコアは、アクセスできると思われる（ただし、アクセスできない）データへのアクセスを試みているので、メモリアクセス違反を受信する。後に詳述するように、例外は、ハイパーカーネルにおいて処理される。
【００６２】
その状況を解決できる一方法は、必要なメモリ領域をノード２に移した後に、制御をオペレーティングシステムに戻す（オペレーティングシステムは、次に、制御をデータベースシステムに戻す）ことによる方法である。次いで、ソフトウェアは、意図されたように進むことができる（すなわち、アクセス違反が起こらなかったかのように）。
【００６３】
多くの場合、上記のノード２が必要とするメモリの同じ領域ブロックにアクセスを試みている他のノード（例えば、「ノード３」）内の１または複数の他のコアが存在しうる。ノード３は、同じデータにアクセスを試みている場合もあるし、移されたメモリに含まれる別のデータにアクセスしている場合もある（「偽共有」とも呼ぶ）。データは、ノード３に移動されることができるが、ノード２上のコアが、二回目にデータを要求した場合、データは、ノード２に戻される必要があり（すなわち、潜在的にデータの往復を繰り返す）、これは、遅くて無駄が多い場合がある。コア間のデータの往復移動を避けるための一方法は、両方のコアと、データに関連するブロックが、同じ場所にあることを認識することである。本明細書に記載の技術を用いれば、メモリおよび計算が、同じノードに存在するように移行されうる。そうすることにより、データへのより高速なアクセスの可能性が高くなり、ローカルキャッシュに格納されたデータを共有する可能性が高くなる。
【００６４】
アクセス違反が起きると、イベントが（システム依存の方法で）トリガされ、それにハイパーカーネルが応答する。かかるイベントに対処する方法の一例は、パニックルーチンの呼び出しによる方法である。適切であれば、その他のアプローチが用いられてもよい。後に詳述するように、ハイパーカーネルは、イベントの原因を分析し、イベントに対処するために適切な戦略（例えば、低レベルトランザクション）を決定する。上述のように、イベントに対処する一方法は、ハイパーカーネル仮想化メモリの１または複数のブロックが、或るノードのメモリから別のノードのメモリへ転送される方法である。次いで、転送が開始され、対応するリソースマップが更新される。継続は、再開された時に行う次のことが、転送の完了後にオペレーティングシステムに制御を戻すことになるように、イベントテーブル（後述する）と呼ばれる共有メモリ内のローカルテーブルに配置される準備が整うように構築される。要求されているメモリを含むノードに仮想プロセッサを移動させる決定、または、或るノードから別のノードへ仮想メモリ（およびその仮想メモリアドレス）を移動させる決定もなされうる。様々な実施形態において、ハイパーカーネルは、イベントに対処する時に以下の３つの決定を行う：どの（仮想）リソースが移動すべきか、いつ移動させるべきか、および、（物理位置に関して）どこへ移動すべきか。
【００６５】
タイダルツリー（ＴＩＤＡＬＴＲＥＥ）
【００６６】
図２に示した物理階層構造は、１セットの「スケジューラオブジェクト」（すなわち、データ構造）を含む類似のソフトウェア階層を有し、各スケジューラオブジェクトは、後述の１セットの特徴を有する。スケジューラオブジェクトは、「タイダルツリー」を形成し、これは、ツリーの各ノードがスケジューラオブジェクトであるインメモリツリーデータ構造である。各スケジューラオブジェクトは、スーパーコンピュータの物理構造の要素に対応する（ただし、必ずしも逆は成り立たない）ので、マシン全体に対して１つのノード（例えば、図２に示したノード１００）、システムの各物理ノードに対して１つのノード（図２に示したノード１０２）、マシン全体を含む物理ノード上の各マルチコアソケットに対して１つのノード（例えば、図２に示したノード２０２）、各ソケットの各コアに対して１つのノード（例えば、図２に示したノード２１０）、そのコア上の各ハイパースレッドに対して１つのノード（例えば、図２に示したノード２３２）が存在する。
【００６７】
各スケジューラオブジェクトｓは、
【００６８】
・物理的構成要素（例えば、ラック、ブレード、ソケット、コア、ハイパースレッド）に関連する。
【００６９】
・ツリーのルートを除いて、（後に詳述するように）その動作を方向付けることに部分的に関与する親スケジューラオブジェクトを有する。
【００７０】
・各々がスケジューラオブジェクトである１セットの子オブジェクトを有する。これは、リーフ（例えば、ハイパースレッド）ノードについては空のセットである。後に詳述するように、作業を管理して、その子オブジェクトに、そして、間接的に孫オブジェクトなどに、作業を割り当てる（または、割り当て直す）のが、スケジューラオブジェクトｓの役割である（すなわち、ｓは、ｓをルートとするサブツリー内のすべてのノードを管理する）。
【００７１】
・（上述のように）１セットの継続である作業キューを有する。
【００７２】
・作業を管理して割り当てる（または割り当て直す）ことに同じく関与する（おそらくは空の）セットのＩ／Ｏデバイスを有する。
【００７３】
各ノードは、何らかのキャッシュメモリの形態の層と潜在的に関連付けられうる。キャッシュ階層は、スケジューラオブジェクトが高くなるほど、通常は、計算が階層の対応するレベルのキャッシュを効率的に利用することが遅くなるという意味では、ツリーの階層に従う。物理ノードに対応するスケジューラオブジェクトのキャッシュは、そのノードに対応するメモリのキャッシュでありうる。物理ノード上のメモリは、仮想マシンのメモリのキャッシュと考えることができる。
【００７４】
リソースマイグレーション−追加情報
【００７５】
ハイパーカーネルは、仮想構成が存在する仮想ハードウェアの一部をシミュレートする。それは、イベント駆動型アーキテクチャであり、翻訳された物理ハードウェアイベントだけでなく、他のノード上で動作するハイパーカーネルコードによって生成されたノード間ハイパーカーネルメッセージの受信など、ソフトイベントも処理する。
【００７６】
上述のように、ハイパーカーネルにとって重要な割り込みイベントが発生すると、ハイパーカーネルは、割り込みに応答する方法を決定する。制御がオペレーティングシステムに戻される前に、任意のより高い優先順位の割り込みが認識され、適切な動作が取られる。また、上述のように、ハイパーカーネルは、３つの別個の決定を行いうる。（１）特定のイベント後にどのリソースが移動すべきか、（２）いつそれらを移動させるか、および、（３）それらのリソースはどこに移動すべきか。
【００７７】
以下の例において、仮想マシン内のスケジューラオブジェクト「ｓ」が、定常状態であると仮定する。物理ノードに対応する各スケジューラオブジェクトは、それに割り当てられた１セットの物理プロセッサソケットを有する。これらのソケット内のハイパースレッドは、ビジーであってもそうでなくてもよい。物理ノードは、さらに、いくらかの固定量のメインメモリと、いくつかのネットワークデバイスなど、１セットのＩ／Ｏデバイスと、を有する。スケジューラオブジェクトｓは、ノードに対応する場合、ネットワークと、ｓをルートとするサブツリー内のノードに割り当てられた他のＩ／Ｏデバイスとの管理にも関与する。以下では、リソースが同期または非同期的イベントのいずれかの後にどのように移動しうるのかを説明する。
【００７８】
同期イベントによってトリガされるマイグレーション
【００７９】
以下の例では、リーフノードスケジューラオブジェクトｓと、ｓに割り当てられた仮想プロセッサｐが存在すると仮定する。リーフノードスケジューラオブジェクトｓは、アプリケーションの代わりに、アプリケーションまたはオペレーティングシステムコードを実行しているとする。リーフノードが無限ループに入っていないと仮定すると、ｐは、最終的に、何らかの理由（例えば、Ｉ／Ｏ動作、ページフォールトなどの完了の待機）で、実行すべき作業がなくなる（すなわち、ストールする）。ｐが実際にストールすることを許容する代わりに、ハイパーカーネルは、ストールされた計算に関する情報を或る他のノードに移して、他のノードのプロセッサの１つに、ストールした継続の「責任」を持たせるのか、または、ストールした計算に対するノードの「責任」を維持し、その代わりに現行のノードに関連リソースを移すのかを決定する。
【００８０】
したがって、ストールは、以下の２つの方法のいずれかで処理される：計算が、現在リソースを有する物理ノードに移されるか、あるいは、リソースが、リソースを要求した物理ノードに移される。ストールの処理のための擬似コードの例は、後の「ルーチンの例」セクションで（「ＯｎＳｔａｌｌ」ルーチンとして）提供される。
【００８１】
ストールを処理する方法などの決定は、イベントの到着順、仮想マシン上で実行中の計算の状態、キャッシュの状態、システムまたはノードへの負荷、ならびに、多くのその他のことなど、多くのことに依存しうる。決定は、動的になされる、すなわち、時間の所与の時点に利用可能な最良の情報に基づいてなされる。
【００８２】
ストールした計算の記録
【００８３】
ストールした計算は、「継続」と呼ばれるデータ構造に記録される。継続は、例えば、「イベント待機」または「レディ」でありうる状態を有する。ストールした計算は、状態「イベント待機」を持つ新たに作成された継続として記録される。（例えば、イベントの検出により）ストールの理由が満たされると、対応する継続の状態は、「レディ」に変更される。「レディ」状態を持つ各継続は、最終的に実行に向けてスケジュールされるように、スケジューラオブジェクトの「待機キュー」に格納される。対照的に、「イベント待機」状態を持つ任意の継続は、どのスケジューラオブジェクトの待機キューにも格納されない。その代わり、見つからないリソースの受信など、対応する計算をストールさせたハードウェアイベントの発生が予測される物理ノードのローカル共有メモリに格納される。
【００８４】
さらに、新たに作成された継続は、その作成の原因となったストールイベントに関連付けられる。（ストール）イベントと、これらのイベントを待つ継続との間のこのマッピングは、非同期イベントの迅速なディスパッチを可能にする（後述の「ｈａｎｄｌｅＥｖｅｎｔ」を参照）。継続とイベントとの間のマッピングは、「イベントテーブル」と呼ばれるテーブルに格納され、対応する物理ノードの共有メモリ内に保持される。各物理ノードは、独自のイベントテーブルを有し、物理ノードのイベントテーブルは、物理ノード上のすべてのコアによって直接的にアドレス可能である。物理ノードのイベントテーブルに記録されたすべての予期されたイベントは、物理ノード上で発生しうるハードウェアイベントに対応する。物理ノードｎにマッピングされたスケジューラオブジェクトｓは、ｎを表し、ｎのイベントテーブルは、ｓと関連付けられる。一部の例において、いくつかの継続が、同じイベントを待っている場合があり、イベントがトリガされた時に、何らかの曖昧性の除去が求められうる。
【００８５】
継続は、「ＩｎｉｔＣｏｎｔｉｎｕａｔｉｏｎ」ルーチンを用いて構築される。計算を移動させる決定がなされた場合、リソースを保持するリモート物理ノードが、ストールされた計算に対応する継続を構築し、リモート物理ノードのイベントテーブルにそれを格納する。その継続が再開すると、リソースは利用可能になる。実際には、ハイパーカーネルは、異なるノードに仮想プロセッサを移している。
【００８６】
リソースを移動させる決定がなされた場合、ストールを経験したノードは、リソースの移送を要求し、ＩｎｉｔＣｏｎｔｉｎｕａｔｉｏｎを用いて継続を構築し、ローカルイベントテーブルにそれを格納する。リソースの受信後、継続は、タイダルツリー内の適切なノードにアタッチされ、その継続が再開されると、リソースは、一般に、利用可能かつ可視になる。実際には、仮想リソースは、それを要求したノードに移送されている。
【００８７】
イベントテーブル内に継続を配置することにより、イベントを受信するプロセッサが、ローカルイベントテーブル内で関連する継続を迅速に見つけることが保証されることに注意されたい。計算のストールの理由は、満たされることになる。
【００８８】
ストールに対処すると、仮想プロセッサｐは、実際には一時停止される。ストールを処理して、再開すべき新たな継続を見つけるまでの合間に、ｐは、「匿名のシャドープロセッサ」になる、すなわち、オペレーティングシステムに知られているＩＤのないプロセッサになる。次いで、このシャドープロセッサは、再開すべき新たな継続を探す。これの一例が、後に詳述する「ａｓｓｉｇｎＰｒｏｃｅｓｓｏｒ」ルーチンに見られる。
【００８９】
表記
【００９０】
仮想プロセッサｐをストールしたイベントをｅとする。ｅは、或る物理ノードｎのローカルハードウェアによってトリガされると仮定する。特に、ｒが、ストールイベントの発生の原因となったリソースであると仮定する。リソースｒは、メモリのブロック、Ｉ／Ｏ動作、または、ネットワーク動作でありうる。ｐは、スケジューラオブジェクトｓに割り当てられると仮定し、スケジューラオブジェクトｓは、物理ノードｎを表すスケジューラオブジェクトをルートとするサブツリーに属する。
【００９１】
Ｏｎ−Ｓｔａｌｌ
【００９２】
ｏｎ−ｓｔａｌｌルーチンの一例に対する擬似コードを、以下の「ルーチンの例」セクションで提供する。ｍｉｇｒａｔｉｏｎ−ｃｏｎｔｉｎｕａｔｉｏｎ関数は、リソースが移動すべきではない、すなわち、計算が移動すべきであると、ノードｎ内のプロセッサｐが決定した場合かつその場合に限り、ｔｒｕｅを返す。これは、ノード間でのｒの移動の履歴および頻度、ｒのタイプ、移動のコスト、ｒを待つｎのローカルイベントテーブル内のイベントの数、システム負荷など、多くの要因によって決定されうる。例えば、リソースを待つｎのローカルイベントテーブルに格納された継続がある場合、そのリソースを移動することが望ましくない場合がある。
【００９３】
マイグレーションの恩恵を受ける様々なパターンのイベントが存在する。アクセス違反のようなこれらのパターンのイベントを記述する１つのアプローチは、形式言語理論である。正規（すなわち、チョムスキーのタイプ３）言語は、有限状態オートマトンによって認識することができる。さらに、コンパクトで柔軟な表記を用いて、観察されるイベントの記述は、正規言語の文（またはチョムスキー配列（Ｃｈｏｍｓｋｙ  ｓｅｑｕｅｎｃｅ））としてなされることができ、認識は、対応する有限状態オートマトンにおける状態遷移としてモデル化されうる。イベントの完全なチョムスキー配列が見られる場合、ｍｉｇｒａｔｉｏｎ−ｃｏｎｔｉｎｕａｔｉｏｎは、それに応じて評価される：有限状態オートマトンがチョムスキー配列を受け入れる場合、条件は満たされ、そうでない場合には満たされない。最小化された有限状態マシンの長さは、保持する必要のある履歴の量を規定する。
【００９４】
様々な実施形態において、すべてのイベントがローカルに起こり、イベントを受信する物理ノード上のハイパーカーネルが、それを処理しなければならない−真の同期イベントは、物理ノード間で発生しないと仮定される。ノード間でのマイグレーション戦略を調整するために、「メッセージ」が用いられる。プロセッサまたはシャドープロセッサが、一般に、メッセージの受信を待たない点で、メッセージ「送信」は、ノードの視点からは同期的であるが、メッセージ「受信」は、非同期的である。メッセージが到着すると、仮想割り込みとしてハイパーカーネルによって処理される。一実施形態において、ハイパーカーネルは、処理を待つメッセージがある間は、プロセッサが継続を再開することを許容しない。したがって、制御がオペレーティングシステムに戻される前に、キューがチェックされ、オペレーティングシステムに制御を戻す前に、あらゆるメッセージが処理される。
【００９５】
スケジューラオブジェクトｓおよび継続ｃについて、ツリーの検索を導くために、コスト関数ｃｏｓｔ（ｓ，ｃ）を利用できる。ｐの複数の先祖が空ではないキューを有する場合に、ｐは、空ではない待機キューで見つかった第１先祖でその検索の停止を望まない場合がある。最適化戦略で用いられるメトリクスに応じて、ｐの選択は、ｐとその選択された先祖との間の距離にだけでなく、その他のパラメータ（待機キューの長さなど）にも依存してよい。
【００９６】
スケジューラオブジェクトの（空でない）待機キューにおける「最良適合」継続を返すために、関数ｆｉｎｄ−ｂｅｓｔ−ｗｉｔｈｉｎ（ｓ）を利用できる。考慮できるパラメータの例は以下を含む。
【００９７】
１．キューにおける位置
【００９８】
２．ｐと、継続に記録された最後の位置との間の関係性（それらの位置が近いほど、キャッシュエントリの再利用にとって良くなる）
【００９９】
３．キューに内の継続に記録されたパフォーマンスインジケータ
【０１００】
ｃｏｓｔ関数およびｆｉｎｄ−ｂｅｓｔ−ｗｉｔｈｉｎ関数は、所与のシステム内で適用可能なようにカスタマイズできる。
【０１０１】
非同期イベントによってトリガされるマイグレーション
【０１０２】
非同期イベントの例は以下を含む。パケットの受信、Ｉ／Ｏ転送の完了、リソースの受信、リソースを要求するメッセージの受信、など。一般に、オペレーティングシステムによって管理されるハードウェアデバイスに対応するイベントを受信するハイパーカーネルは、そのイベントに関連する継続をスケジューラオブジェクトｓに供給する必要がある。そうすることにより、ｓは、適切なスケジューラオブジェクトに、そして最終的には、その継続によって表されたオペレーティングシステムによって管理される計算に、この継続を利用可能にする。他方で、イベントが、別の物理ノード上のハイパーカーネルからのメッセージの受信である場合、ハイパーカーネルは、それを直接処理できる。
【０１０３】
説明を簡単にするために、本明細書に記載の例においては、イベントに関連する継続が１つだけであると仮定する。本明細書に記載の手順は、必要に応じて、複数の継続が同じイベントに関連する例に一般化できる。
【０１０４】
いくつかの実施形態において、継続を配置すべきスケジューラオブジェクトの検索は、その継続を構築したツリーのリーフで始まり、その後、（計算がこのノードで以前に実行された場合には）上方に進む。そうすることにより、キャッシュエントリの再利用の可能性が高くなる。
【０１０５】
Ｈａｎｄｌｅ−Ｅｖｅｎｔ
【０１０６】
ｈａｎｄｌｅ−ｅｖｅｎｔルーチンの一例に対する擬似コードを、以下の「ルーチンの例」セクションで提供する。コスト関数ｃｏｓｔ（ｓ，ｃ）は、スケジューリングオブジェクトｓにｃを割り当てる適合性を決定するのに役立つ関数である。コスト関数は、待機キューのサイズ、（キャッシュエントリが再利用される可能性を高めるための）ｓとｃの元々のスケジューリングノードとの間のノードトラバース距離、ならびに、仮想プロセッサ、物理プロセッサ、および、継続の履歴など、様々なパラメータに依存しうる。ｓに近いスケジューラオブジェクトの待機キューの含む継続がすでに多すぎる場合、すべての新たに追加された継続が実行に向けてスケジュールされるまでに比較的長い時間が掛かりうる。ｃｏｓｔ（ｓ，ｃ）に寄与する条件の例を以下に記載しており、それらの状態は、適用可能なようにカスタマイズできる。
【０１０７】
コスト
【０１０８】
コスト関数は、継続を選択してオブジェクトをスケジューリングする時にオプションを評価するために用いられる。コスト関数は、重み付き因子の総和として表現できる。
【０１０９】
ｃｏｓｔ＝ｗ１ｆ１ｘ１＋ｗ２ｆ２ｘ２＋・・・＋ｗｎｆｎｘｎ
【０１１０】
ここで、ｗｉは、対応する因子の重要度を示し、ｘｉは、指数を示す。
【０１１１】
因子ｆｉの例を、以下のコストの各々について記載する。重みｗｉおよび指数ｘｉは、様々な方法で決定できる（経験的に決定する、シミュレーションによって決定する、など）。初期の重みおよび指数は、様々な応用のニーズに合わせることが可能であり、パフォーマンスを改善するために、管理者によって調整されうる。重みは、システムがアクティブである間に調整可能であり、重みの変更は、ハイパーカーネルのセマンティクスを変更せず、動作パフォーマンス特徴だけを変更する。
【０１１２】
考慮できる因子の例は以下を含む。
【０１１３】
・最後のプロセッサがこのスケジューラオブジェクトを評価してからの時間の長さ
【０１１４】
・タイダルツリー内でのスケジューラオブジェクトの高さ
【０１１５】
・作業キューの長さ
【０１１６】
・保留ステータス（すなわち、或るアプリケーションが特定の理由でこのリソースを保存した場合でありうる）
【０１１７】
・ノード仕様（すなわち、ノード自体が、非稼働状態にされた可能性がある、または、問題がある、何らかの形で特殊な機能を有する、など）
【０１１８】
・キュー内の継続の齢
【０１１９】
・この継続を最も実行しそうにない物理プロセッサ
【０１２０】
・この継続を最も実行しそうにない仮想プロセッサ
【０１２１】
・この継続を最後に実行していたノード
【０１２２】
・キャッシュの「温度」（キャッシュは、再利用される可能性のあるエントリを有する場合に「温かい」。キャッシュは、再利用可能なキャッシュエントリを有する可能性が低い場合に「冷たい」）
【０１２３】
・継続のグループメンバーシップ（すなわち、継続は、計算グループの一部であってよく、グループの各要素は、グループのその他のメンバに対する何らかの親和性を有する）
【０１２４】
・パフォーマンスインジケータ（ヒント）および特別な要件
【０１２５】
例
【０１２６】
「ＯｎＳｔａｌｌ」および「ａｓｓｉｇｎＰｒｏｃｅｓｓｏｒ」
【０１２７】
図８は、リソースを選択的に移動させるための処理の一実施形態を示す。いくつかの実施形態において、処理８００は、ＯｎＳｔａｌｌルーチンと共に実行されるなど、ハイパーカーネルによって実行される。処理は、コア（または、プロセッサチップがハイパースレッドを支持するか否かに応じて、コアに含まれるハイパーカーネル）がブロックされている旨の示唆が受信される工程８０２で始まる。一例として、ハイパースレッドがアクセスできないリソース（例えば、ハイパースレッドを保持するノードとは異なるノードに配置されたＲＡＭ）の要求を、そのハイパースレッドが直接的または間接的に受信すると仮定する。ハイパースレッドがリソースにアクセスできない（すなわち、アクセス違反が発生する）場合、割り込みが起こり、それは、工程８０２においてハイパーカーネルによって、インターセプト、キャッチ、または、その他の方法で受信される。特に、ハイパーカーネルは、（提供するよう指示されたリソースへアクセスできないので）ハイパースレッドがブロックされている旨の示唆を工程８０２で受信する。ブロック状態を報告することに加えて、ハイパーカーネルは、アクセスするよう指示されたメモリアドレスおよび試みられたアクセスのタイプ（例えば、読み出し、書き込み、または、修正）などの情報を提供する。
【０１２８】
工程８０４では、ハイパーカーネルは、必要とされるメモリが（例えば、ブロックされたハイパースレッドが位置するノードへ）移動されるべきか、要求処理が再マッピングされる（すなわち、仮想プロセッサが別のノードに移される）べきかを決定する。決定は、必要とされるメモリが位置する場所、キャッシュの温度、ハイパースレッドを保持するノードへの作業負荷、および、必要とされるメモリを保持するノードへの作業負荷（例えば、過負荷または低負荷）など、様々な因子に基づきうる。いくつかの実施形態において、ノードの作業負荷は、タイダルツリーにおける平均キュー長に少なくとも部分的に基づいて決定される。
【０１２９】
ハイパーカーネルは、メモリが移動されるべきであると決定した場合、その現行のリソースマップを用いて、どのノードが必要とされるメモリを保持する可能性があるかを判定し、そのノードへメッセージを送信して、リソースを要求する。ハイパーカーネルは、さらに、継続を作成し、そのイベントテーブルにその継続を配置する。したがって、工程８０２においてブロックされたハイパースレッドは、他の作業を引き受けるために解放され、ａｓｓｉｇｎＰｒｏｃｅｓｓｏｒルーチンを用いて別の仮想プロセッサに割り当てられうる。
【０１３０】
ハイパーカーネルは、優先度の高さに基づいて、そのメッセージキューをチェックする。ハイパーカーネルが、自身の接触したノード（すなわち、「第１接触ノード」）からメッセージを受信すると、いくつかの実施形態において、２つの応答の内の１つが受信される。応答は、第１接触ノードが、必要とされるリソースを有することを示唆してよい（そして、リソースを提供してよい）あるいは、メッセージは、接触ノードが（例えば、そのノードがリソースを別のノードに提供したために）リソースをもはや持たないことを示唆してもよい。後者の状況において、第１接触ノードは、それがリソースを送信する送信先のノード（すなわち、「第２ノード」）のＩＤを提供し、ハイパーカーネルは、リソースを要求する第２メッセージを、この例では第２ノードに送信できる。様々な実施形態において、第２ノードが、自身もリソースを持たないこと（例えば、第３ノードに提供したこと）をハイパーカーネルに報告した場合、ハイパーカーネルは、リソースを要求し続けるのではなく、第３ノードに継続を送信することを選んでよい。継続を送信するか、リソースを継続するかを決定する際に、他の閾値を用いてもよい（例えば、４回の試行）。さらに、リソースを要求するか、継続を送信するかを決定する際に、様々な基準を用いてよい（例えば、コスト関数に従う）。
【０１３１】
ハイパーカーネルは、継続が転送されるべきである（すなわち、ローカルにリソースを受信するのではなく、計算が別のノードに送信されるべきである）と決定した場合、リモートノード（すなわち、必要とされるリソースを持つノード）に、リモートノードがそれ自身の物理アドレス空間内に継続を構築するために利用できる情報を提供する。リモートノード（すなわち、継続を受信するノード）が、自身の必要とするリソースすべてを有する（すなわち、最初のアクセス違反を引き起こしたリソースを保有する）場合、継続は、リモートノードのイベントテーブルに配置される必要はなく、その代わりにタイダルツリーに配置されてよい。リモートノードが、継続を処理するためにさらなるリソースを必要とする場合、受信された継続は、リモートノードのイベントテーブル内に配置される。
【０１３２】
図９は、階層的な動的スケジューリングを実行するための処理の一実施形態を示す。いくつかの実施形態において、処理９００は、ａｓｓｉｇｎＰｒｏｃｅｓｓｏｒルーチンと共に実行されるなど、ハイパーカーネルによって実行される。処理は、ハイパースレッドが割り当てられるべきである旨の示唆が受信される工程９０２から始まる。処理９００は、複数の方法で呼び出されうる。一例として、処理９００は、ハイパースレッドが利用可能である（すなわち、実行すべき現在の作業を持たない）時に呼び出されうる。これは、例えば、継続がなされるべきであるとハイパーカーネルが（例えば、工程８０４において）決定した時に、起こりうる。以前にブロックされたハイパースレッドは、ブロックの対象となった計算を処理する責任がもはやない（すなわち、ハイパースレッドが「匿名のシャドープロセッサ」になる）ので、利用可能になる。第２の例として、処理９００は、以前には利用不可能であったリソースが現在は利用可能である旨のメッセージが（例えば、ハイパーカーネルによって）受信された時に呼び出されうる。ハイパーカーネルは、リソースを必要としていた計算を再開するために、ハイパースレッドをロケートする必要がある。もともとリソースの不足によってブロックされていたハイパースレッドが、リソースの受信後に計算を再開するハイパースレッドである必要はないことに注意されたい。
【０１３３】
工程９０４では、タイダルツリーにおいて、実行の準備が整っている継続が検索され、ハイパースレッドが再開すべきものとして、１つの継続が選択される。様々な実施形態において、タイダルツリーは、リーフレベルから上向きに検索され、コスト関数が、ハイパースレッドにどの継続を割り当てるのかを決定するために用いられる。一例として、ハイパースレッドが利用可能になった時に、最も長い時間にわたってキューに入れられていた継続が、割り当てられうる。リーフレベルに待機中の継続がない場合、または、コスト関数によって指定された閾値外にある場合、ハイパースレッドに割り当てるべき適切な継続が、タイダルツリーで検索される（例えば、コアレベル、次に、ソケットレベル、次に、ノードレベルで）。ハイパースレッドがノードレベルで再開するのに適切な継続が見つからなかった場合、そのノードのハイパーカーネルは、ルートに接触する。ノードレベルで継続が見つからない１つの典型的な理由は、そのノードが完全に利用されるのに十分な作業がないことである。いくつかの実施形態において、ノードまたはノードの一部は、エネルギ節約状態に入りうる。
【０１３４】
時系列
【０１３５】
説明のために、例においては、「スワップ」動作が、継続およびメモリの移動に用いられるが、実際には、これは、すべての実施形態で必要なことでない。
【０１３６】
図１０は、初期のメモリ割り当ておよびプロセッサ割り当ての一例を示す。具体的には、図１０の領域１００２は、メモリの物理ブロック（左側）と、メモリの現在のオーナ（中央列）との間のハイパーカーネルのマッピングを示す。右の列は、メモリの以前のオーナを示す。これは初期のメモリ割り当てであるため、現在および直前のオーナ列は、同じ値を保持する。図１０の領域１００４は、システム仮想プロセッサ（左側）と、物理ノード（中央列）／コア番号（右列）との間のハイパーカーネルのマッピングを示す。
【０１３７】
仮想プロセッサＰ００が位置８ＦＦＦＦを読み出すためにメモリ要求し、ハイパーカーネルがＰ００と同じノード（すなわち、ノード０）へ８ＦＦＦＦを含む１または複数のメモリブロックを移動することを決定すると仮定する。ブロック８ＦＦＦＦは、ノード２に位置する。したがって、図１１に示すように、８ＦＦＦＦを含むブロックは、ノード０に移され、別のブロックが、（排除が必要であり、ブロックが有効である場合には）スワップアウトされる。
【０１３８】
次に、仮想プロセッサＰ０６が位置８１ＦＦＦを読み出すためにメモリ要求をすると仮定する。このブロックのコンテンツは、ノード０に（図１１に示すように）移動されている。ハイパーカーネルは、メモリを再び移動させるのではなく、計算が移動されるべきであると決定してよい。したがって、図１２に示すように、仮想プロセッサＰ０６は、ノード０に移動され、仮想プロセッサＰ０１とスワップされてよい。
【０１３９】
パフォーマンス情報
【０１４０】
ロックおよびその他の同期装置
【０１４１】
様々な実施形態において、ロックのような同期メカニズムの利用が最小限である。例えば、ロックは、スケジューラオブジェクト上でキューの挿入およびキュー継続の除去を行うため、および、イベントテーブルを維持するために用いられる。
【０１４２】
コードパス長
【０１４３】
いくつかの実施形態において、すべてのコードパスの（最大）長は、静的コード解析を通して決定され、その結果、ハイパーカーネル自体で費やされる評価可能な有界の時間が得られる。すべてのデータ構造が、例えば、インデックス付きの配列として、事前に割り当てられうる。タイダルツリーのノードは、起動時に決定され、それらのトラバースの際のステップ数と同様に、不変である。１つの可変長計算が、作業キューの長さと関連があるが、それすら有界でありえ、最悪ケース推定値が計算されうる。別の実施形態では、その他の可変長計算が用いられる。
【０１４４】
スタティックストレージ
【０１４５】
様々な実施形態において、ハイパーカーネルで必要とされるすべてのデータ構造が静的であり、起動時に決定されるので、動的メモリ割り当てまたはガベージコレクションの必要性はない。
【０１４６】
物理メモリ
【０１４７】
ハイパーカーネルによって用いられるすべてのメモリが物理メモリであるので、内部動作に必要なページテーブルも仮想メモリもなく（例えば、それが管理している仮想リソースの管理を除く）、さらに、ハイパーカーネルがオペレーティングシステムと共存するのを助ける。
【０１４８】
データの共有と整合性の維持
【０１４９】
一部の例において、例えば、オペレーティングシステムに提示される仮想マシンの概念的統合性を保つために、或るノードのデータ構造の変化が、別のノードの対応する変化と協調される。本明細書に記載のデータ構造の多くは、「ノードローカル」であり、移動する必要がないか、または、不変であり複製される。ノードローカルであるデータ構造は、ノード上のすべてのハイパースレッドに可視であり、それらによってアドレス可能である。ノードローカルではない（したがって、協調を必要とする）データ構造の例は、現在のリソースマップ（またはその一部）と、タイダルツリーのルートと、移動する継続（すなわち、或るノードから別のノードへ論理的に移動する必要がありうる継続）と、を含む。
【０１５０】
様々な技術が、十分な程度の整合性を維持するために用いられてよい。一部の技術は同期的であり、すべての変化がすべてのノードにとって同時に可視的になること（すなわち、「即時整合性」）を仮定する。他の技術は、より緩和されたソリューションを可能にし、「結果整合性」を追求する。上述のように、企業のスーパーコンピュータの物理ノードは、１または複数の高速相互接続を介して接続されている。ハイパーカーネルの複数のインスタンスが、物理ノード間でメッセージおよびリソースをやり取りするために相互接続される。
【０１５１】
現行のリソースマップの更新
【０１５２】
各物理ノードｎは、物理リソースマップの同じコピー、初期の仮想リソースマップ、および、現行のリソースマップから（例えば、起動時に）開始する。各ノードは、現行のリソースマップの独自のコピーを維持する。
【０１５３】
いくつかの実施形態において、現行のリソースマップ内のリソースｒの各エントリは、以下を有する。
【０１５４】
１．ローカルロック。その結果、物理ノード上の複数のハイパースレッドが同時にｒを修正できなくなる
【０１５５】
２．現在リソースを所有するノードを特定するノード番号
【０１５６】
３．最後にｒを所有していた時から要求された回数ｎのカウントｋ
【０１５７】
４．設定された場合に、このノードｎがｒを求めることを示すブーリアン
【０１５８】
５．設定された場合に、このノードがｒを有するが移送の途中であることを示すブールであり、この場合、ノード番号が新しいオーナを特定する
【０１５９】
いくつかの実施形態において、カウントｋは、限りないリソースの追求に対処するために用いられる。ｋが閾値を超えた場合、システム周囲のリソースを追求するのではなく、新たに構築された継続を移動させる方がよいという決定がなされる。
【０１６０】
以下は、リソースのマイグレーションを開始してリソースを受信するためのメカニズムの一例である。重要なトランザクションは以下を含む。
【０１６１】
１．ノードｎが、リソースｒの要求をｎ’に送信する。
【０１６２】
２．ノードｎ’は、リソースｒの要求をｎから受信する。
【０１６３】
３．ノードｎ’は、特定の状況下でｎに「拒否」メッセージを送信してよく、そうでなければ、「受け入れ」ることができ、リソースｒを送信する。
【０１６４】
４．ノードｎは、リソースｒがこの時点でｎ’によって送信不能である場合、ｎ’から「拒否」メッセージを受信する。ｒがｎ’によって必要とされているか、または、要求の到着時にｒがどこか他の場所に移送されている場合がありうる。要求が拒否された場合、ｎ’は、リソースを移送する先のノードの「移送先」アドレスを送信できる。移送先アドレスがｎ’自体である場合があり、これは、「後に再試行する」ことと等価である。ノードｎは、拒否メッセージを受信すると、ｎ’によって示唆されたノード（しばしば、リソースの新しいオーナ）へ要求を再送信できる。ｎがシステム周囲のリソースを追求することを避けるために、ｎは、リソースを得るための試行の回数を記録することができ、試行の回数が閾値を超えると戦略を切り替える。
【０１６５】
５．ノードｎは、ｎ’がリソースを送信できる場合、リソースｒを受信する。この場合、ｎは、ｃが再開されうるように、ｒを待っていた継続ｃをスケジューリングする必要がある。
【０１６６】
タイダルツリーのルート
【０１６７】
いくつかの実施形態において、システム内のノードセットの内の１つの物理ノードが、「マスタノード」に指定される。このノードは、起動時に、初期仮想リソースマップおよびその他のデータ構造を構築し、他のノードにそれらを複製し、オペレーティングシステム（例えば、Ｌｉｎｕｘ）を起動する責任を有する。マスタノードは、１つの例外を除いて、システムが起動された後には任意の他のノードと同様でありうる。少なくとも１つの物理ノードが、タイダルツリーのルートを格納する必要がある。マスタノードは、ルートが配置されうる場所の一例である。タイダルツリールートスケジューリングオブジェクトのイベントキューの更新が、更新を実行するためにマスタノードへメッセージを送信することによって、各ノードにおいて処理される。
【０１６８】
時間と共に、オペレーティングシステムおよびアプリケーションのリソースアクセスパターンが許す場合には、ハイパーカーネルが適合され、ローカル性が連続的に改善する。
【０１６９】
継続
【０１７０】
上述のように、全ノードにわたる物理メモリアドレスは一意的ではない。いくつかの実施形態において、継続内に物理メモリアドレスを含めることは、パーティション整数インデックスを用いてハイパーカーネル内の重要なデータ構造を指定することによって避けることができる。アドレスが継続内に入れられる必要がある場合、そのアドレスは、ソースの物理アドレスであり、宛先における物理アドレスとの関係性がないので、移動に注意が払われる。継続の移動は、上述のように宛先ノードにそのコンテンツをコピーして、ソースからターゲットへ任意の物理アドレスを再マッピングすることを意味する。
【０１７１】
タイムスタンプ
【０１７２】
いくつかの実施形態では、フリーランニングカウンタへのアクセスが、すべてのノードに可視である。これがない場合、各ノード上のフリーランニングカウンタも利用できる。継続内のカウンタが、ソースと宛先との間でマッピングされる。
【０１７３】
ディスクおよび永続性フラッシュの取り扱い
【０１７４】
必要とされるリソースがディスク（または永続性フラッシュ）上にある場合、いくつかの実施形態において、かかるリソースは、ＲＡＭなどのリソースよりも重い重力場を有するものとして扱われる。したがって、ディスク／フラッシュリソースは、あまり頻繁には移行しない傾向にある。その代わり、継続が、需要に基づいて、必要とされる永続性ストレージを含む物理ノードへ、または、永続性ストレージに関連するバッファへ、より頻繁に移行する。
【０１７５】
オペレーティングシステム構成
【０１７６】
オペレーティングシステムを構成する多くの方法がある。サーバについて、そのオペレーティングシステムが、ハイパーカーネルによって実装された仮想マシンから小さいセットのリソースタイプ：線形ブロック配列、ネットワーク、プロセッサ、メモリ、および、ノード間相互接続を含むストレージ、のみを必要とするよう構成されていると仮定できる。結果として、オペレーティングシステムのインストールの複雑さを軽減できる。
【０１７７】
データ構造および関数の例
【０１７８】
以下のセクションは、様々な実施形態で用いられるデータ構造および関数の例のリストを提供する。
【０１７９】
ｉｎｉｔ−ｃｏｎｔｉｎｕａｔｉｏｎ：計算がストールした時に、継続を開始する。
【０１８０】
ａｓｓｉｇｎＰｒｏｃｅｓｓｏｒ：（可能であれば）シャドープロセッサに新たな継続を割り当てるルーチン。
【０１８１】
ｏｎ−ｓｔａｌｌ（ｒ）：リソースｒについてストールイベントが起きる。
【０１８２】
ｍｉｇｒａｔｅ−ｃｏｍｐｕｔａｔｉｏｎ（ｃｏｍｐｕｔａｔｉｏｎａｌ−ｓｔａｔｅ，ｒ，ｎ）：リソースｒを有すると期待する別のノードｎへの計算状態の移動を要求するためのメッセージ。
【０１８３】
ｏｎ−ｉｎｔｅｒｒｕｐｔ（ｉ）：ソフトウェア割り込みｉが起きる。
【０１８４】
ｈａｎｄｌｅ−ｅｖｅｎｔ（ｅ）：ハイパーカーネルが非同期的イベントを処理するよう要求された時に実行されるルーチン。
【０１８５】
ｒｅｑｕｅｓｔ−ｒｅｓｏｕｒｃｅ（ｒ，ｎ）：ノードｎからのリソースｒの移送を要求する。
【０１８６】
ｉｎｉｔｉａｔｅ−ｓｅｎｄ−ｒｅｓｏｕｒｃｅ（ｒ，ｎ）：ノードｎへのリソースｒの送信を開始する。
【０１８７】
ｏｎ−ｒｅｑｕｅｓｔ−ｔｒａｎｓｆｅｒ−ｒｅｓｐｏｎｓｅ（ｒ，ｎ，ｂ）：ｎからのｒの移送要求が受け入れられたか拒否されたか。拒否された場合、ｂはｔｒｕｅである。
【０１８８】
ｏｎ−ｔｒａｎｓｆｅｒ−ｒｅｑｕｅｓｔｅｄ（ｒ，ｍ）：ｍからのリソースｒに対する要求を受信する。
【０１８９】
ｏｎ−ｒｅｓｏｕｒｃｅ−ｔｒａｎｓｆｅｒｒｅｄ（ｒ，ｎ）：リソースｒの肯定応答がｎから受信された。
【０１９０】
ｏｎ−ｒｅｃｅｉｖｅ−ｒｅｓｏｕｒｃｅ（ｒ，ｎ）：リソースｒがｎから受信された。
【０１９１】
ｍｉｇｒａｔｉｏｎ−ｃｏｎｔｉｎｕａｔｉｏｎ（ｒ）：リソースの移動よりも継続の移動の方が良い場合かつその場合に限り、ｔｒｕｅになる。
【０１９２】
ｐａｒｅｎｔ（ｓ）：スケジューラオブジェクトｓの親スケジューラオブジェクトを返す。
【０１９３】
ｃｏｓｔ（ｓ，ｃ）：スケジューラオブジェクトｓの待機キュー内の継続ｃの配置を評価するために用いられる。
【０１９４】
ｆｉｎｄ−ｂｅｓｔ−ｗｉｔｈｉｎ（ｓ）：スケジューラオブジェクトｓの待機キューに格納された継続を返すコスト関数。
【０１９５】
ｃｏｎｓｅｒｖｅ−ｅｎｅｒｇｙ：低電力モードに入る。
【０１９６】
ｒｅｓｕｍｅ−ｃｏｎｔｉｎｕａｔｉｏｎ（ｃ）：その時点でこの関数を実行しているプロセッサ内のｃによって表された計算を再開する。
【０１９７】
ｖａｌｉｄ（ｉ）：割り込みｉがまだ有効である場合かつその場合に限り、ｔｒｕｅを戻すブール関数。
【０１９８】
ｉｎｉｔｉａｌｉｚｅ（ｂｅｓｔ−ｇｕｅｓｓ）：コスト変数の最良推定を開始する。
【０１９９】
ｉｎｓｅｒｔ−ｑｕｅｕｅ（ｓ，ｃ）：スケジューラオブジェクトｓの待機キューに継続ｃを挿入する。
【０２００】
ｒｅｔｕｒｎ−ｆｒｏｍ−ｖｉｒｔｕａｌ−ｉｎｔｅｒｒｕｐｔ：割り込みにより一時的に停止された実行を再開する。
【０２０１】
ｒ．ｏｗｎｅｒ：リソースｒがローカルであるノードを返す。
【０２０２】
ｒ．ｅ：リソースｒがこのイベントを待っている。
【０２０３】
ｅ．ｒ：このイベントはリソースｒのためのものである。
【０２０４】
ｅ．ｃｏｎｔｉｎｕａｔｉｏｎ：このイベントが起きると、継続を再開する必要がある。
【０２０５】
ｇｅｔ−ｓｔａｔｅ（）：プロセッサの状態を返す。
【０２０６】
ｓｃｈｅｄｕｌｅｒ−ｏｂｊｅｃｔ（ｐ）：プロセッサｐと現在関連しているスケジューラオブジェクトを返す。
【０２０７】
ｏｎ−ｒｅｑｕｅｓｔ−ｔｒａｎｓｆｅｒ−ｒｅｓｐｏｎｓｅ（ｒ，ｍ，ｒｅｓｐｏｎｓｅ）：リソースｒをノードｍから移送する要求への応答。応答は、「拒否される」場合のｔｒｕｅ、または、「受け入れられる」場合のｆａｌｓｅのいずれかでありうる。
【０２０８】
ルーチンの例
【０２０９】
以下は、様々な実施形態で用いられるルーチンの擬似コードの例である。以下では、「ｏｎ−」で始まる関数は、非同期的イベントまたは入ってくるメッセージである。
【０２１０】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２１１】
ｉｎｉｔ−ｃｏｎｔｉｎｕａｔｉｏｎ（ｃｏｍｐｕｔａｔｉｏｎａｌ−ｓｔａｔｅ）
【０２１２】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２１３】
／＊ヒントｈを持つリソースｒを待っているプロセッサｐによるＩｎｉｔＣｏｎｔｉｎｕａｔｉｏｎ＊／
【０２１４】
ｃ＝ａｌｌｏｃａｔｅ  ｃｏｎｔｉｎｕａｔｉｏｎ
【０２１５】
ｃ．ｓｔａｔｅ＝ｃｏｍｐｕｔａｔｉｏｎａｌ−ｓｔａｔｅ
【０２１６】
ｃ．ｌａｓｔ＝ｓｃｈｅｄｕｌｅｒ−ｏｂｊｅｃｔ（ｐ）
【０２１７】
ｃ．ｓｔａｔｅ＝ｗａｉｔｉｎｇ−ｆｏｒ−ｅｖｅｎｔ
【０２１８】
ｃ．ｈｉｎｔｓ＝ｈ
【０２１９】
ｅ＝ａｌｌｏｃａｔｅ  ｅｖｅｎｔ  ｉｎ  ｅｖｅｎｔ−ｔａｂｌｅ
【０２２０】
ｅ．ｒｅｓｏｕｒｃｅ＝ｒ
【０２２１】
ｅ．ｃｏｎｔｉｎｕａｔｉｏｎ＝ｃ
【０２２２】
ｒｅｔｕｒｎ  ｃ
【０２２３】
ｅｎｄ  ＩｎｉｔＣｏｎｔｉｎｕａｔｉｏｎ
【０２２４】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２２５】
ａｓｓｉｇｎＰｒｏｃｅｓｓｏｒ
【０２２６】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２２７】
／＊物理ノードｎにおけるプロセッサｐがシャドープロセッサになると、そのＯ／Ｓのアイデンティティを放棄し、実行を再開するための継続を探し始める。ｐは、以下のように待機キューでかかる継続を探す：＊／
【０２２８】
ｓ＝ｓｃｈｅｄｕｌｅｒ−ｏｂｊｅｃｔ（ｐ）
【０２２９】
ｉｎｉｔｉａｌｉｚｅ（ｂｅｓｔ−ｇｕｅｓｓ）
【０２３０】
ｂｅｓｔ−ｓ＝ｎｉｌ
【０２３１】
／＊上方へトラバースして、最良の候補を追跡する＊／
【０２３２】
／＊ルートのローカルにキャッシュされたコピーがあると仮定する＊／
【０２３３】
ｒｅｐｅａｔ
【０２３４】
ｇｕｅｓｓ＝ｃｏｓｔ（ｓ）
【０２３５】
ｉｆ  ｇｕｅｓｓ＞ｂｅｓｔ−ｇｕｅｓｓ
【０２３６】
ｔｈｅｎ
【０２３７】
ｂｅｓｔ−ｇｕｅｓｓ＝ｇｕｅｓｓ
【０２３８】
ｂｅｓｔ−ｓ＝ｓ
【０２３９】
ｓ＝ｐａｒｅｎｔ（ｓ）
【０２４０】
ｕｎｔｉｌ  ｓ＝ｎｉｌ
【０２４１】
ｉｆ  ｂｅｓｔ−ｓ＜＞ｎｉｌ
【０２４２】
ｔｈｅｎ
【０２４３】
ｃ＝ｆｉｎｄ−ｂｅｓｔ−ｗｉｔｈｉｎ（ｂｅｓｔ−ｓ）
【０２４４】
ｒｅｓｕｍｅ−ｃｏｎｔｉｎｕａｔｉｏｎ（ｃ）
【０２４５】
ｅｌｓｅ  ｃｏｎｓｅｒｖｅ−ｅｎｅｒｇｙ
【０２４６】
ｅｎｄ  ａｓｓｉｇｎＰｒｏｃｅｓｓｏｒ
【０２４７】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２４８】
ｏｎ−ｓｔａｌｌ（ｒ）
【０２４９】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２５０】
／＊ＯｎＳｔａｌｌは、ハードウェアが仮想構成と物理構成との間の不一致を検出した時に呼び出される。より具体的には、ハードウェアがノードｎ上で見つけることができないリソースｒを、ノードｎが要求する。＊／
【０２５１】
ｉｆ  ｍｉｇｒａｔｉｏｎ−ｃｏｎｔｉｎｕａｔｉｏｎ（ｒ）
【０２５２】
ｔｈｅｎ
【０２５３】
／＊ノードｎに計算を送信する＊／
【０２５４】
ｎｎ＝ｏｗｎｅｒ（ｒ）
【０２５５】
／＊ノードｎは、リソースがおそらくノードｎｎにあると考える＊／
【０２５６】
ｍｉｇｒａｔｅ−ｃｏｍｐｕｔａｔｉｏｎ（ｒ，ｎｎ）
【０２５７】
ｅｌｓｅ
【０２５８】
／＊リソースｒを要求する＊／
【０２５９】
ｃ＝ｉｎｉｔ−ｃｏｎｔｉｎｕａｔｉｏｎ（ｇｅｔ−ｓｔａｔｅ（））
【０２６０】
／＊ローカルイベントテーブルにｃを挿入するためのコードをここに挿入する＊／
【０２６１】
ｒｅｑｕｅｓｔ−ｒｅｓｏｕｒｃｅ（ｒ，ｏｗｎｅｒ（ｒ））
【０２６２】
ａｓｓｉｇｎＰｒｏｃｅｓｓｏｒ ／＊この時点で、ｐは匿名のシャドープロセッサである＊／
【０２６３】
／＊ｐは、実行すべき何らかの作業を見つける必要がある＊／
【０２６４】
ｅｎｄ  ＯｎＳｔａｌｌ
【０２６５】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２６６】
ｏｎ−ｍｉｇｒａｔｅ−ｃｏｍｐｕｔａｔｉｏｎ（ｃｏｍｐｕｔａｔｉｏｎａｌ−ｓｔａｔｅ，ｒ，ｎ）
【０２６７】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２６８】
／＊リモートノードは、継続を受信するためのメッセージをｎから得る。注：この場合のｃは、継続のコンテンツであり、継続自体ではない。＊／
【０２６９】
ｃ＝ＩｎｉｔＣｏｎｔｉｎｕａｔｉｏｎ／＊要求内の情報を用いる＊／
【０２７０】
ｃ．ｓｔａｔｅ＝ｃｏｍｐｕｔａｔｉｏｎａｌ−ｓｔａｔｅ
【０２７１】
ｅ＝ｉｎｓｅｒｔ  ｃ  ｉｎｔｏ  ｔｈｅ  ｌｏｃａｌ  ｅｖｅｎｔ−ｔａｂｌｅ
【０２７２】
ｈａｎｄｌｅ−ｅｖｅｎｔ（ｅ）
【０２７３】
ｅｎｄ  ｏｎ−ｍｉｇｒａｔｅ−ｃｏｍｐｕｔａｔｉｏｎ
【０２７４】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２７５】
ｏｎ−ｉｎｔｅｒｒｕｐｔ（ｉ）
【０２７６】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２７７】
／＊（物理ノードｎのサブツリー内の）プロセッサｐが（特定のハードウェア設計に特有の非常に低レベルのメカニズムを用いて）ｉによって割り込まれた時、ｐは、以下の通りにする：＊／
【０２７８】
ｗｈｉｌｅ  ｖａｌｉｄ（ｉ）
【０２７９】
ｅ＝ｅｖｅｎｔ−ｔａｂｌｅ（ｉ）／＊ｉに対応するイベントを見つける＊／
【０２８０】
ｈａｎｄｌｅ−ｅｖｅｎｔ（ｅ）
【０２８１】
ｉ＝ｎｅｘｔ−ｑｕｅｕｅｄ−ｉｎｔｅｒｒｕｐｔ
【０２８２】
ｅｎｄ  ｗｈｉｌｅ
【０２８３】
／＊前の実行を再開する＊／
【０２８４】
ｒｅｔｕｒｎ−ｆｒｏｍ−ｖｉｒｔｕａｌ−ｉｎｔｅｒｒｕｐｔ：
【０２８５】
ｅｎｄ  ｏｎ−ｉｎｔｅｒｒｕｐｔ
【０２８６】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２８７】
ｈａｎｄｌｅ−ｅｖｅｎｔ（ｅ）
【０２８８】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０２８９】
／＊イベントが発生した。イベントテーブルから最良のスケジューラオブジェクトへそのイベントを移動させる。＊／
【０２９０】
ｃ＝ｅ．ｃｏｎｔｉｎｕａｔｉｏｎ ／＊イベントｅのための継続を見つける＊／
【０２９１】
ｅｖｅｎｔ−ｔａｂｌｅ（ｉ）．ｃｌｅａｒ＝ｔｒｕｅ／＊テーブルからイベントを除去する＊／
【０２９２】
ｅ．ｃｏｍｐｌｅｔｅ＝ｔｒｕｅ／＊ｅを完了としてマークする＊／
【０２９３】
ｃ．ｓｔａｔｅ＝ｒｅａｄｙ
【０２９４】
／＊ここで、ｃを置くのに最良の場所を見つける＊／
【０２９５】
ｓ＝ｃ．ｌａｓｔ
【０２９６】
ｉｎｉｔｉａｌｉｚｅ（ｂｅｓｔ−ｇｕｅｓｓ）
【０２９７】
／＊最良の選択を探す＊／
【０２９８】
／＊ルートのローカルにキャッシュされたコピーがあると仮定する＊／
【０２９９】
ｒｅｐｅａｔ
【０３００】
ｇｕｅｓｓ＝ｃｏｓｔ（ｓ，ｃ）
【０３０１】
ｉｆ  ｇｕｅｓｓ＞ｂｅｓｔ−ｇｕｅｓｓ
【０３０２】
ｔｈｅｎ
【０３０３】
ｂｅｓｔ−ｇｕｅｓｓ＝ｇｕｅｓｓ
【０３０４】
ｂｅｓｔ−ｓ＝ｓ
【０３０５】
ｓ＝ｐａｒｅｎｔ（ｓ）
【０３０６】
ｕｎｔｉｌ  ｓ＝ｎｉｌ
【０３０７】
ｉｎｓｅｒｔ−ｑｕｅｕｅ（ｂｅｓｔ−ｓ，ｃ）／＊最良のｓの待機キューにｃを入れる＊／
【０３０８】
ｅｎｄ  ｈａｎｄｌｅ−ｅｖｅｎｔ
【０３０９】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３１０】
ｒｅｑｕｅｓｔ−ｒｅｓｏｕｒｃｅ（ｒ，ｎ）
【０３１１】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３１２】
／＊ノードｎが、ノードｎ’によって所有されるリソースｒを必要とする場合、そのリソースは要求されるが、他の誰かが先を越して要求した可能性があるか、または、ｎ’が現在それを利用しているために、その要求は満たされない場合がある。＊／
【０３１３】
ｃｕｒｒｅｎｔ−ｒｅｓｏｕｒｃｅ−ｍａｐ（ｒ）．ｗａｎｔｅｄ＝ｔｒｕｅ
【０３１４】
ｒｅｑｕｅｓｔ−ｔｒａｎｓｆｅｒ（ｏｗｎｅｒ（ｒ），ｒ） ／＊ｒのオーナに要求を送信する＊／
【０３１５】
／＊ｒの移送を要求する＊／
【０３１６】
ｒｅｔｕｒｎ
【０３１７】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３１８】
ｏｎ−ｒｅｑｕｅｓｔ−ｔｒａｎｓｆｅｒ−ｒｅｓｐｏｎｓｅ（ｒ，ｍ，ｉｓ−ｒｅｊｅｃｔｅｄ）
【０３１９】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３２０】
／＊ここで、あなたはリソースｒについてのノードへの以前の要求からの応答を得るノードであることを考慮する。この要求への応答が来ると、それは、受け入れられるかまたは拒否されうる。＊／
【０３２１】
ｉｆ  ｉｓ−ｒｅｊｅｃｔｅｄ
【０３２２】
ｔｈｅｎ／＊リソースがｍに移送された＊／
【０３２３】
ｉｎｃｒｅｍｅｎｔ  ｋ
【０３２４】
ｉｆ  ｋ＞ｔｈｒｅｓｈｏｌｄ
【０３２５】
ｔｈｅｎ
【０３２６】
／＊あなたは永久に追求したいとは思わない＊／
【０３２７】
／＊リソースを得ようとする。諦める＊／
【０３２８】
ｍｉｇｒａｔｅ−ｃｏｍｐｕｔａｔｉｏｎ（ｒ，ｍ）
【０３２９】
ｒｅｔｕｒｎ
【０３３０】
ｅｌｓｅ
【０３３１】
ｒｅｑｕｅｓｔ−ｔｒａｎｓｆｅｒ（ｒ，ｍ）／＊再試行する＊／
【０３３２】
ｒｅｔｕｒｎ
【０３３３】
ｅｌｓｅ
【０３３４】
／＊要求が拒否されなかった。ｒはリソースである＊／
【０３３５】
ｒ．ｋ＝０
【０３３６】
ｒ．ｗａｎｔｅｄ＝ｆａｌｓｅ／＊リソースが移動された＊／
【０３３７】
ｒ．ｏｗｎｅｒ＝ｍｅ／＊オーナをｎ（すなわち、「私」）に設定する＊／
【０３３８】
ｉｆ  ｔｈｅ  ｒｅｓｏｕｒｃｅ  ｉｓ  ｍｅｍｏｒｙ，
【０３３９】
ｕｐｄａｔｅ  ｔｈｅ  ｈａｒｄｗａｒｅ  ｍｅｍｏｒｙ  ｍａｐ  ｗｉｔｈ  ｔｈｅ  ｎｅｗ  ｍｅｍｏｒｙ
【０３４０】
ｒｅｔｕｒｎ
【０３４１】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３４２】
ｏｎ−ｔｒａｎｓｆｅｒ−ｒｅｑｕｅｓｔｅｄ（ｒ，ｎ）
【０３４３】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３４４】
／＊ｒへのリソース要求がノードｎから来た時、オーナ（ｒ）にとって移送が進行中であれば、要求を拒否する＊／ 
【０３４５】
ｉｆ  ｒ．ｂｅｉｎｇ−ｔｒａｎｓｆｅｒｒｅｄ
【０３４６】
ｔｈｅｎ
【０３４７】
ｓｅｎｄ−ｒｅｑｕｅｓｔ−ｒｅｓｐｏｎｓｅ（ｒ，ｏｗｎｅｒ（ｒ），ｔｒｕｅ）
【０３４８】
ｅｌｓｅ
【０３４９】
／＊リソースの移送が受け入れられる  ＊／
【０３５０】
ｒ．ｔｒａｎｓｆｅｒｒｉｎｇ＝ｔｒｕｅ
【０３５１】
ｉｎｉｔｉａｔｅ−ｓｅｎｄ−ｒｅｓｏｕｒｃｅ（ｒ）
【０３５２】
ｉｆ  ｔｙｐｅ（ｒ）＝ｍｅｍｏｒｙ
【０３５３】
ｔｈｅｎ  ｕｐｄａｔｅ  ｌｏｃａｌ  ｍｅｍｏｒｙ  ｍａｐ
【０３５４】
ｓｅｎｄ−ｒｅｑｕｅｓｔ−ｒｅｓｐｏｎｓｅ（ｒ，ｏｗｎｅｒ（ｒ），ｆａｌｓｅ）
【０３５５】
ｒｅｔｕｒｎ
【０３５６】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３５７】
ｏｎ−ｒｅｓｏｕｒｃｅ−ｔｒａｎｓｆｅｒｒｅｄ（ｒ，ｎ）
【０３５８】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３５９】
／＊移送が完了した旨の肯定応答が来た時＊／
【０３６０】
ｒ．ｏｗｎｅｒ＝ｎ
【０３６１】
ｒ．ｔｒａｎｓｆｅｒｒｉｎｇ＝ｆａｌｓｅ
【０３６２】
ｒｅｔｕｒｎ 
【０３６３】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３６４】
ｏｎ−ｒｅｃｅｉｖｅ−ｒｅｓｏｕｒｃｅ（ｒ，ｎ）
【０３６５】
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
【０３６６】
／＊ここで、要求されたリソースｒを伴うメッセージをｎから受信する＊／
【０３６７】
ｒ．ｋ＝０
【０３６８】
ｒ．ｗａｎｔｅｄ＝ｆａｌｓｅ／＊それが求められていることを示すビットをクリアする＊／
【０３６９】
ｒ．ｏｗｎｅｒ＝ｍｅ／＊オーナをｎ（すなわち、「私」）に設定する＊／
【０３７０】
ｉｆ  ｔｈｅ  ｒｅｓｏｕｒｃｅ  ｉｓ  ｍｅｍｏｒｙ，
【０３７１】
ｕｐｄａｔｅ  ｔｈｅ  ｍｅｍｏｒｙ  ｍａｐ  ｗｉｔｈ  ｔｈｅ  ｎｅｗ  ｍｅｍｏｒｙ
【０３７２】
ｓｅｎｄ−ｒｅｓｏｕｒｃｅ−ｔｒａｎｓｆｅｒｒｅｄ（ｒ，ｎ）
【０３７３】
ｈａｎｄｌｅ−ｅｖｅｎｔ（ｒ．ｅ）／＊待っていたイベントが発生した＊／
【０３７４】
ｒｅｔｕｒｎ
【０３７５】
選択的リソースマイグレーションを用いたネットワーク接続型メモリ
【０３７６】
一連の緊密に結合されたサーバのクラスタ（本明細書では「タイダルポッド（ＴｉｄａｌＰｏｄ）」とも呼ぶ）が集合的なリソースのセットを共有するハードウェアおよびソフトウェアのアーキテクチャの実施形態の例について上述した。これらのリソースは、プロセッサ、ダイナミックメモリ、ストレージ、および、ネットワークなど、いくつかのタイプを含む。かかるシステム内のハイパーカーネルによるこれらのリソースの集約は、一連のノードにわたる仮想マシンの構築を可能にし、オペレーティングシステムおよびアプリケーションにとっては単一の大型サーバに見える。
【０３７７】
本明細書には、ハイパーカーネルによるリソースの集約を拡張して、フラッシュメモリ、ＰＣＭ（相変化メモリ）、３Ｄ−Ｘｐｏｉｎｔ、ハードディスクドライブなどのメモリ技術を含めるための技術が記載されている。フラッシュメモリを含む実施形態の例を以下に記載するが、本明細書に記載の技術は、適用できる場合、任意のタイプのメモリ技術に対応するように様々に適合されうる。
【０３７８】
実施形態の一例において、フラッシュメモリが、物理的バイト配列として構造化される。この配列の各バイトは、クラスタの各サーバ（本明細書では「ノード」とも呼ぶ）上で実行する１セットのハイパーカーネルによって生成された仮想マシン内の物理メモリアドレスに対応する。
【０３７９】
通例、フラッシュメモリは、以下の２つの主な方法で用いられる。ソリッドステートディスク（ＳＳＤ）として、または、携帯電話およびタブレットなどの携帯型電子デバイス内の永続性メモリとして用いられる。サーバ内のフラッシュの主な利用法の一例は、ディスクのシミュレートである。本明細書では、（ａ）ゲストオペレーティングシステムによって認識されるメモリのサイズを、クラスタの利用可能なダイナミックメモリの合計サイズを超えて拡張することによって、大型メモリをアプリケーションおよびデータベースにとって利用可能にするために、ならびに、（ｂ）エラーの存在下でのシステムの回復力を高めるための方法として、例えば、永続性のバックアップメモリとして、フラッシュを用いるさらなる方法を提供する技術が記載されている。
【０３８０】
残念なことに、サーバのためのほとんどのシステムソフトウェアは、メモリ階層の第１クラス要素としてフラッシュを効果的に扱うためのメカニズムを持っておらず、結果として、このソフトウェアは、それが良く理解する方法（すなわち、ディスクストレージ）でフラッシュを利用することに頼っている。
【０３８１】
利用例
【０３８２】
以下は、本明細書に記載する技術によってサポートされるいくつかの利用例である。
【０３８３】
１．例えば、５ＴＢのメインメモリを備えたソフトウェア定義サーバと、１０ＴＢのフラッシュメモリアレイとを考える。実施形態の一例において、サーバは、１０ＴＢのメインメモリを有し、その５ＴＢのメインメモリを１０ＴＢのフラッシュメモリの新たなキャッシュとして有するよう構成される。かかるキャッシュの利用は、システムを高速化する。
【０３８４】
２．別の実施形態において、フラッシュメモリアレイは、合計で１５ＴＢのメインメモリにするための追加のメインメモリであるかのように用いられてもよい。
【０３８５】
３．実施形態の別の例において、フラッシュメモリは、永続性の参照メモリを実装するために用いられてもよい。例えば、システムが差し迫った欠陥を検出した場合、フラッシュメモリのコンテンツは、すでに持っていないメインメモリの最新（最も最近）のページで更新されてよい。このように、システムが再起動する時、永続性メモリは、以前に保存された状態にシステムを復元するのに役立つように利用されうる。したがって、メインメモリは、クラッシュ、エラー、または、その他の障害の際にシステムを容易に再起動できるように、永続性ストレージにバックアップされうる。
【０３８６】
例えば、通例は、障害（例えば、停電またはシステムクラッシュ）の場合、揮発性（例えば、揮発性メモリのコンテンツは、電力がなくなると失われる）であるＤＲＡＭ（ダイナミックランダムアクセスメモリ）などのダイナミックメモリのスナップショットが撮られて、ディスクに書き込まれる。これは、フラッシュメモリなどの永続性（例えば、スタティック、不揮発性）メモリを含むネットワーク接続型メモリに参照コピーを格納またはフラッシュできることから、本明細書に記載の技術を用いて避けることができる。ネットワーク接続型メモリに関する詳細については、後に詳述する。
【０３８７】
４．実施形態の別の例において、本明細書に記載の技術は、ノードの状態を保存し、そのノードを別のノードで置き換えるために用いられてもよい。これは、ノードのアップグレード、欠陥ノードの交換など、様々な理由でなされてよい。
【０３８８】
メモリ階層
【０３８９】
上で提示したアーキテクチャ例において、大きい「物理」アドレス空間が、ゲストオペレーティングシステムに提示される。クラスタ内の各ノードの視点からは、そのノード上のプロセッサによって直接的にアドレスされる「ゲスト物理」アドレスを有するオペレーティングシステムによって見られるゲスト物理アドレス空間内にアドレスが存在する。いくつかの実施形態において、プロセッサによって要求されたゲスト物理アドレスがそのノード上に存在しない場合、メモリアクセス障害がハードウェアによって引き起こされ、（ａ）そのアドレスを含むメモリが、プロセッサの位置するノードに移動またはコピーされるか、もしくは、（ｂ）ゲストプロセッサ（すなわち、ゲストプロセッサに相当する仮想プロセッサ）の実行していた計算が、ゲスト物理メモリの位置するノードに移動される。ハイパーカーネルを用いたリソースマイグレーションメカニズムおよび技術の例について上述した。これら２つの戦略のいずれかが、完了すると、計算をスケジュール可能にすることが可能になり、スケジューリングされると、最終的には、メモリアクセス障害が起こらなかったかのように再び動作し始める。
【０３９０】
いくつかの実施形態において、このモデルでは、任意の所与の時間に、「ゲスト物理」メモリが、システム内の多くとも１つのノードによって所有される。他のノードが、このメモリのコピーを有してよいが、いくつかの実施形態では、強力なキャッシュコヒーレンシを維持するために、ゲストプロセッサがページを修正する時に、すべての他のコピーが無効としてマークされるか、または、他の方法で忘却される必要がある。
【０３９１】
いくつかの実施形態において、システム内のダイナミックメモリの各ページは、或る他のメモリ（すなわち、代替フラッシュメモリまたはネットワーク接続型フラッシュメモリ）のローカルコピーでありうる。このフラッシュメモリは、クラスタ内のノードすべてにアクセス可能なフラッシュ機器の中心に配置されてもよいし、クラスタ全体にわたって１または複数のノード上に分けて（例えば、１または複数のノード上のフラッシュメモリを含むＰＣＩカード上に）分散されてもよい。
【０３９２】
かかるフラッシュメモリアレイは、本明細書では、一般性を失うことなく、「ネットワーク接続型メモリ」と呼ばれる。ネットワーク接続型メモリ（本明細書では「ＮＡＭ」とも呼ぶ）自体は、クラスタのノードの間に分散されたメモリの１以上のバンクで構成されてよい。様々な実施形態において、ネットワーク接続型メモリは、適用可能であれば様々に適合された本明細書に記載の技術と共に、上述したようなＰＣＭ、３Ｄ−Ｘｐｏｉｎｔ、ハードディスクドライブなどのメモリ技術を用いて実装されうる。ネットワーク接続型メモリの一例について、以下に詳述する。
【０３９３】
ネットワーク接続型メモリは、タイダルポッド内でさらなるメモリ層として利用できる。実施形態の一例において、ネットワーク接続型メモリは、システム（例えば、タイダルポッド）内のすべてのメモリの「実際の」ホームと見なされうる。ネットワーク接続型メモリが、このように見なされる、用いられる、または、構成される場合、ネットワーク接続型メモリの部分が、各ノード上に、例えば、ノードのダイナミックメモリ内に、一時的に存在してよい。このように見なされる場合、各ノード内のメモリは、いくつかの実施形態において、ネットワーク接続型メモリのキャッシュとして利用できる。
【０３９４】
ネットワーク接続型メモリ機器の一例について、図１４に関して後に詳述する。
【０３９５】
したがって、様々な実施形態において、通常のメモリ階層は、各ノード上にキャッシュレベルを有するだけの構成から、緊密に結合されたノードにわたってキャッシュレベルを有する構成へ拡張される。
【０３９６】
ネットワーク接続型メモリの利用における本明細書に記載の技術の結果の一例は、例えば、クラスタのダイナミックメモリ容量が、必ずしも各ノード上の物理一次メモリすべての合計ではなく、オペレーティングシステムに提示されている仮想マシンと１：１対応するという要件例により、ネットワーク接続型ストレージのメモリが、クラスタの利用可能なダイナミックメモリを大幅に拡張できるということである。
【０３９７】
強力なキャッシュコヒーレンシ
【０３９８】
いくつかの実施形態において、オペレーティングシステムおよびアプリケーションが適切に機能するために、メモリ階層全体が、強力にキャッシュコヒーレントである必要がある。典型的なハードウェアにおいて、プロセッサは、１または複数のレベルのハードウェアキャッシュを用いて同期された強力なキャッシュコヒーレンシを維持する。２以上のプロセッサがノード上に存在する場合、既存のハードウェアを用いて、キャッシュコヒーレンシが、ＡＭＤ社のＨｙｐｅｒｔｒａｎｓｐｏｒｔ（商標）またはＩｎｔｅｌ社のＱｕｉｃｋＰａｔｈ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（商標）などのオンボード相互接続を介して維持される。
【０３９９】
しかしながら、それらのスキームは、単一のノード（すなわち、プロセッサおよびメモリを有するノード）を超えては拡張しない。本明細書では、上述のメカニズムを用いて同様の効果を達成する強力なコヒーレンシプロトコルのソフトウェアバージョンが記載される。
【０４００】
いくつかの実施形態において、オペレーティングシステムの指示の下で実行中のプロセッサが、そのローカルメモリ内の位置に書き込む時に、そのメモリのコピーがそのノード上のプロセッサのハードウェアキャッシュに格納される場合、複数のプロセッサが、ローカルキャッシュの強力な整合性を維持するよう協調しなければならない。
【０４０１】
上述の技術（例えば、上述のハイパーカーネル）を用いて、同様の動作を行うことができる。例えば、ゲストオペレーティングシステムの指示の下で実行中のゲスト仮想プロセッサが、自身がそのローカルメモリであると考えるメモリ内の位置を書き込む時に、そのメモリがノードのダイナミックメモリ内にある場合、１つの真正なコピーがゲスト仮想マシン内の１つの場所のみに維持されるように、そのメモリのローカルコピーを有する任意の他のノードがそのローカルコピーを確実に無効化するよう注意する必要がある。メモリがネットワーク接続型メモリに拡張された時に、同じ書き込みが同じ効果を有することが好ましい。
【０４０２】
ネットワーク接続型メモリに対するマイグレーション
【０４０３】
本明細書には、ネットワーク接続型メモリの存在下で強力なキャッシュコヒーレンシを維持する方法の概要が記載されている。さらなる詳細を以下に記載する。
【０４０４】
いくつかの実施形態において、ノード上の計算が、別のノード上に格納され所有された位置からの読み出しを試みる時、計算の移動またはメモリの移動のいずれかによって、計算およびメモリが同じノードに確実に共在するように、リソースマイグレーションアルゴリズム（上述のものなど）が実行される。
【０４０５】
ネットワーク接続型メモリフラッシュ機器を組み込むためにリソースマイグレーションを拡張する技術について以下に記載する。
【０４０６】
いくつかの実施形態において、メモリを含むタイダルポッド内のノードのセットは、フラッシュ機器を含むように拡張される。扱われるフラッシュ機器は、システム内の別の異なるリソースタイプである。フラッシュ機器は、いくつかの実施形態において、計算がスケジュールされうる任意の仮想プロセッサを持たないことを除けば、他のノードと同様であると考えることができる。いくつかの実施形態において、ネットワーク接続型メモリ機器は、全く仮想プロセッサから始めることはなく、タイダルポッド内の他のノードから仮想プロセッサを全く受け入れることがない。
【０４０７】
図１３Ａは、ネットワーク接続型メモリが選択的リソースマイグレーションに用いられるシステムの実施形態の一例を示す。図の例において、タイダルポッド１３０２のノード１３０４（ノード４５８〜４６２の例）が、永続性メモリアレイ１３０６（ネットワーク接続型メモリの例）と通信する。いくつかの実施形態において、ノードおよびＮＡＭは共に、タイダルポッドを形成する（ここで、ＮＡＭは、タイダルポッド内の特殊なノードである）。いくつかの実施形態において、タイダルポッドのノードおよびＮＡＭは、相互接続（１３０８）を介して互いに通信する。
【０４０８】
実施形態の一例において、ノード１３０４の各々は、マザーボード（１３１０）を備えており、ここで、上述のように、マザーボードは複数のプロセッサを有してよく、各プロセッサは、複数のコアを有してよく、各コアは、複数のハイパースレッドを有してよい。いくつかの実施形態において、タイダルポッド上で実行中のゲストオペレーティングシステムは、各ハイパースレッドをプロセッサと見なす。
【０４０９】
いくつかの実施形態において、ネットワーク接続型メモリ１３０６は、メモリ（１３１２）のアレイ（例えば、フラッシュメモリのバイト）である。ＮＡＭは、さらに、本明細書に記載のように、キャッシュコヒーレンシプロトコルを実装するよう構成されたプロセッサ（１３１４）を備える。複数のＮＡＭが、冗長性および／または復元性のために用いられてよい。この例において、ネットワーク接続型メモリ機器１３０６は、クラスタ内のノードすべてにアクセス可能であるフラッシュ機器の中心に配置される。別の実施形態において、ネットワーク接続型メモリは、クラスタ全体にわたって１または複数のノード上に分けて分散されてよい（ここで、複数のノード１３０４にわたって分散されたＮＡＭの部分の例が１３１６〜１３２２で示されている）。
【０４１０】
本明細書に記載の技術を用いて、メモリのページが、上述のように（例えば、メモリマイグレーションを実行する時に）システム内の任意のノード上に配置されうるように、ＮＡＭに配置されてよい。いくつかの実施形態において、ネットワーク接続型メモリ機器は、キャッシュコヒーレンシプロトコルを用いて相互接続を介してタイダルポッド内の他のノードと通信しており、これについては、後に詳述する。
【０４１１】
図１３Ｂは、ネットワーク接続型メモリが選択的リソースマイグレーションに用いられるシステムの実施形態の一例を示す。この例において、ノード１３５２および１３５４は、ノード１３０４および４５８〜４６２の例である。この例に示すように、各ノードは、ハイパーカーネルを有する。また、Ｌ１、Ｌ２、および、Ｌ３キャッシュを含む各ノード上のメモリまたはキャッシュ階層の実施形態の一例が示されている。各ノードは、さらに、Ｌ４キャッシュとして用いられるＤＲＡＭを備える。
【０４１２】
この例に示すように、ノード１３５２および１３５４は、（例えば、相互接続を介して）互いに通信し、例えば、互いの間でリソースを移動させる。この例において、ノードは、さらに、ネットワーク接続型メモリの一例である永続性メモリアレイ１３５６と通信するよう構成される。タイダルポッドのＮＡＭおよびノードは、本明細書で詳述されるキャッシュコヒーレンシプロトコルを用いて通信する。
【０４１３】
図１４は、ネットワーク接続型メモリ機器の実施形態の一例を示す。ＮＡＭの一実装例は、以下の通りである。ＮＡＭ（１４０２）は、ボード上に２Ｄ（二次元）アレイに配列された複数のフラッシュメモリチップ（例えば、メモリチップ１４０４）を備える。この例において、メモリチップは、バンクおよびロウに配列される。メモリチップは、メモリバス（１４０６）で接続される。メモリバスは、プロセッサ（１４０８）がメモリコントローラ１４１０にアドレス（例えば、バンクｘ、チップＹ、ページＺを特定するアドレス）を発行することを可能にし、次いで、メモリコントローラ１４１０は、バンク／チップの指定の組みあわせから適切なページを返すよう構成されている。例えば、メモリコントローラは、チップの総数を取得し、それをチップ上のページ数で割る、ロウの数で割る、などして、適切なページを返す。
【０４１４】
この例において、ＮＡＭに含まれるプロセッサは、タイダルポッド内の他のノードと通信して、例えば、メッセージを受信してキャッシュコヒーレンシプロトコルの一部として応答を提供する（これについては、後に詳述する）よう構成またはプログラムされた特別な制限付プロセッサ、ネットワークプロセッサ、または、プロトコルプロセッサとして実装されるコーディネータである。いくつかの実施形態において、メッセージは、タイダルポッドのノード間で通信される肯定応答、再試行などを含む。メッセージの一例は、ノードｎ上のｖｃｐｕをノードｍへ移動させるためのメッセージである。かかるメッセージのための擬似コードの例を以下に提供する：
【０４１５】
このＶＣＰＵ「Ｖ」をノードＭに移動させる
【０４１６】
Ｖの状態のスナップショットを撮る（通例は、メモリの少数のページ（例えば、〜６４００バイト））。
【０４１７】
状態ＶからＭを含むのに適切なバイト数（例えば、６４００バイト）を持つ「移動」コマンドを送信する
【０４１８】
肯定応答を待つ
【０４１９】
メッセージのさらなる例およびメッセージ構造の一例を後に詳述する。いくつかの実施形態において、ＮＡＭに含まれるプロセッサは、ゲストオペレーティングシステムには見えない。
【０４２０】
この例において、ＮＡＭは、さらに、メタデータ１４１２を含む。いくつかの実施形態において、メタデータは、どのページがどの状態にあるのかを追跡するために用いられるページ状態を含む。いくつかの実施形態において、ページ状態は、ページのタイプ（例えば、セカンダリ）を示す。いくつかの実施形態において、ＮＡＭは、タイダルポッドにわたる様々なノード上のページの状態を示すメタデータを含む。例えば、ＮＡＭ上のページのコピーの状態は、通例は、セカンダリである。その他のノード上のページのコピーは、セカンダリ（副）、プライム（主）、または、エクスクルーシブ（排他的）であってよい。この情報は、例えば、フェイルオーバーシナリオで回復を実行する時に、タイダルポッドの状態を復元する（例えば、第２ノード上のページの別のコピーが、セカンダリとマークされるべきである時に、タイダルポッド内の第１ノード上のページのコピーがプライマリ（本明細書では「プライム」とも呼ぶ）とマークされるべきであることを示すために）用いられうる。
【０４２１】
いくつかの実施形態において、ＮＡＭのすべてのページが、最初は無効である（例えば、タイダルポッドの起動時）。ページがノード上で書き込まれる時、後に詳述するページ／キャッシュコヒーレンシプロトコルに従って、そのページのコピーがＮＡＭに送信される。したがって、時間と共に、ページが作成されタイダルポッドに書き込まれるので、ＮＡＭは、作成されて書き込まれたそれらのページすべての最新コピー（例えば、ダイナミックメモリのコピー）を維持する。
【０４２２】
いくつかの実施形態において、大型メモリシステムが起動されると（例えば、大型メモリＬｉｎｕｘまたはＦｒｅｅＢＳＤシステム）、通例は、ページのゼロイングが実行される。この処理は、大型メモリシステムについては長い時間が掛かりうる。いくつかの実施形態において、本明細書に記載の技術を用いれば、より高速かつ効率的にページのゼロイングを実行できる。例えば、ゼロイングは、並列で「遅延して」実行されてよい。いくつかの実施形態において、まだゼロイングされていないシステム内のページが、「休止」ページとして示される。いくつかの実施形態において、これらの休止ページは、最初に利用される（例えば、割り当てられて書き込まれるか、または、作成される）時までゼロイングされない。タイダルポッドシステムは、この「並列遅延ゼロイング」技術を用いることによって高速で起動できる。
【０４２３】
いくつかの実施形態において、タイダルポッドシステムが起動した時、休止ページはまだ作成されておらず、したがってまだ存在していない（すなわち、休止ページは、割り当てられるまでは、全く物理的表現を持たない）ので、休止ページのためのエントリは、（後に詳述する）第２レベルページテーブルに存在しない。いくつかの実施形態において、休止ページが割り当てられると、ゼロイングされる。次いで、エントリが、第２レベルページテーブル内に配置され、これにより、ページが有効化して非休止状態になる。
【０４２４】
図１５は、ページ割り当ての一実施形態を示す図である。この図は、ダイナミックメモリおよびネットワーク接続型メモリに様々に適用される。この例では、休止ページ（１５０２および１５０４）が示されている。休止ページが割り当てられると、その休止ページは、（例えば、１５０６に示すように）ゼロイングされる。次いで、上述のように、エントリが第２レベルページテーブルに配置される。エントリが作成されると、ページの物理アドレスが入力される。いくつかの実施形態において、そのページのためのモードビットも入力される。モードビットは、ページが有効であること、ページが書き込み可能であるか読み出し専用であるか、などを示しうる。
【０４２５】
いくつかの実施形態において、タイダルポッドなどのシステムが起動した時、すべてのページは空（例えば、休止中）である。次いで、ゲストオペレーティングシステムは、ページの割り当てを開始する。例えば、ページが割り当てられる時、ページ番号（例えば、４５６７）が割り当てられる。割り当て後に、ページはゼロイングされ、その後、そのアドレスが、第２レベルページテーブルに入れられる（ページは、ゼロイングされる後まで可視にならない）。ここで、４５６７としてハイパーカーネルに知られるいくつかのページをアドレスする試みがなされた場合、ゼロのページが見られる。
【０４２６】
いくつかの実施形態において、割り当てまで、ページは存在しない。複数のノードおよびプロセッサを備えたタイダルポッドが起動されると、ページの大部分が、起動時に休止する。ページは、利用される時に有効になる。これは、ダイナミックメモリ内およびＮＡＭ内のページについてｔｒｕｅを保持する。
【０４２７】
いくつかの実施形態において、ＮＡＭ内のページ数は、ゲストオペレーティングシステムが観察するページ数と一致する。そのページの他のコピー（例えば、シャドーコピー）が、（例えば、ページキャッシュ内に）存在しうるが、いくつかの実施形態において、それらは、ゲストオペレーティングシステムに対して可視にされない。ハイパーカーネルとＮＡＭとの間に一対一対応がある必要はない。しかしながら、いくつかの実施形態において、ゲストオペレーティングシステムから見える一対一対応が存在する。
【０４２８】
典型的なオペレーティングシステムでは、オペレーティングシステムは、ベアメタルマシン上で動作する。上述のように、本明細書に記載の技術を用いると、ベアメタルマシンが、分散型ハイパーカーネルで置き換えられ、これは、ベアメタルハードウェア上で動作しているという印象をオペレーティングシステムに与える。これは、タイダルポッド内のノード上のプロセッサに存在する第２レベルページテーブルによってサポートされる。メモリのページのためのエントリが第２レベルページテーブル内に存在しない場合、ハードウェアアドレス変換を実行する時に障害が生じる。上述のように、例えば、コスト関数に基づいて、メモリを持つページに仮想プロセッサを移動してもよいし、仮想プロセッサがある場所にメモリを移動してもよい。いくつかの実施形態において、メモリが移動される場合、コピーされたメモリのコンテンツだけでなく、宛先（ノード）の第２レベルページテーブルも更新される。したがって、ノード上のプロセスがページへのアクセスを試みた時に、別の障害は生じない。これは、ゲストオペレーティングシステムに対して、単一の大きいアドレス空間の出現を提供し、そのアドレス空間は、ハードウェア内には存在せず、本明細書に記載の技術を用いてソフトウェア内に規定されてサポートされる。ページに対する要求が（例えば、コスト関数に入ったメッセージに基づいて）拒否された場合、プロセッサは、ページのその位置に移動する（または、仮想プロセスおよびページの両方が、別のノードに移動される、すなわち、事後条件で、それらが共在する）。
【０４２９】
いくつかの実施形態において、ページが要求される時、ページは、そのプライマリ位置から要求される。次いで、そのページは、セカンダリとしてマークされるが、要求側ノードに送信されたページは、要求側ノード上でエクスクルーシブまたはプライムとしてマークされる。
【０４３０】
以下の例を考える。説明のため、タイダルポッドが、集中型のネットワーク接続型メモリと、２つのノード（ノード１およびノード２）とを備えると仮定する。いくつかの実施形態において、最新のコピーがノード２上にあるメモリ（すなわち、メモリのページ）の移送をノード１に要求させるように戦略決定がなされた場合、ノード２は、まず、ノード１が最新のコピーを見つけることができる場所または位置である可能性が最も高い旨の示唆と共に、そのメモリの無効化をネットワーク接続型メモリに送信し、次いで、そのメモリのコピーをノード１に送信することによってノード１の要求を満たす。いくつかの実施形態において、現在ノード１上にあるメモリは、ノート１上にある様々な計算によって指示されるように更新され、次いで、ノード１がそのメモリをどこか他の場所に移動しなければならない時に、ノード１は、さらに、そのメモリの現在のバージョンが見つかりうる場所にそのネットワーク接続型メモリを更新してよい。いくつかの実施形態において、システム（タイダルポッド）は、システムの知識が完全ではない場合があるので、更新がＮＡＭになされるかどうかに関係なく作業または機能し続ける。一部の場合には、非同時性のために、メモリページは、（例えば、リソースマップに従って）予測された位置にない場合があるので、「追求」および検索される必要がありうる。例えば、或る時点に、ページは、所与の位置にあった可能性があるが、ページの検索がなされた時に、もはやそこにはない場合がある。
【０４３１】
別のノードがそのメモリ（ページ）のコピーを必要とする場合、コピーが、要求側ノードに送信され、メモリのコピーも、ネットワーク接続型メモリへ送信される。
【０４３２】
いくつかの実施形態において、メモリがノード上で修正されると、そのメモリは、そのノードに専用になる。いくつかの実施形態において、ネットワーク接続型メモリ上の任意のコピーを含む、すべての他のコピーが、無効化する必要がある。
【０４３３】
いくつかの実施形態において、定期的に、ネットワーク接続型メモリは、すべてのメモリページのセカンダリコピーを要求してよい。計画されたシャットダウンまたは計画外のシャットダウン時に、十分な時間がある場合、ネットワーク接続型メモリは、ゲスト仮想プロセッサが停止された後に、すべてのページの排他的所有権を要求してよい。
【０４３４】
このように、ネットワーク接続型メモリは、常に、強力なコヒーレンシのセマンティクスを維持するのに十分に新しいコピーを含む。
【０４３５】
状態遷移およびキャッシュコヒーレンシプロトコルの説明
【０４３６】
上述のように、ネットワーク接続型メモリ（「ＮＡＭ」）は、その上で開始されうる仮想プロセッサ（本明細書では「ｖｃｐｕ」とも呼ぶ）がなく、そこに移動しうるｖｃｐｕがないことを除けば、タイダルスケールポッド（ＴｉｄａｌＳｃａｌｅ  Ｐｏｄ）内の別のノード（集中ノードまたはポッド内の他のノードにわたって分散されたノード）であってよい。
【０４３７】
この例において、ＮＡＭは、ｖｃｐｕがＮＡＭ上に存在しないと仮定すると、本質的にトランザクショナルメモリである。いくつかの実施形態において、ゲストソフトウェアの実行によって規定される明確な同期点（例えば、「計算を進めるためにこのページを必要とし、それを得るまでは計算を進めることができない場合」）を除けば、ＮＡＭのコンテンツをリアルタイムで最新に保つ要件も必要もない。したがって、ＮＡＭに対する読み出しおよび書き込みは、「遅延して」実行されてよい。ページの要求およびページを更新する要求が順序正しく満たされる限りは、一貫したフォンノイマン・セマンティクスをリアルタイムで実行する必要なしに、それらを維持または保持できる。一部のプロセッサファミリーが、満たす必要のあるさらなる制約（例えば、インテルの「メモリ格納順」制約）を有している場合もありうる。
【０４３８】
いくつかの実施形態において、ページを要求する、ページを更新する、プロセッサを移動させる、ページの読み出し専用コピーを無効化する、などのためのロジックは、ｖｃｐｕまたはハウスキーピングスレッドによって処理される。ＮＡＭは、それらを持たないので、これらの動作の心配をする必要はない。
【０４３９】
ここで、トランザクション構造の実施形態の一例を記載する。
【０４４０】
任意のノード上のページは、有効または無効でありうる。ページの有効／無効とは、そのページへのエントリがノード上の或るページテーブルに存在するか否かを指す。ページが有効である場合、それらのページは、ゲストオペレーティングシステムが物理アドレスであると認識するが、実際にはハイパーカーネルから見るとゲスト仮想アドレスであるアドレスに対応する。
【０４４１】
ノードｎ上にある有効なページｐは、いくつかの状態の内の１つの状態にあってよい：プライム（またはプライマリ）もしくはエクスクルーシブもしくはセカンダリ。
【０４４２】
１．ｐが「プライム」とマークされた場合、「読み出し専用」であり、ｎはｐを「所有」すると言われる。
【０４４３】
２．ｎ以外のノードが、ｐのコピーを有してもよく、これらのコピーは、「セカンダリ」とマークされるかまたは呼ばれる。いくつかの実施形態において、セカンダリがある場合、タイダルポッドの他の場所にプライムがあると有効に仮定されうる。同様に、ノードがプライムページを有する場合、タイダルポッドの他の場所にそのページのセカンダリがあると仮定されうる。いくつかの実施形態において、セカンダリの数は、それらのページを読み出す試みがなされた時に、ページデータがすでに要求側ノードにあることで、ページデータへのアクセスに費やす時間を最小限にするように最大化される。
【０４４４】
セカンダリが望まれうる一例は、オペレーティングシステム（例えば、ゲストオペレーティングシステム）のコードを保持する１セットのページを処理する場合である。オペレーティングシステムのためのコードは、不変であり変化しないので、オペレーティングシステムを実行するプロセッサがオペレーティングシステムのためにページをフェッチする場合に不十分である（この結果として、プロセッサが、要求されたページを待っている間に、ストールが生じうるため）。その代わりに、効率を改善し、ストールを低減するために、セカンダリを利用可能であり、ここで、オペレーティングシステムの可能な限り多くのページが複製される。ストールを低減することにより、システムにおけるオーバーヘッドも削減され、システムの効率の改善につながる。
【０４４５】
読み出し専用データ（ここで、読み出し専用データのページは読み出し専用ノードにセカンダリとしてコピーされる）を含むプログラムなど、他の種類のプログラムに対して、同様の最適化および効率化を実行できる。いくつかの実施形態において、メモリの読み出し専用ページであるオペレーティングシステムまたはアプリケーションのコードページの間に区別はない。
【０４４６】
別の例として、あまり頻繁に変化することのない大量のデータを有するセカンダリを利用できる。メモリがそれに利用可能である場合、効率を改善し、ストールを低減するために、可能な限り多くの読み出し専用データを複製できる。
【０４４７】
３．ｐがｎ上でエクスクルーシブとマークされた場合、ページはｎ上にだけ存在することができ、他のコピーは存在することができず、ページは読み出しおよび書き込み可能である（「読み出し−書き込み」）。この場合、ｐのセカンダリはない。
【０４４８】
いくつかの実施形態において、ページがエクスクルーシブにされる前に、そのページのすべての他の既存のコピーを無効化するために、無効化動作が実行される。これは、既存のアーキテクチャにおける評価順序を保証するために利用されうる。無効化動作は、すべての他のノードにメッセージを送信して、そのページのそれらのコピーを無効化するように要求することによって実行されうる。それらの要求に対する応答（例えば、肯定応答）が受信された場合、すべてのそれらの応答の受信は、ページが存在する位置が他にないことを示唆する。次いで、ゲストオペレーティングシステムは、再び起動して、そのページに書き込むことができる。書き込みが完了すると、他のページが、そのページのコピーを有することを望む場合があり、いくつかの実施形態で、ページのスナップショットが撮られ、そのページについて更新された情報を有する新たなセカンダリを作成するために利用されうる。したがって、セカンダリの利用により、ゲストオペレーティングシステムにとっては、それらのページがローカルであるように見える。
【０４４９】
ノードｍ（ｍ≠ ｎ）上のｖｃｐｕが、ｐへのアクセスをｎに要求した時に、そのページがプライムまたはエクスクルーシブである場合、現在ｎ上にあるページｐは無効とマークされ、次いで、そのページのコピーがｍに送信され、ｍは、ｐをプライムとしてマークする。いくつかの実施形態において、最適化として、ノードｍ上のｖｃｐｕは、そのページが必要とされているものであるとノードｍ上のｖｃｐｕが知っている場合に、ページｐをエクスクルーシブとしてマークしてよい。
【０４５０】
いくつかの実施形態において、ノードが、プライムまたはエクスクルーシブであるページを有する場合、そのノードが、そのページへのプライムまたはエクスクルーシブの書き込みを送信する要求を受信すると、ページは、そのノード上でセカンダリに変換される。次いで、そのページへの書き込みの権利は、ページを要求しているノードに移される。これは、ノードがページに書き込もうとしていない限りはページを要求していないという仮定に基づいて実行されてよい最適化である。これは、実行される必要のあるプロトコル内にトランザクションを保存し、効率を高める。
【０４５１】
いくつかの実施形態において、ノードｍがｐへのアクセスをｎに要求した場合、ノードｎは、自身のｐのコピーをセカンダリとしてマークする。次いで、ページｐは、ノードｍに送信される。ノードｍが自身のｐのコピーをエクスクルーシブまたはプライムとしてマークすると、ノードｎのページｐのコピーは無効化される。
【０４５２】
いくつかの実施形態において、ノードｎ上のページｐがプライムであり、書き込まれる場合、すべてのセカンダリコピーが、無効化されなければならず、これが完了した旨の肯定応答を受信した後にのみ、ｎは、ｐをエクスクルーシブとマークする。例えば、いくつかの実施形態において、そのページは、ノードｎが唯一の書き手であることが知られるまで書き込みできない、すなわち、ページは、そのページがエクスクルーシブ状態になるまでは書き込みできず、ここで、ページは、他のセカンダリがない（すなわち、すべてのセカンダリが無効化されている）ことを示すすべての肯定応答が受信されるまで、エクスクルーシブ状態になれない。いくつかの実装例において、これは最適化されうる。例えば、このページにとってプライマリ（最上位）であるノードが、無効化を開始できる。いくつかの実施形態において、無効化は、肯定応答が現在のプライマリではなく（まさにプライマリになろうとしている）要求側に送信される命令を含む。いくつかの実施形態において、要求側は、ページにアクセスできる前にすべての肯定応答を収集しなければならない。このように、無効化は、ページの移送と並行して安全に進行しうる。要約すると、この最適化の例においては、プライマリが無効化を開始するが、要求側が無効化処理を完了させる。
【０４５３】
以下は、無効化に関するさらなる詳細である。いくつかの実施形態において、タイダルポッドは、第１レベルページテーブルを備えており、これは、ユーザ空間（例えば、ユーザ空間でのゲストプログラム実行）から、ゲストオペレーティングシステムがその物理空間であると考えるものへ、ハードウェア翻訳を実行する（すなわち、第１レベルページテーブルマッピングが、ゲストＯＳが物理アドレスであると考えるものに仮想アドレスを翻訳する）。上述のように、ゲストＯＳが物理アドレスであると考えるものは、ハイパーカーネルによって管理されたゲスト物理アドレス（例えば、ハイパーカーネルホストアドレス）であり、それらのアドレスは、次に、ハードウェアにおいて（例えば、第２レベルページテーブルを介して）、別のレベルのページアドレス翻訳を受けて、そこで、ゲスト物理アドレスは、ページの真の物理アドレスに変換または翻訳される。いくつかの実施形態において、ページは、第２レベルページテーブルからそのページを消去することによって無効化される。ノードは、メモリの無効化されたページにもはやアクセスできないので、次に、ガベージコレクションが実行されてもよいし、メモリがフリープールなどに戻されてもよい。
【０４５４】
この後、そのノード上ではローカルに読み出しおよび書き込みが可能であり、他のコピーが存在しない（例えば、上述のように、第２レベルページテーブルからページを消去することによってページが無効化されている）ので、エクスクルーシブとマークされたページへのすべての書き込み動作が、全くストールを起こさない。
【０４５５】
いくつかの実施形態において、ＮＡＭは、上述したのと同じプロトコルに従う。タイダルポッド内の任意の他のノードに関しても、ＮＡＭは、有効なページおよび無効なページを有する。例えば、
【０４５６】
１．ＮＡＭ内のすべてのページが、無効として始まる。いくつかの実施形態において、ページが有効になると、ＮＡＭ上のそのページには書き込みできなくなる（読み出し専用になる）ので、セカンダリとしてマークされる。
【０４５７】
２．ノードｎ上のｖｃｐｕ  ｖがページに書き込む前に、そのｖｃｐｕは、ＮＡＭを含む他の場所のＰの全コピーを無効化しなければならない。したがって、ＮＡＭがｐのセカンダリを有する場合、ｐは、ＮＡＭ上で無効化される必要があり、ｐのコピーを有する任意の他のノードと同様に、ｐが更新されうる前に無効化された旨の肯定応答を送信しなければならない。
【０４５８】
３．ノードｎが、ページにｐに対するノードｍ（ｍ≠ ｎ）からの読み出し要求に応答する場合（ここで、ｐはプライマリまたはエクスクルーシブとマークされている）、ｎは、ｐをセカンダリとしてマークし、ページｐをｍに送信し、さらに、（ほぼ）同時に、それをＮＡＭへも送信し、ＮＡＭは、それを有効およびセカンダリとしてマークする。したがって、いくつかの実施形態において、ノードがエクスクルーシブまたはプライマリとしてページをマークすると、ネットワーク接続型メモリが、そのページの有効なコピーを有するように（すなわち、（例えば、ページへの書き込み後に）ノードがページのプライムコピーを有する場合に、ＮＡＭが、書き込み後に有効なセカンダリコピーを有するように）、そのページのコピーが、ネットワーク接続型メモリに送信される（そして、セカンダリとしてマークされる）。ページがｍによって受信された後、ｍは、そのページをプライマリとしてマークする。すでに述べたように、ページが、リモート書き込み要求の場合のように、プライマリからエクスクルーシブへと遷移した場合、ＮＡＭ上のセカンダリコピーは、無効化されなければならない。ページがエクスクルーシブとマークされることが前もってわかっている場合、ページをＮＡＭへ送信する工程が省略されてもよい（いずれにしても、最終的に無効化されるため）。
【０４５９】
このように、ＮＡＭは、タイダルポッド内のすべての有効なページのコピーの経時的なコレクションになる。いくつかの実施形態では、ページが更新される度に、ネットワーク接続型メモリへの更新がなされる。したがって、時間と共に、休止期の後に、ネットワーク接続型メモリは、タイダルポッド内のすべてのページの有効なコピーを有することになる。したがって、システムへの電力供給が途絶えても、メモリのイメージがＮＡＭ内に存在する。別の例として、起動時、クリーンシャットダウンが実行されなかった場合、メモリのスナップショットが、シャットダウンの前にシステムの以前の状態を復元する助けとして用いられてよい。
【０４６０】
最後に、タイダルポッド内のＮＡＭの数には制約がない。例えば、システム内に（例えば、復元性および／または冗長性のために）複数のＮＡＭがあってもよい。いくつかの実施形態において、いくつかのネットワーク接続型メモリが、異なるタイダルポッド間で共有されてもよい。一例として、ＮＡＭ機器が、復元性および／または冗長性のために、プラグを抜かれて複製されてもよい。
【０４６１】
例えば、データが、ストレージから引き出された（例えば、ファイルから抽出された）時、そのデータは、そのデータに対して動作するアプリケーションまたはデータベースによって利用可能なローカル表現に変換されてよい。一利用例において、データが変換され、ＮＡＭに複製されると、ＮＡＭはプラグを抜かれて、別のタイダルポッドへ移動されることができる。したがって、変換されたデータは、すぐに他のタイダルポッドによって利用可能であるため、最初に生データを変換する高コストが節約される。例えば、データを必要とするタイダルポッド上で実行中のアプリケーションによって利用できるように後に変換しなければならない（例えば、データベースからの、インターネット経由のストリーミングによる、ディスクから読み出した、などの）データの最初のロードには、特に非常に大きいファイルについては、高いコストが掛かりうる。この最初のロード／変換は、上述の工程を用いて省くことができる（例えば、一度実行するだけでよく、変換されたデータは、複製可能であり、ＮＡＭの移動によって他のシステムに移動することもできる）。
【０４６２】
状態遷移の例
【０４６３】
以下は、状態遷移の例を示す表である。
【表１】
2019500705.tif 000003
【０４６４】
上の表１の例において、エクスクルーシブページの読み出し要求が受信されると、そのページが要求側に送信され、（読み出し要求を受信したノード上の）そのページのステージが無効に遷移される。いくつかの実施形態において、無効への遷移は、上述のように、最適化を考慮し、その最適化では、要求されたページに書き込みが行われる仮定がなされ、要求を受信したノード上のそのページは、いずれにしても最終的に無効化される必要がある。別の実施形態において、読み出し要求の受信に応答して、読み出し要求を受信したノードは、エクスクルーシブからセカンダリにページの状態を遷移させる。
【０４６５】
いくつかの実施形態では、タイダルポッドのすべてのノードが、本明細書に記載のキャッシュコヒーレンシプロトコルに対する上の例の状態遷移図に従う。ＮＡＭの場合、計算（例えば、それが保持するページ上の書き込み）を実行せず、ＮＡＭは、受動的動作に関連した一部の遷移に従う。
【０４６６】
メッセージ例
【０４６７】
以下は、上述のノード間キャッシュコヒーレンシプロトコルで用いられるメッセージの例である。
【０４６８】
いくつかの実施形態において、各サブシステムは、独自のメッセージタイプを有する。以下は、タイダルポッド内のサブシステムの例である（例えば、スケジューラサブシステム、Ｉ／Ｏサブシステム、マイグレーションサブシステム、など）。
【０４６９】
ＴＳ＿ＮＥＴ＿ＳＣＨＥＤＵＬＥＲ，
【０４７０】
ＴＳ＿ＮＥＴ＿ＭＥＭＯＲＹ，
【０４７１】
【０４７２】
ＴＳ＿ＮＥＴ＿ＩＯ，
【０４７３】
ＴＳ＿ＮＥＴ＿ＭＩＧＲＡＴＩＯＮ，
【０４７４】
ＴＳ＿ＮＥＴ＿ＲＥＭＯＴＥ，
【０４７５】
ＴＳ＿ＮＥＴ＿ＲＥＭＯＴＥ＿ＩＮＩＴ，
【０４７６】
ＴＳ＿ＮＥＴ＿ＩＯＡＰＩＣ，
【０４７７】
ＴＳ＿ＮＥＴ＿ＣＯＮＴＲＯＬ，
【０４７８】
ＴＳ＿ＮＥＴ＿ＢＥＮＣＨＭＡＲＫ，
【０４７９】
ＴＳ＿ＰＡＧＥ＿ＢＥＮＣＨＭＡＲＫ，
【０４８０】
ＴＳ＿ＳＹＮＣ＿ＣＬＯＣＫ，
【０４８１】
ＴＳ＿ＮＥＴ＿ＭＭＩＯ，
【０４８２】
【０４８３】
いくつかの実施形態において、ＴＳ＿ＮＥＴ＿ＭＥＭＯＲＹサブシステムは、以下のメッセージタイプ例を有する：
【０４８４】
【０４８５】
ＶＭＥＭ＿ＵＮＫＮＯＷＮ＝０，
【０４８６】
ＶＭＥＭ＿ＢＵＩＬＤ＿ＧＣＰＰ＝１，／／そのｃｃｐ（コヒーレンシページプロトコル）を構築するためのノードへのメッセージ。
【０４８７】
ＶＭＥＭ＿ＢＵＩＬＤ＿ＣＯＭＰＬＥＴＥ＝２，／／構築が完了した旨のメッセージ
【０４８８】
ＶＭＥＭ＿ＭＯＶＥ＿ＯＷＮＥＲ＝３，／／オーナからオーナへページを運ぶメッセージ
【０４８９】
ＶＭＥＭ＿ＣＯＭＰＬＥＴＥ＿ＰＡＧＥ＝４，／／ページ状態変更完了を伝えるために用いられるメッセージ
【０４９０】
ＶＭＥＭ＿ＯＫ２ＳＥＮＤ＝５，／／ページに利用可能な余地をブロードキャストするために用いられるメッセージ
【０４９１】
ＶＭＥＭ＿ＣＯＬＬＥＣＴ＿ＰＡＧＥ＿ＢＣＳＴ＝６，／／隔離プロトコル（コレクトメッセージがブロードキャストされるパス）で用いられるメッセージ
【０４９２】
ＧＴＨＲＥＡＤ＿ＣＯＬＬＥＣＴ＿ＢＣＳＴ＝７，／／ゲストスレッドメタデータを収集するために用いられるメッセージ
【０４９３】
ＧＴＨＲＥＡＤ＿ＣＯＬＬＥＣＴ＿ＢＣＳＴ＿ＡＣＫ＝８，／／ゲストスレッドコレクトメッセージへの応答に用いられるメッセージ
【０４９４】
シナリオの例
【０４９５】
図１６は、上述したようなキャッシュコヒーレンシプロトコルに従った（例えば、上の表１における状態遷移に従った）ノード間通信の実施形態の一例を示す。
【０４９６】
この例では、タイダルポッドが、ノードＮ０（１６０２）、Ｎ１（１６０４）、および、Ｎ２（１６０６）と、ＮＡＭ１６０８と、を備えると仮定する。
【０４９７】
初期状態１６１０において、ノードＮ２は、ページｐのプライマリバージョン（「Ｐ」で示される）を有する。ノードＮ１は、ページｐのセカンダリコピー（「Ｓ」で示される）を備える。ノードＮ０は、ページｐのコピーを持たない（例えば、無効、「Ｘ」で示される）。ＮＡＭ１６０８は、ページｐのセカンダリコピー（例えば、システムが使用されており、ＮＡＭがページｐの参照コピーを有する）を備えてもよいし、そのページは、（例えば、起動時に）ＮＡＭ上で無効であってもよい。
【０４９８】
次の工程１６１２において、ノードＮ０は、ページｐのローカル読み出しの実行を望む。ノードＮ０は、ページｐの有効なコピーを持たないので、ページｐのプライマリコピーを有するノード（この例では、（例えば、リソースマップに基づいて）ノードＮ２）へのページのリモート読み出し要求を実行する。
【０４９９】
リモート読み出し要求に応答して、ノードＮ２は、自身のページｐのコピーをセカンダリとしてマークし（プライマリからセカンダリへ遷移させ）、ページｐをノードＮ０に送信する。ノードＮ２は、ＮＡＭにもページｐを送信し、ＮＡＭは、受信したページｐのコピー（例えば、スナップショット）を有効かつセカンダリとしてマークする。ノードＮ０がページｐを受信した後、ノードＮ０は、自身のページｐのコピーをプライマリとしてマークする。
【０５００】
いくつかの実施形態において、ノードＮ０は、セカンダリとマークされたページｐのコピーを受信する。別の実施形態において、この例に示すように、トランザクション（例えば、ノード間で通信されているメッセージ）の数を最小化するために、ノードＮ０は、ノードＮ０がページへの書き込みを意図してページを要求しているという仮定の下、自身のｐのコピーを直接的にプライムとしてマークする。次いで、ノードＮ２上のページｐは、セカンダリとしてマークされる。ページｐがＮＡＭ上で無効であった場合、ページｐはＮＡＭにも送信され、ここで、セカンダリとマークされる。ページがＮＡＭ上に存在する場合、そのページはセカンダリのままである。ノードＮ１上のページｐのコピーはセカンダリのままである。
【０５０１】
次の工程１６１４において、ノードＮ０は、自身のページｐのプライマリコピーにローカル書き込みを実行する。ノードＮ０が、自身のページｐのコピーへの書き込み、または、その更新を実行しうる前に、ページｐのすべてのセカンダリコピーが無効化される。例えば、無効化メッセージが、Ｎ１、Ｎ２、および、ＮＡＭに送信される（すなわち、ｐのセカンダリを有するタイダルポッド内の他のノードが、それらのページｐのコピーを無効化するよう要求される）。ノードＮ０は、Ｎ１、Ｎ２、および、ＮＡＭから、それらのｐのコピーを無効化した（すなわち、タイダルポッド内にｐの他のコピーが存在しない）旨の肯定応答を受信した後（ここで、それらのノード上の無効化は、記号「Ｘ」で示されている）、自身のページｐのコピーをエクスクルーシブとマークし（例えば、プライマリからエクスクルーシブへ遷移させ）、ページｐのコピーに書き込むことができる。
【０５０２】
上記の例において、ノードＮ０は、最初に、工程１６１２においてリモート読み出し要求を実行し、その後、工程１６１４においてローカル書き込みを実行した。ノードＮ０上のページがエクスクルーシブとマークされることが前もってわかっている場合（例えば、リモート読み出し要求と同様）、ノードＮ２からＮＡＭへページｐを送信する工程１６１２は、省略されてもよい。
【０５０３】
ここで、工程１６１６において、Ｎ１がページｐのローカル読み出しを実行しようとすると仮定する。しかしながら、そのページｐのコピーは、無効である。次いで、ノードＮ１は、ノードＮ０にページｐを要求する。リモート読み出し要求に応答して、ノードＮ０は、自身のページｐのコピーをセカンダリに遷移させ（または、いくつかの実施形態においては、要求側がｐに書き込むと予測される場合に、自身のページｐのエクスクルーシブコピーを無効化し）、ページｐをノードＮ１へ送信する。ノードＮ１は、受信したページｐのコピーをプライマリとしてマークする。ノードＮ０は、ＮＡＭにもページｐのコピーを送信し、ＮＡＭは、自身のページｐのコピーを有効およびセカンダリとしてマークする。
【０５０４】
上の例に示したように、１つのページが、タイダルポッドの異なるノード上で異なる状態にあってもよい。いくつかの実施形態では、並列データ構造が、タイダルポッド内の様々なノード上のページの状態に関するメタデータを維持するために用いられる。いくつかの実施形態において、その構造は、タイダルポッド内のノードにわたるページの状態の再計算を実行する必要がないように維持される。
【０５０５】
この実施形態の例においては、ＮＡＭは受動的であり、ページを要求して書き込むようには構成されていない。ＮＡＭは、時と共に、セカンダリページのセットを構築する。ノードがページに書き込もうとした場合、ＮＡＭ上のコピーは無効になる。
【０５０６】
いくつかの実施形態において、ＮＡＭは、キャッシュコヒーレンシプロトコルを用いて、プライマリまたはエクスクルーシブからセカンダリへの任意の遷移を通知される（すなわち、ＮＡＭは、それらの遷移時にコピーされる）。したがって、ＮＡＭは、エクスクルーシブまたはプライムからセカンダリへのページの遷移が起きるといつでも更新される。ノードＮ上のページｐがセカンダリになった場合、ＮＡＭ上のページも、セカンダリになるように更新されなければならない。したがって、ＮＡＭは、自身が有効であると考える１セットのページの状態を維持しており、いくつかの実施形態において、ＮＡＭは、タイダルポッドのオフィシャルメモリの「最終的な」参照コピー（または近似）を有する。
【０５０７】
いくつかの実施形態において、タイダルポッドが障害または故障を起こしていることが検出された場合、ＮＡＭは、ＮＡＭがまだ持っていない、タイダルポッド内のすべてのプライマリページのコピーの読み出し要求を行い、それらのコピーは、ＮＡＭ上でセカンダリとしてマークされる。十分な時間があれば、これにより、ＮＡＭは、タイダルポッド内のノード上のページのすべてのセカンダリコピーを有する（そして、例えば、「最終的な参照コピー」になる）ことになる。一例として、障害またはエラーが検出されたと仮定する。ＮＡＭは、どのページが無効であるかを判定するために、自身のページすべてを検索する。ＮＡＭは、タイダルポッド内の他のノードに、それらのページのコピー読み出し要求を行うことによって、それらを有効にしようとする。コピーが他のノードから取得された場合、ＮＡＭは、取得したページのコピーで自身の無効ページを更新し、そのコピーは、その後、ＮＡＭ上で有効かつセカンダリにされる。
【０５０８】
いくつかの実施形態において、ＮＡＭは、例えば、システムシャットダウンまたは電源喪失中に、ＮＡＭが機能し続けることを可能にするマザーボード上のバッテリなど、バックアップシステムを備える。これは、（無効ページから有効セカンダリへの遷移のために）タイダルポッド内の他のノード上のページのセカンダリコピーを要求する時間をＮＡＭに提供する。これにより、ＮＡＭは、障害の状況下で自身を完成させることができる。
【０５０９】
図１７は、ネットワーク接続型メモリの存在下でキャッシュコヒーレンシを維持するための処理の一実施形態を示すフローチャートである。いくつかの実施形態において、処理１７００は、ネットワーク接続型メモリ機器１３０６などのネットワーク接続型メモリによって実行される。いくつかの実施形態において、処理１７００は、上述したようなキャッシュコヒーレンシプロトコルに従って実行される。処理は、ネットワーク接続型メモリでメッセージが受信される工程１７０２で始まる。メッセージは、ノード（例えば、タイダルポッド）上のページに関して実行される動作に基づいて受信される。いくつかの実施形態において、そのノードは、ネットワーク接続型メモリが通信する複数のノードに含まれる。いくつかの実施形態において、仮想マシンが、タイダルポッド内の各ノード上で動作する１セットのハイパーカーネルによって作成される。次いで、オペレーティングシステムが、複数の物理ノード上で集合的に実行されてよい。いくつかの実施形態において、（ゲスト）オペレーティングシステムは、透過的に動作される。例えば、上述のように、ハイパーカーネルを用いることにより、オペレーティングシステムは、（タイダルポッドにおけるように複数の物理ノード上で集合的に実行される際に）ベアメタルハードウェア上で動作している印象を与えられ、ここで、オペレーティングシステムへの修正がなされる必要はない。
【０５１０】
上述のように、いくつかの実施形態において、ネットワーク接続型メモリは、物理的バイト配列として構造化される。いくつかの実施形態において、配列の各バイトは、仮想マシン内の物理メモリアドレスに対応する。
【０５１１】
いくつかの実施形態において、ネットワーク接続型メモリは、集中型の機器である。別の実施形態において、ネットワーク接続型メモリは、タイダルポッド内のノードにわたって分散される。工程１７０４において、受信したメッセージに基づいて、ネットワーク接続型メモリによって動作が実行される。
【０５１２】
上述のように、様々な実施形態において、ノード上のメモリのページに関して実行できる動作は、（ローカルまたはリモートであってよい）読み出しおよび書き込みを含む。実行される動作のタイプに基づいて、異なるタイプのメッセージが、送信されうる。
【０５１３】
例えば、動作が、ページへの書き込み要求である場合、無効化要求（工程１７０２におけるメッセージの例）が、他のノードおよびネットワーク接続型メモリに送信されて、それらによって受信され、書き込まれるページのそれらのコピーが無効化される。ネットワーク接続型メモリは、次に、自身のページのコピーを無効化するよう構成されている。ネットワーク接続型メモリは、さらに、自身のページのコピーが今や無効であることを示す肯定応答を返すよう構成されている。次いで、書き込み動作は、無効化要求への肯定応答を受信した後に開始できる。
【０５１４】
動作が、例えば、ページを読み出すためのノードからのリモート要求である場合、そのページ（例えば、ページのコピーまたはスナップショット、ここで、工程１７０２におけるメッセージは、そのページのコピーを含む）は、要求側ノードおよびネットワーク接続型メモリに送信される。次いで、ネットワーク接続型メモリは、ページのコピーで更新される（例えば、ネットワーク接続型メモリは、工程１７０４においてページのコピーを格納する）。
【０５１５】
動作、アクション、および、ページ状態遷移の他の例については、表１と関連して上述した。
【０５１６】
図１８は、ページをゼロイングするための処理の一実施形態を示すフローチャートである。様々な実施形態において、処理１８００は、タイダルポッドに含まれるノードおよび／またはネットワーク接続型メモリによって実行される。処理は、休止ページを割り当てる指示が受信される工程１８０２から始まる。いくつかの実施形態において、休止ページは、まだゼロイングされていないメモリのページである。様々な実施形態において、メモリのページは、（例えば、タイダルポッド内のノード上の）ＤＲＡＭ内のページ、フラッシュメモリ（例えば、ネットワーク接続型メモリ内の不揮発性メモリ）内のページ、または、任意の他の適切なメモリのページを含む。工程１８０４で、休止ページが割り当てられる。次に、工程１８０６において、割り当てられた休止ページがゼロイングされる。いくつかの実施形態において、休止ページのゼロイングは、休止ページの割り当てと並列で実行される。次いで、エントリが、第２レベルページテーブル内に配置され、ここで、ページは、有効かつ非休止になる。上述のように、（ページが休止としてタグ付けされうる）休止ページを用いることで、割り当て後に（または、割り当てと同時／並列に）ゼロイングを実行することにより、ゼロイングが起動時になされず、ページが用いられる時に「遅延して」行われるので、システムの起動速度が速くなる。
【０５１７】
緊密に結合されたノードのクラスタにネットワーク接続型メモリ（例えば、フラッシュ機器）を取り付けるための技術（ここで、クラスタの総メモリが、強力なメモリコヒーレンシをサポートする仮想マシンのメモリを表す）について上述した。いくつかの実施形態において、上述のように、クラスタ内のネットワーク接続型メモリは、仮想マシンの参照メモリである。
【０５１８】
上述の実施形態は、理解しやすいようにいくぶん詳しく説明されているが、本発明は、提供された詳細事項に限定されるものではない。本発明を実施する多くの代替方法が存在する。開示された実施形態は、例示であり、限定を意図するものではない。
【図１】
2019500705.tif 000004
【図２】
2019500705.tif 000005
【図３Ａ】
2019500705.tif 000006
【図３Ｂ】
2019500705.tif 000007
【図４Ａ】
2019500705.tif 000008
【図４Ｂ】
2019500705.tif 000009
【図５】
2019500705.tif 000010
【図６Ａ】
2019500705.tif 000011
【図６Ｂ】
2019500705.tif 000012
【図７】
2019500705.tif 000013
【図８】
2019500705.tif 000014
【図９】
2019500705.tif 000015
【図１０】
2019500705.tif 000016
【図１１】
2019500705.tif 000017
【図１２】
2019500705.tif 000018
【図１３Ａ】
2019500705.tif 000019
【図１３Ｂ】
2019500705.tif 000020
【図１４】
2019500705.tif 000021
【図１５】
2019500705.tif 000022
【図１６】
2019500705.tif 000023
【図１７】
2019500705.tif 000024
【図１８】
2019500705.tif 000025
【国際調査報告】
2019500705.tif 000026
2019500705.tif 000027
2019500705.tif 000028