(57)【特許請求の範囲】
【請求項１】
記憶装置を各々が備える複数のノードと、前記複数のノード間を接続するインターコネクトとを有する情報処理装置であって、
前記複数のノードのうち少なくとも１つのノードは、
該１つのノード又は他のノードが備える記憶装置から読み出したデータをキャッシュするキャッシュメモリと、
該１つのノード又は他のノードが備える記憶装置に含まれる、該１つのノード及び該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路における異常、又は、該１つのノード又は他のノードが備える記憶装置に含まれる、該１つのノード及び該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路に含まれ得るいずれかのノードにおける異常を検出する異常検出部と、
前記異常検出部により検出された異常に基づいて、前記共有メモリ領域に含まれる領域のうち、異常が検出されたデータ転送においてアクセスする領域についてのエラー情報を生成するとともに、自ノード内のプロセッサに対する割り込みを発生するエラー情報生成部と、
前記割り込みに応じて前記エラー情報に基づいて、前記異常が検出されたデータ転送においてアクセスする領域を含む共有メモリに対するリカバリ処理を実行するプロセッサと、
を有し、
前記異常検出部により異常が検出されたノードが、前記キャッシュメモリに格納したデータの読み出し元の記憶装置を有するホームノードとなる他のノードである場合には、前記プロセッサは、前記リカバリ処理を行う際に前記異常が検出された他のノードが備える記憶装置から読み出されて自ノード内のキャッシュメモリに格納されたデータを廃棄する
ことを特徴とする情報処理装置。
【請求項２】
前記異常検出部は、否定応答を受信することにより前記ノード間のデータ転送の異常を検出する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記エラー情報生成部は、
前記エラー情報を生成し、前記キャッシュメモリにキャッシュされたデータに関する情報を含むキャッシュディレクトリに前記エラー情報を書き込む
ことを特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項４】
前記エラー情報生成部は、
前記異常検出部により検出された他のノードの異常に基づいてエラー情報を生成し、該エラー情報を該他のノードによりアクセスされる共有メモリに書き込む
ことを特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項５】
前記プロセッサは、
論理アドレスと物理アドレスとが対応付けられて登録されたテーブルを用いて、アプリケーションによって生成された該アプリケーションがアクセスする記憶装置の論理アドレスを該記憶装置の物理アドレスに変換するとともに、前記異常検出部により異常が検出された場合には、該異常に対応するノードが有する記憶装置の物理アドレスと、該物理アドレスに対応する論理アドレスとの前記テーブルにおける対応付けを解消する
ことを特徴とする請求項１〜４のいずれか１つに記載の情報処理装置。
【請求項６】
前記プロセッサは、前記異常検出部により異常が検出されたノードが、リモートノードである場合には、前記キャッシュディレクトリの情報の整合性をとる
ことを特徴とする請求項３に記載の情報処理装置。
【請求項７】
前記プロセッサは、前記異常検出部により異常が検出されたノードの共有メモリに対応するシグナルハンドラに、シグナルを通知する
ことを特徴とする請求項１〜６のいずれか１つに記載の情報処理装置。
【請求項８】
記憶装置を各々が備える複数のノードと、前記複数のノード間を接続するインターコネクトとを有する情報処理装置における前記複数のノードのうち少なくとも１つのノードに、
該１つのノード又は他のノードが備える記憶装置に含まれる、該１つのノード及び該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路における異常、又は、該１つのノード又は他のノードが備える記憶装置に含まれる、該１つのノード及び該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路に含まれ得るいずれかのノードにおける異常を検出し、
検出された異常に基づいて、前記共有メモリ領域に含まれる領域のうち、異常が検出されたデータ転送においてアクセスする領域についてのエラー情報を生成するとともに、自ノード内のプロセッサに対する割り込みを発生し、
前記割り込みに応じて前記エラー情報に基づいて、前記異常が検出されたデータ転送においてアクセスする領域を含む共有メモリに対するリカバリ処理を実行する
処理を実行させ、
前記異常を検出する処理により異常が検出されたノードが、前記１つのノード又は他のノードが備える記憶装置から読み出したデータをキャッシュするキャッシュメモリに格納したデータの読み出し元の記憶装置を有するホームノードとなる他のノードである場合には、前記リカバリ処理を実行する処理は、前記リカバリ処理を行う際に前記異常が検出された他のノードが備える記憶装置から読み出されて自ノード内のキャッシュメモリに格納されたデータを廃棄する
ことを特徴とする制御プログラム。
【請求項９】
記憶装置を各々が備える複数のノードと、前記複数のノード間を接続するインターコネクトとを有する情報処理装置における前記複数のノードのうち少なくとも１つのノードが、
該１つのノード又は他のノードが備える記憶装置に含まれる、該１つのノード及び該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路における異常、又は、該１つのノード又は他のノードが備える記憶装置に含まれる、該１つのノード及び該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路に含まれ得るいずれかのノードにおける異常を検出し、
検出された異常に基づいて、前記共有メモリ領域に含まれる領域のうち、異常が検出されたデータ転送においてアクセスする領域についてのエラー情報を生成するとともに、自ノード内のプロセッサに対する割り込みを発生し、
前記割り込みに応じて前記エラー情報に基づいて、前記異常が検出されたデータ転送においてアクセスする領域を含む共有メモリに対するリカバリ処理を実行する
処理を実行し、
前記異常を検出する処理により異常が検出されたノードが、前記１つのノード又は他のノードが備える記憶装置から読み出したデータをキャッシュするキャッシュメモリに格納したデータの読み出し元の記憶装置を有するホームノードとなる他のノードである場合には、前記リカバリ処理を実行する処理は、前記リカバリ処理を行う際に前記異常が検出された他のノードが備える記憶装置から読み出されて自ノード内のキャッシュメモリに格納されたデータを廃棄する
ことを特徴とする制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、制御方法および制御プログラムに関する。
【背景技術】
【０００２】
従来、複数の演算処理装置が主記憶装置を共有するＳＭＰ（Symmetric  MultiProcessor）の技術が知られている。このようなＳＭＰの技術が適用された情報処理システムの一例として、演算処理装置と主記憶装置とを有する複数のノードを同一のバスで接続し、バスを介して、各演算処理装置が各主記憶装置を共有する情報処理システムがある。
【０００３】
このような情報処理システムでは、例えばスヌープ方式を用いて、各ノードの演算処理装置がキャッシュしたデータのコヒーレンシを保持する。
【０００４】
また、ノード間のデータの通信手段として共有メモリを使用するシステムにおいて、ノードの異常を検出した場合に、送信するデータを、異常を示すデータに変換し、変換したデータを送信する技術がある。この技術では、異常を示すデータを受信したノードは、受信したデータを破棄する。
【０００５】
また、複数のノードをクロスバスイッチにより接続したシステムにおいて、パケットの通信の滞留が発生した場合に、通信経路を変更して処理を継続する技術がある。この技術では、ノードが送信したリクエストがクロスバスイッチから自身のノードおよび他のノードへ送信される。そして、この技術では、リクエストを送信したノードが、リクエストを送信してから受信するまでの時間を計測し、タイムアウトを検出することで、パケットの通信の滞留が発生したと判定する。
【０００６】
また、複数のノードをクロスバスイッチにより接続したシステムにおいて、ノードから送信されたデータが途絶えた場合に、途絶えた時間が所定時間以上となるときには、異常を示すデータを含むダミーデータを受信側のノードに送信する技術がある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００４−０１３７２３号公報
【特許文献２】特開２００２−３６６４５１号公報
【特許文献３】特開平１１−１６８５０２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記の技術では、ノード間のデータ転送に関わる異常が発生した場合に、エラーの影響範囲を抑えることができないという問題がある。
【０００９】
例えば、スヌープ方式を用いて、キャッシュしたデータのコヒーレンシを保持する上記の情報処理システムでは、次のようなことが考えられる。すなわち、あるノードに障害が発生（ノードがダウン）して、ノード間で通信異常が発生した場合には、キャッシュしたデータのコヒーレンシを保持するために、全ノードをダウンさせることが考えられる。この場合、エラーの影響範囲が全ノードに及ぶこととなる。
【００１０】
本発明は、１つの側面では、ノード間のデータ転送に関わる異常が発生した場合に、エラーの影響範囲を抑えることを目的とする。
【課題を解決するための手段】
【００１１】
１つの側面では、一部を共有メモリ領域として設定可能な記憶装置を各々が備える複数のノードと、複数のノード間を接続するインターコネクトとを有する情報処理装置であって、ノードの各々は、異常検出部と、エラー情報生成部と、プロセッサとを有する。異常検出部は、複数のノード間のデータ転送の異常または他のノードの異常を検出する。エラー情報生成部は、異常検出部により検出された異常に基づいてエラー情報を生成すると共に、データ転送の要求発行元のノード内のプロセッサに対して割込みを発生する。プロセッサは、割込みを受信すると、エラー情報生成部が生成したエラー情報に基づいて、リカバリ処理を行う。
【発明の効果】
【００１２】
１実施形態によれば、ノード間のデータ転送に関わる異常が発生した場合に、エラーの影響範囲を抑えることができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、実施例１に係る情報処理システムの一例を説明するための図である。
【図２】図２は、実施例１に係るビルディングブロックの機能構成を説明するための図である。
【図３】図３は、共有メモリが割り当てられたノードに、他のノードがアタッチする場合のメモリマップの一例を示す図である。
【図４】図４は、実施例１に係るＣＰＵの機能構成を説明するための図である。
【図５】図５は、実施例１に係るノードマップのデータ構成の一例を説明するための図である。
【図６】図６は、ディレクトリのデータ構成の一例を説明するための図である。
【図７】図７は、実施例１に係るＣＰＵが送信するパケットを説明するための図である。
【図８】図８は、送信パケットの一例を示す図である。
【図９】図９は、異常検出部の他の構成の一例を示す図である。
【図１０】図１０は、「ＴＬＰ  ｈｅａｄｅｒ」のデータ構成の一例を示す図である。
【図１１】図１１は、「ｐｏｉｓｏｎｅｄ  ＴＬＰ」パケットを受信したＰＣＩｅ制御部の動作の具体例を説明するための図である。
【図１２】図１２は、実施例１に係るＣＰＵがリクエストを送信する処理の一例を説明するための図である。
【図１３】図１３は、実施例１に係るＣＰＵがパケットを受信した際に実行する処理の一例を説明するための図である。
【図１４】図１４は、実施例１に係るＩ／Ｏ装置がリクエストを送信する処理の一例を説明するための図である。
【図１５】図１５は、実施例１に係るＩ／Ｏ装置がレスポンスを受信する処理の一例を説明するための図である。
【図１６】図１６は、ノードと、当該ノードのアクセス対象のメモリを有するノードとの間でデータ転送の異常が発生した際に実行される処理の一例を説明するための図である。
【図１７】図１７は、ノードと、当該ノードのアクセス対象のメモリを有するノードとの間でデータ転送の異常が発生した際に実行される処理の一例を説明するための図である。
【図１８】図１８は、共有領域を制御する処理の流れを説明するためのフローチャートである。
【図１９】図１９は、共有メモリの割当処理を説明するためのフローチャートである。
【図２０】図２０は、共有メモリアタッチ処理を説明するためのフローチャートである。
【図２１】図２１は、アプリケーションが共有メモリを使用する処理を説明するためのフローチャートである。
【図２２】図２２は、ノード間の共有メモリデタッチ処理を説明するためのフローチャートである。
【図２３】図２３は、ノード間共有メモリの解放処理を説明するためのフローチャートである。
【図２４】図２４は、リクエストを発行する処理の流れを説明するためのフローチャートである。
【図２５】図２５は、リクエストを受信した際に実行する処理の流れを説明するためのフローチャートである。
【図２６】図２６は、ＣＰＵが応答を受信した際に実行する処理の流れを説明するためのフローチャートである。
【図２７】図２７は、ＣＰＵがリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。
【図２８】図２８は、ＰＣＩｅ制御部がリードのリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。
【図２９】図２９は、ＰＣＩｅ制御部がライトのリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。
【図３０】図３０は、トラップが発生することによってＯＳが実行するトラップ処理の流れを説明するためのフローチャートである。
【図３１】図３１は、ハンドラテーブルのデータ構造の一例を示す図である。
【図３２】図３２は、シグナルが通知されたシグナルハンドラが実行する処理の流れを説明するためのフローチャートである。
【図３３】図３３は、シグナルが通知されたシグナルハンドラが実行する他の処理の流れを説明するためのフローチャートである。
【図３４】図３４は、ノードの異常を検出する方法の一例を説明するための情報処理システムの模式的な図である。
【図３５】図３５は、実施例１の異常検出方法とは異なる方法を用いた場合の処理の流れを説明するためのフローチャートである。
【図３６】図３６は、クラスタ管理マネージャが異常を検出した場合の処理の流れを説明するためのフローチャートである。
【図３７】図３７は、情報処理システムの一例を説明するための図である。
【図３８】図３８は、パーティションの一例を説明するための図である。
【図３９Ａ】図３９Ａは、パーティション＃ＡのＣＰＵが記憶するノードマップの一例を説明するための図である。
【図３９Ｂ】図３９Ｂは、パーティション＃Ａを示すノードマップの一例を説明するための図である。
【図３９Ｃ】図３９Ｃは、パーティション＃Ｂを示すノードマップの一例を説明するための図である。
【００１４】
以下に添付図面を参照して本願に係る情報処理装置、制御方法および制御プログラムについて説明する。
【実施例１】
【００１５】
以下の実施例１では、図１を用いて、複数のノードを有する情報処理システムの一例について説明する。図１は、実施例１に係る情報処理システムの一例を説明するための図である。図１に示す例では、情報処理システム１は、ＸＢ（クロスバスイッチ）２と複数のビルディングブロック１０〜１０ｅとを有する。ＸＢ２は、各ビルディングブロック１０〜１０ｅを相互に接続するクロスバスイッチである。また、ＸＢ２は、後述する各ビルディングブロック１０〜１０ｅが有する各サービスプロセッサのマスターとなる不図示のサービスプロセッサを有する。なお、少数のノードが接続される小規模構成の場合、ＸＢ２を介さずに、ビルディングブロック同士を直接接続しても良い。
【００１６】
また、ビルディングブロック１０は、複数のＣＰＵ（Central  Processing  Unit）２１〜２１ｃと複数のメモリ２２〜２２ｃとを有する。また、他のビルディングブロック１０ａ〜１０ｅも、ビルディングブロック１０と同様の構成を有するものとし、以下の説明を省略する。なお、図１に示す例では、ＣＰＵ２１ｂ、２１ｃおよびメモリ２２ｂ、２２ｃについては、記載を省略した。また、各ビルディングブロック内には、不図示のＩ／Ｏ（Input  Output）装置が設けられている。ここで、本実施例では、ＣＰＵ間のキャッシュコヒーレンス制御をディレクトリ方式で実現し、データをメモリ上に持つ後述のホームＣＰＵが該当ディレクトリを管理している。
【００１７】
各ビルディングブロック１０〜１０ｅは、それぞれ独立してＯＳを動作させる。すなわち、各ＣＰＵ２１〜２１ｃは、それぞれ独立してＯＳを実行する。各ビルディングブロック１０〜１０ｅが実行するＯＳは、ビルディングブロック毎に異なるパーティションで動作する。ここで、パーティションとは、同一のＯＳが動作し、動作しているＯＳから見て１つのシステムとして動作するビルディングブロックの群を示す。
【００１８】
例えば、ビルディングブロック１０〜１０ａがパーティション＃Ａとして動作し、ビルディングブロック１０ｂ〜１０ｄがパーティション＃Ｂとして動作する。このような場合には、ビルディングブロック１０が動作させるＯＳは、ビルディングブロック１０、１０ａが１つのシステムとして動作していると識別し、ビルディングブロック１０ｂが動作させるＯＳは、ビルディングブロック１０ｂ〜１０ｄが１つのシステムとして動作していると識別する。
【００１９】
次に、図２を用いて、ビルディングブロックの構成例について説明する。図２は、実施例１に係るビルディングブロックの機能構成を説明するための図である。図２に示す例では、ビルディングブロック１０は、ノード２０、サービスプロセッサ２４、ＸＢ接続部２７、２７ａ、ＰＣＩｅ（Peripheral  Component  Interconnect  Express）接続部２８を有する。
【００２０】
ノード２０は、複数のＣＰＵ２１〜２１ｃと、複数のメモリ２２〜２２ｃと、通信部２３とを有する。
【００２１】
サービスプロセッサ２４は、制御部２５と、通信部２６とを有する。また、図２に示す例では、各ＣＰＵ２１〜２１ｃは、相互に接続されるとともに、通信部２３と接続されている。また、各メモリ２２〜２２ｃは、各ＣＰＵ２１〜２１ｃと接続されている。サービスプロセッサ２４は、不図示のＬＡＮ（Local  Area  Network）などのネットワーク回線を介してサーバの管理者端末に接続され、管理者端末からの指示を受けてノードまたはビルディングブロック１０内の各種設定変更などの制御を行う。
【００２２】
また、各ＣＰＵ２１〜２１ｃは、ＸＢ接続部２７またはＸＢ接続部２７ａと接続されている。なお、ＸＢ接続部２７、２７ａは、同一のＸＢ接続部であってもよい。また、各ＣＰＵ２１〜２１ｃは、ＰＣＩｅ接続部２８と接続されている。また、通信部２３は、サービスプロセッサ２４が有する通信部２６と接続されている。なお、制御部２５、通信部２６、通信部２３、各ＣＰＵ２１〜２１ｃは、例えば、Ｉ２Ｃ（Inter-Integrated  Circuit）で接続されている。
【００２３】
ＣＰＵ２１〜２１ｃは、アプリケーションを実行する演算処理装置である。また、各ＣＰＵ２１〜２１ｃには、それぞれメモリ２２〜２２ｃが接続されている。また、各ＣＰＵ２１〜２１ｃは、実行中のアプリケーションが共有メモリの割当てを要求した場合には、相互に通信を行い、アプリケーションが使用する共有メモリの割当てを行う。また、各ＣＰＵ２１〜２１ｃは、各メモリ２２〜２２ｃや、他のビルディングブロック１０ａ〜１０ｅが有するメモリの一部を共有メモリとして利用する。
【００２４】
図３は、共有メモリ実体が割り当てられたノードに、他のノードがアタッチする場合のメモリマップの一例を示す図である。図３の例では、メモリ実体を所有するノード（これをホームノードと称する）に、共有メモリが割り当てられると、ホームノードはこれを一定の領域サイズに分割する。この分割単位をセグメント（ｓｅｇｍｅｎｔ）と称するが、セグメントに分割する事は必須ではない。他のノードが当該ホームノードが所有する共有メモリの割り当てを要求する場合、すなわちアタッチする事で、当該ホームノードの共有メモリを使用することができる。このリモートノードが使用するメモリ領域を共有メモリイメージ領域と称する。この共有メモリイメージ領域は、単独のリモートノードがアタッチしても良いし、複数のリモートノードがアタッチしても良い。
【００２５】
図２に戻り、各ＣＰＵ２１〜２１ｃは、物理アドレスと、物理アドレスが割り振られたメモリと接続されたＣＰＵの識別子であるＣＰＵＩＤ（identification）とを対応付けたノードマップを有する。なお、このＣＰＵＩＤはシステム１で一意に決定され、重複しない。
【００２６】
各ＣＰＵ２１〜２１ｃは、ノードマップを用いて、他のＣＰＵと通信を行う。例えば、ＣＰＵ２１は、アクセス対象となる物理アドレスと対応付けられたＣＰＵＩＤが、ＣＰＵ２１〜２１ｃとは異なるＣＰＵを示す場合には、ＸＢ接続部２７、またはＸＢ接続部２７ａ、およびＸＢ２を介して他のノードにメモリアクセスのリクエストを送信する。また、ＣＰＵ２１は、自身と接続されたメモリに対するリクエストを他のノードから受信した場合には、リクエストの対象となるデータを自身と接続されたメモリ２２から読出し、リクエスト元へ送信する。他のＣＰＵ２１ａ〜２１ｃも同様の処理を行う。
【００２７】
また、各ＣＰＵ２１〜２１ｃは、ＴＬＢ（Translation  Lookaside  Buffer）を用いたアドレス変換を行うとともに、ＴＬＢミスが発生した際に、トラップ処理を実行するなど、従来のＣＰＵと同様の処理を実行する機能も有する。
【００２８】
また、各ＣＰＵ２１〜２１ｃは、ノード間のデータ転送の異常（エラー）を検出する。ノード間のデータ転送の異常を検出する方法の一例について説明する。例えば、各ＣＰＵ２１〜２１ｃは、リクエストを送信してからの時間を計測する。続いて、リクエスト（要求）を送信してからレスポンス（応答）を受信する前に、リクエストを送信してからの時間が、所定時間を超えた場合には、タイムアウトになったため、各ＣＰＵ２１〜２１ｃは、ノード間のデータ転送の異常を検出する。また、各ＣＰＵ２１〜２１ｃは、リクエストに対して他のノードから否定応答が返って来た場合も異常を検出する。
【００２９】
そして、異常を検出した場合には、各ＣＰＵ２１〜２１ｃは、様々な処理を行う。例えば、異常の発生の原因となったノード（例えば、ダウンしたノード）によって、各メモリ２２〜２２ｃの共有メモリにライトバックされるダーティのキャッシュデータが、ライトバックされない場合には、各ＣＰＵ２１〜２１ｃは、次のような処理を行う。すなわち、各ＣＰＵ２１〜２１ｃは、キャッシュの状態を示すディレクトリに、ダウンしたノードによって、各メモリ２２〜２２ｃの共有メモリにライトバックされるダーティのキャッシュデータが、ライトバックされなかった異常を示す値を書き込む。また、異常を検出し、異常の発生の原因となったノードによって、各メモリ２２〜２２ｃの共有メモリにライトバックされるダーティのキャッシュデータが、ライトバックされない場合には、各ＣＰＵ２１〜２１ｃは、次のような処理を行うこともできる。すなわち、各ＣＰＵ２１〜２１ｃは、ダウンしたノードによってキャッシュデータがライトバックされる各メモリ２２〜２２ｃの共有メモリの領域に、エラー状態を示すデータを書き込むこともできる。これらの処理により、ライトバックされなかった共有メモリのデータが正常でないことを示すことができる。
【００３０】
また、後述のホームＣＰＵにライトバックの要求が届かないケースでは、後述のローカルＣＰＵがホームＣＰＵからの後述のタイムアウトを検出することで、トランザクション失敗を認識する。この場合、ローカルＣＰＵは、該当データを破棄する。ホームＣＰＵが管理するディレクトリ上はローカルＣＰＵがデータをキャッシュに持ち出した状態のままであるので、ホームＣＰＵから「ＭｏｖｅＯｕｔ」要求が発生する。この「ＭｏｖｅＯｕｔ」要求は、ローカルＣＰＵでキャッシュミスが発生するが、この「ＭｏｖｅＯｕｔ」要求に対してエラー応答を返し、ホームＣＰＵにあるディレクトリの状態を異常に更新、すなわち、上述したエラー状態を示すデータを書き込む。
【００３１】
また、エラー発生アドレスレジスタに、ダウンしたノードの共有メモリの物理アドレス（Physical  Address；ＰＡ）が書き込まれた場合には、トラップ（割込み）が発生する。すなわち、エラー発生アドレスレジスタに、物理アドレスが書き込まれた場合には、各ＣＰＵ２１〜２１ｃは、トラップ処理を行う。このトラップ処理では、例えば、シグナルハンドラにシグナルが送信される。
【００３２】
ここで、シグナルハンドラは、シグナルを受信すると起動される。シグナルハンドラによる処理では、様々な処理が行われる。例えば、シグナルハンドラによる処理では、ダウンしたノードに「共有メモリ実体」が存在する場合に、「共有メモリイメージ」をデタッチ、すなわち、ダウンしたノードが有する共有メモリの割当ての解除が行われる。また、シグナルハンドラによる処理では、他のノードがダウンしたことを検出したノードのメモリの共有メモリに対するリカバリ処理を行う。リカバリ処理の一例としては、共有メモリにライトバックされるキャッシュデータがライトバックされなかった異常を示す値を、ディレクトリからクリアする処理が挙げられる。また、リカバリ処理の他の一例としては、エラー状態を示すデータを、共有メモリからクリアする処理が挙げられる。
【００３３】
メモリ２２〜２２ｃは、情報処理システム１が有する全てのＣＰＵが共用するメモリである。また、情報処理システム１においては、全てのビルディングブロック１０〜１０ｅが有するメモリに対して、各ビルディングブロック１０〜１０ｅのサービスプロセッサが、同一の物理アドレス空間にマッピングされる物理アドレスを振分ける。すなわち、情報処理システム１が有するすべてのメモリのうち、少なくとも共有メモリとして使用されるメモリには、重複しない値の物理アドレスが割当てられている。
【００３４】
また、メモリ２２〜２２ｃは、記憶領域の一部を、情報処理システム１が有する全てのＣＰＵが共用する共有領域とし、他の部分を、自身にアクセスするＣＰＵ２１〜２１ｃがカーネルデータやユーザデータを格納するローカル領域、他ノードとの共有メモリを介したやり取りとは無関係なＩ／Ｏ装置が利用するＩ／Ｏ領域とする。
【００３５】
制御部２５は、ビルディングブロック１０の制御を行う。例えば、制御部２５は、ビルディングブロック１０の電源管理や、ビルディングブロック１０内の異常の監視や制御等を実行する。また、制御部２５は、他のビルディングブロック１０ａ〜１０ｅが有するサービスプロセッサと、不図示のネットワークによって接続されており、各ビルディングブロック１０ａ〜１０ｅ間で連係した制御を実行する。また、制御部２５は、各ＣＰＵ２１〜２１ｃが実行するＯＳと通信を行うことができる。
【００３６】
また、制御部２５は、通信部２６と通信部２３を介して、各ＣＰＵ２１〜２１ｃにアクセスする。そして、制御部２５は、各ビルディングブロック１０〜１０ｅが有するノードマップの更新や制御等を実行する。
【００３７】
なお、通信部２３は、サービスプロセッサ２４が有する通信部２６を介して、制御部２５による制御信号を各ＣＰＵ２１〜２１ｃに伝達する。また、通信部２６は、制御部２５による制御信号をノード２０が有する通信部２３に伝達する。また、ＸＢ接続部２７、２７ａは、各ＣＰＵ２１〜２１ｃをＸＢ２と接続し、各ビルディングブロック１０〜１０ｅが有するＣＰＵ間の通信を中継する。また、ＰＣＩｅ接続部２８は、各ＣＰＵ２１〜２１ｃによるＩ／Ｏ装置へのアクセスを中継する。
【００３８】
次に、図４を用いて、各ＣＰＵ２１〜２１ｃが有する機能構成について説明する。図４は、実施例１に係るＣＰＵの機能構成を説明するための図である。なお、ＣＰＵ２１ａ〜２１ｃは、ＣＰＵ２１と同様の機能を有するため、説明を省略する。また、図４に示す例では、サービスプロセッサ２４とＣＰＵ２１とを接続する接続部２３、２６については、記載を省略した。
【００３９】
図４に示す例では、ＣＰＵ２１は、演算処理部３０、ルータ４０、メモリアクセス部４１、ＰＣＩｅ制御部４２を有する。また、演算処理部３０は、演算部３１、Ｌ１（Level  1）キャッシュ３２、Ｌ２（Level  2）キャッシュ３３、ノードマップ３４、アドレス変換部３５、キャッシュディレクトリ管理部３６、パケット制御部３７、エラー発生アドレスレジスタ９６、トラップ発生部９７を有する。なお、ルータ４０、メモリアクセス部４１、ＰＣＩｅ制御部４２などの各部を同一のＣＰＵ２１の内部に含めなくても良い。
【００４０】
また、パケット制御部３７は、パケット生成部３７ａ、パケット受信部３７ｂ、異常検出部３７ｃを有する。また、ＰＣＩｅ制御部４２は、リクエスト生成部４２ａ、ＰＣＩｅバス制御部４２ｂ、異常検出部４２ｃを有する。
【００４１】
まず、演算処理部３０が有するノードマップ３４について説明する。ノードマップ３４は、物理アドレスと、物理アドレスが示す記憶領域を有するメモリと接続されたＣＰＵのＣＰＵＩＤとが対応付けて登録されるテーブルである。以下、ノードマップ３４に登録される情報の例を、図面を用いて説明する。
【００４２】
図５は、実施例１に係るノードマップのデータ構成の一例を説明するための図である。図５に示す例では、ノードマップ３４は、「アドレス」、「バリッド」、「ノードＩＤ」、「ＣＰＵＩＤ」の各項目の登録内容を対応付けたエントリを有する。ここで、各エントリの「アドレス」の項目には、連続する複数の物理アドレスを含むアドレス域を示す情報が格納される。
【００４３】
例えば、情報処理システム１は、全てのメモリに対して振り分けた物理アドレス空間を均等な大きさのアドレス域に分割し、各アドレス域に＃０、＃１、＃２等の識別子を付与する。そして、情報処理システム１は、各アドレス域を示す識別子を、ノードマップ３４が有する各エントリの「アドレス」に登録する。図５の例は、１番目のエントリの「アドレス」の項目に、＃０の識別子が登録された場合を示す。また、図５の例は、２番目のエントリの「アドレス」の項目に、＃１の識別子が登録された場合を示す。また、図５の例は、３番目のエントリの「アドレス」の項目に、＃２の識別子が登録された場合を示す。
【００４４】
また、各エントリの「バリッド」の項目には、物理アドレスが示す記憶領域にアクセスすることができるか否かを示すバリッドビットが登録される。例えば、物理アドレスが示す記憶領域が、各ＣＰＵで共有される共有領域である場合には、アクセスを行う事ができる旨のバリッドビット（例えば「１」）が登録される。図５の例は、１番目のエントリの「バリッド」の項目に、バリッドビット「１」が登録された場合を示す。また、図５の例は、２番目のエントリの「バリッド」の項目に、バリッドビット「１」が登録された場合を示す。また、図５の例は、３番目のエントリの「バリッド」の項目に、物理アドレスが示す記憶領域にアクセスすることができないことを示すバリッドビット「０」が登録された場合を示す。
【００４５】
また、各エントリの「ノードＩＤ」の項目には、物理アドレスが振り分けられたメモリが存在するノードを示す識別子が登録される。図５の例は、１番目のエントリの「ノードＩＤ」の項目に、ノードを示す識別子「１」が登録された場合を示す。また、図５の例は、２番目のエントリの「ノードＩＤ」の項目に、ノードを示す識別子「１」が登録された場合を示す。
【００４６】
また、各エントリの「ＣＰＵＩＤ」の項目には、物理アドレスが振り分けられたメモリと接続されたＣＰＵを示す識別子が登録される。すなわち、ノードマップ３４は、アクセス対象となる物理アドレスが、どのＣＰＵと接続されたメモリの物理アドレスであるかを示す。図５の例は、１番目のエントリの「ＣＰＵＩＤ」の項目に、ＣＰＵを示す識別子「４」が登録された場合を示す。また、図５の例は、２番目のエントリの「ＣＰＵＩＤ」の項目に、ＣＰＵを示す識別子「５」が登録された場合を示す。
【００４７】
なお、ノードマップ３４には、アクセス対象となる物理アドレスがどのＣＰＵと接続された物理アドレスであるかを示すことができれば、本実施例以外の任意の形式で情報を登録することとしてよい。
【００４８】
図４に戻って、演算部３１は、演算処理を実行し、ＯＳ（Operating  System）やアプリケーションを実行する演算装置のコアである。また、演算部３１は、データのリード（読み込み）や、ライト（書き込み）を行う場合には、リード対象またはライト対象となるデータが格納された記憶領域の論理アドレス（Virtual  Address；ＶＡ）をアドレス変換部３５に出力する。
【００４９】
Ｌ１キャッシュ３２は、演算部３１で頻繁に利用されるデータを一時的に記憶するキャッシュメモリである。Ｌ２キャッシュ３３は、Ｌ１キャッシュ３２と同様に、頻繁に利用されるデータを一時的に記憶するが、Ｌ１キャッシュ３２よりも記憶容量が大きく、データを読み書きする速度が低速なキャッシュメモリである。ここで、ディレクトリ情報は、キャッシュディレクトリ管理部３６に記憶されており、メモリ２２の各記憶領域に記憶されたデータをキャッシュしたＣＰＵや、キャッシュされたデータの更新状況を示す情報である。なお、以下の説明では、「ディレクトリ情報」を単に「ディレクトリ」と表記する場合がある。このディレクトリによるキャッシュメモリ管理方法は、ｃｃＮＵＭＡ（Cache  Coherent  Non-Uniform  Memory）システムでよく利用される技術であるが、ｃｃＮＵＭＡ技術、ディレクトリ技術の両方とも公知の技術であるので、ここでは詳しく説明しない。また、図４ではディレクトリ３６ａはキャッシュディレクトリ管理部３６に内蔵されているが、メモリ２２の記憶領域の一部にディレクトリ情報を記録する事も可能である。
【００５０】
アドレス変換部３５は、ＴＬＢ３５ａを有する。ＴＬＢ３５ａには、論理アドレスと物理アドレスとを対応付けたエントリが登録される。アドレス変換部３５は、ＴＬＢ３５ａを用いて、演算部３１が出力した論理アドレスを物理アドレスに変換する。例えば、アドレス変換部３５は、演算部３１から取得した論理アドレスに対応する物理アドレスをＴＬＢ３５ａから検索し、検索した結果、物理アドレスが得られた場合には、得られた物理アドレスをキャッシュディレクトリ管理部３６に出力する。なお、アドレス変換部３５は、ＴＬＢミスが発生した場合は、トラップ処理を実行する。ここで、ＯＳなどのシステムソフトウェアは、ＴＬＢミスした物理アドレスと論理アドレスの組をＴＬＢ３５ａに登録する。ただし、かかる組の登録が禁止された物理アドレスについては、ＴＬＢミスが発生した場合であっても、ＯＳなどのシステムソフトウェアにより、物理アドレスと論理アドレスとの組がＴＬＢ３５ａに登録されない。
【００５１】
ここで、ＯＳやアドレス変換部３５などは、演算部３１が実行するアプリケーションから共有メモリへの割当てを要求された場合には、次のような処理を実行する。すなわち、ＴＬＢミスが発生した場合、ＯＳなどのシステムソフトウェアなどは、エントリをＴＬＢ３５ａに登録する。また、ＴＬＢミスが発生しない場合には、既にエントリがＴＬＢ３５ａに登録済みであるので、アドレス変換部３５は、論理アドレスから物理アドレスへの変換を行う。
【００５２】
また、アドレス変換部３５やＯＳは、アプリケーションやＯＳからローカル領域の割当を要求された場合は、次のような処理を実行する。すなわち、ＴＬＢミスが発生した場合、ＯＳなどのシステムソフトウェアは、ＣＰＵ２１専用のローカル領域にアクセスするための論理アドレスと、ローカル領域に割当てられる範囲の物理アドレスとを対応付けたエントリをＴＬＢ３５ａに登録する。
【００５３】
また、ＯＳなどは、異常が発生したノードの共有メモリの物理アドレスを含むエントリをＴＬＢ３５ａから削除する。
【００５４】
キャッシュディレクトリ管理部３６は、ディレクトリ３６ａを有する。キャッシュディレクトリ管理部３６は、キャッシュデータおよびディレクトリの管理を行う。キャッシュディレクトリ管理部３６は、アドレス変換部３５から、演算部３１が出力した論理アドレスを変換した物理アドレスを取得する。
【００５５】
そして、キャッシュディレクトリ管理部３６は、アドレス変換部３５から物理アドレスを取得した場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部３６は、ディレクトリ３６ａを用いて、取得した物理アドレスに格納されたデータがＬ１キャッシュ３２およびＬ２キャッシュ３３にキャッシュされているか否かを判定する。
【００５６】
そして、キャッシュディレクトリ管理部３６は、取得した物理アドレスに格納されたデータがキャッシュされていると判定した場合には、キャッシュされているデータを演算部３１に出力する。また、キャッシュディレクトリ管理部３６は、取得した物理アドレスに格納されたデータがＬ１キャッシュ３２およびＬ２キャッシュ３３にキャッシュされていない場合は、次のような処理を実行する。まず、キャッシュディレクトリ管理部３６は、ノードマップ３４を参照し、取得した物理アドレスを含む範囲のエントリを識別する。そして、キャッシュディレクトリ管理部３６は、識別したエントリのＣＰＵＩＤがＣＰＵ２１のＣＰＵＩＤであるか否かを判定する。その後、キャッシュディレクトリ管理部３６は、識別したエントリのＣＰＵＩＤがＣＰＵ２１のＣＰＵＩＤである場合は、メモリアクセス部４１に、物理アドレスを出力する。
【００５７】
また、キャッシュディレクトリ管理部３６は、識別したエントリのＣＰＵＩＤがＣＰＵ２１のＣＰＵＩＤではない場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部３６は、識別したエントリのＣＰＵＩＤとノードＩＤとを取得する。そして、キャッシュディレクトリ管理部３６は、パケット制御部３７に対して、取得したＣＰＵＩＤと物理アドレスとを出力する。
【００５８】
また、キャッシュディレクトリ管理部３６は、出力した物理アドレスが示す記憶領域に格納されているデータをメモリアクセス部４１やパケット制御部３７から取得した場合には、取得したデータをＬ１キャッシュ３２およびＬ２キャッシュ３３に格納する。そして、キャッシュディレクトリ管理部３６は、Ｌ１キャッシュ３２にキャッシュさせたデータを演算部３１に出力する。
【００５９】
また、キャッシュディレクトリ管理部３６は、パケット制御部３７から物理アドレスを取得した場合、すなわち、他のＣＰＵやＩ／Ｏ装置からのメモリアクセスのリクエストの対象となる物理アドレスを取得した場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部３６は、ノードマップ３４を参照して、取得した物理アドレスがローカル領域に振り分けられた物理アドレスであるか否かを判定する。
【００６０】
取得した物理アドレスがローカル領域に振り分けられた物理アドレスである場合には、キャッシュディレクトリ管理部３６は、パケット制御部３７に対して、リクエスト元に否定応答（アクセスエラー）を送信するように指示する。
【００６１】
また、取得した物理アドレスが共有領域に振り分けられた物理アドレスである場合には、キャッシュディレクトリ管理部３６は、取得した物理アドレスが示す記憶領域に記憶されたデータを取得し、取得したデータをパケット制御部３７に出力し、リクエスト元へ送信するよう指示する。
【００６２】
また、キャッシュディレクトリ管理部３６は、ディレクトリ方式を用いて、キャッシュしたデータのコヒーレンシを保持する処理を合わせて実行する。例えば、キャッシュディレクトリ管理部３６は、メモリ２２に格納されたデータをリクエスト送信元のＣＰＵに送信させる場合には、当該データがリクエスト送信元のＣＰＵ以外の他のＣＰＵがキャッシュしているか否かを判定する。
【００６３】
そして、キャッシュディレクトリ管理部３６は、リクエストの対象となるデータを他のＣＰＵがキャッシュしていない場合は、Ｌ１キャッシュ３２、Ｌ２キャッシュ３３、メモリ２２からリクエストの対象となるデータを取得する。その後、キャッシュディレクトリ管理部３６は、取得したデータをパケット制御部３７に出力する。
【００６４】
一方、キャッシュディレクトリ管理部３６は、リクエストの対象となるデータを他のＣＰＵがキャッシュしている場合は、イリノイプロトコル等の手法を用いて、キャッシュコヒーレンスを保持するための処理を実行する。例えば、キャッシュディレクトリ管理部３６は、キャッシュされたデータの状態がＭＥＳＩ(Modified/Exclusive/Shared/Invalid)のいずれであるかを判定する。
【００６５】
そして、キャッシュディレクトリ管理部３６は、判定結果に応じて、他のＣＰＵが有するキャッシュディレクトリ管理部とコヒーレンシを保持するためのリクエストやオーダー（命令）の送受信を行い、キャッシュされたデータの状態に応じた処理を実行する。ここで、「Ｍｏｄｉｆｉｅｄ」とは、いずれか１つのＣＰＵがデータをキャッシュしており、かつ、キャッシュされたデータが更新されている状態を示す。なお、キャッシュされたデータの状態が「Ｍｏｄｉｆｉｅｄ」である場合には、ライトバックを実行する必要がある。
【００６６】
また、「Ｅｘｃｌｕｓｉｖｅ」とは、いずれか１つのＣＰＵがデータをキャッシュしており、かつ、キャッシュされたデータが更新されていない状態を示す。また、「Ｓｈａｒｅｄ」とは、複数のＣＰＵがデータをキャッシュしており、かつ、キャッシュされたデータが更新されていないことを示す。また、「Ｉｎｖａｌｉｄ」とは、キャッシュのステータスが登録されていないことを示す。
【００６７】
詳細な例を挙げると、キャッシュディレクトリ管理部３６は、ステータスがＭ（Modified）であるデータをキャッシュしたＣＰＵに対してライトバックを指示するオーダーを送信するようパケット生成部３７ａに指示する。そして、キャッシュディレクトリ管理部３６は、データのステータスを更新し、更新後のステータスに応じた処理を実行する。なお、キャッシュディレクトリ管理部３６が送受信するリクエストやオーダーの種別については、後述する。
【００６８】
また、キャッシュディレクトリ管理部３６は、ノード間のデータ転送の異常が検出された場合に、異常の発生の原因となったノードによって、メモリ２２の共有メモリにライトバックされるキャッシュデータが、ライトバックされないときには、次の処理を行う。すなわち、キャッシュディレクトリ管理部３６は、ダウンしたノードによって、メモリ２２の共有メモリにライトバックされるキャッシュデータが、ライトバックされなかった異常を示す値をディレクトリ３６ａの所定の領域に書き込む。
【００６９】
図６は、ディレクトリのデータ構成の一例を説明するための図である。図６に示すように、ディレクトリ３６ａは、０ビット目から３ビット目までの４ビットの「ＵＥ」の項目を有する。また、ディレクトリ３６ａは、４ビット目から６６ビット目までの６３ビットの「ＰＲＣ」の項目を有する。また、ディレクトリ３６ａは、６７ビット目から６８ビット目までの２ビットの「ＣＫＢＩＴ」の項目を有する。「ＣＫＢＩＴ」の項目には、キャッシュの状態をコード化したデータが登録される。「ＰＲＣ」の項目には、キャッシュを保持しているＣＰＵの位置をビットマップで表したデータが登録される。「ＵＥ」の項目には、ディレクトリの異常と異常の原因を表したデータが登録される。
【００７０】
ここで、図６の例に示すディレクトリ３６ａをキャッシュディレクトリ管理部３６が有する場合について説明する。この場合に、異常が検出され、異常の発生の原因となったノードによって、メモリ２２の共有メモリにライトバックされるキャッシュデータが、ライトバックされないときには、キャッシュディレクトリ管理部３６は、次の処理を行う。すなわち、キャッシュディレクトリ管理部３６は、ダウンしたノードによって、メモリ２２の共有メモリにライトバックされるキャッシュデータが、ライトバックされなかった異常と、原因とを示す４ビット以下の値をディレクトリ３６ａの「ＵＥ」の項目に書き込む。これにより、ライトバックされなかった共有メモリのデータが正常でないことを示すことができる。
【００７１】
また、キャッシュディレクトリ管理部３６は、ノード間のデータ転送の異常が検出され、異常の発生の原因となったノードによって、メモリ２２の共有メモリにライトバックされるキャッシュデータが、ライトバックされない場合には、次の処理を行うこともできる。すなわち、キャッシュディレクトリ管理部３６は、ダウンしたノードによってキャッシュデータがライトバックされるメモリ２２の共有メモリの領域に、エラー状態を示すデータを書き込むこともできる。ここで、共有メモリの領域に書き込まれるエラー状態を示すデータの一例について説明する。例えば、メモリ２２に記憶されるデータに、所定のビット数ごとに、ＥＣＣ（Error  Check  and  Correct）データが含まれている場合に、ＥＣＣの生成多項式によっては、２ビット以上の誤り訂正をおこなうことができる。この場合に、他のエラーと比較して発生の可能性の低いｎ（ｎ≧２）ビット以上のエラーを示す特定の値のシンドロームを、共有メモリの領域に書き込まれるエラー状態を示すデータとすることができる。また、データ本体に書き込んだ場合に、シンドロームが特定の値となるような値を、共有メモリの領域に書き込まれるエラー状態を示すデータとすることができる。これにより、ライトバックされなかった共有メモリのデータが正常でないことを示すことができる。
【００７２】
また、キャッシュディレクトリ管理部３６は、メモリ２２の共有メモリに対するリカバリ処理を行う。リカバリ処理の一例としては、共有メモリにライトバックされるキャッシュデータがライトバックされなかった異常を示す値を、ディレクトリ３６ａからクリアする処理が挙げられる。また、リカバリ処理の他の一例としては、エラー状態を示すデータを、共有メモリからクリアする処理が挙げられる。このリカバリ処理は、後述する通り、ＯＳやアプリケーションソフトウェアの指示により行われる。
【００７３】
パケット生成部３７ａは、キャッシュディレクトリ管理部３６から物理アドレスと、ＣＰＵＩＤとを取得した場合には、取得した物理アドレスと、ＣＰＵＩＤとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。そして、パケット生成部３７ａは、生成したパケットをルータ４０に送信する。
【００７４】
図７は、実施例１に係るＣＰＵが送信するパケットを説明するための図である。図７に示す例では、パケット生成部３７ａは、ＣＰＵＩＤと、物理アドレスと、リクエストの内容を示すデータとを含むリクエストを生成し、生成したリクエストをルータ４０に出力する。このような場合には、ルータ４０は、パケット生成部３７ａが生成したリクエストを、ＸＢ接続部２７を介してＸＢ２に出力する。すると、ＸＢ２は、リクエストに含まれるＣＰＵＩＤが示すＣＰＵへとリクエストを転送する。
【００７５】
なお、パケット生成部３７ａは、キャッシュディレクトリ管理部３６からコヒーレンシを保持するためのリクエストやオーダーの発行の指示を受付けた場合には、指示されたリクエストやオーダーを生成する。そして、パケット生成部３７ａは、生成したリクエストやオーダーをルータ４０、ＸＢ接続部２７、ＸＢ２を介して、指示されたＣＰＵに送信する。また、パケット生成部３７ａは、Ｉ／Ｏ装置からデータを取得する場合は、Ｉ／Ｏに対するアクセス要求をルータ４０に出力する。
【００７６】
また、パケット生成部３７ａは、リクエストを送信すると、リクエストを送信したことを示すデータを異常検出部３７ｃに出力する。このデータには、送信したリクエストの種類、アクセス対象のメモリの物理アドレスなどリクエストに関する情報が含まれている。
【００７７】
パケット受信部３７ｂは、ＸＢ２、ＸＢ接続部２７、ルータ４０を介して、他のＣＰＵや自ノード以外の他のＩ／Ｏ装置が出力したパケットを受信すると、受信したパケットに含まれる物理アドレスを取得する。そして、パケット受信部３７ｂは、取得した物理アドレスをキャッシュディレクトリ管理部３６に出力する。また、パケット受信部３７ｂは、他のＣＰＵが送信したデータを受信した場合には、受信したデータをキャッシュディレクトリ管理部３６に出力する。
【００７８】
また、パケット受信部３７ｂは、コヒーレンシを保持するためのリクエストやオーダーを受信した場合には、受信したリクエストやオーダーをキャッシュディレクトリ管理部３６に出力する。また、パケット受信部３７ｂは、Ｉ／Ｏ装置に対するアクセス要求の応答やデータをルータ４０から受信した場合は、受信した応答やデータをキャッシュディレクトリ管理部３６に出力する。このような場合には、キャッシュディレクトリ管理部３６は、例えば、取得したデータをメモリアクセス部４１に出力し、メモリ２２に格納される処理を行う。
【００７９】
また、パケット受信部３７ｂは、パケット生成部３７ａにより送信されたリクエストに対応するレスポンスを受信すると、レスポンスを受信したことを示すデータを異常検出部３７ｃに出力する。このデータには、受信したレスポンスの種類などレスポンスに関する情報が含まれている。
【００８０】
異常検出部３７ｃは、ポインタ８０、タイマ８１、送信パケット８２、ＰＡ８３、リクエスト８４、検出部８５を有する。
【００８１】
異常検出部３７ｃは、パケット生成部３７ａからリクエストを送信したことを示すデータを受信するたびに、時間を計測するためのタイマ８１を起動させる。また、異常検出部３７ｃは、パケット受信部３７ｂからレスポンスを受信したことを示すデータを受信するたびに、タイマ８１を起動させる。また、異常検出部３７ｃは、パケット生成部３７ａからリクエストを送信したことを示すデータを受信すると、受信したデータから、送信されたリクエストに含まれるアクセス対象のメモリの物理アドレスをＰＡ８３に記憶させる。また、異常検出部３７ｃは、パケット生成部３７ａからリクエストを送信したことを示すデータを受信すると、受信したデータから、送信されたリクエストをリクエスト８４に記憶させる。
【００８２】
また、異常検出部３７ｃは、パケット生成部３７ａからリクエストを送信したことを示すデータを受信すると、受信したデータから、送信されたリクエストの識別子を送信パケット８２に登録する。
【００８３】
また、異常検出部３７ｃは、パケット受信部３７ｂからレスポンスを受信したことを示すデータを受信すると、受信したデータから、受信したレスポンスに対応するリクエストに含まれるアクセス対象のメモリの物理アドレスをＰＡ８３から削除する。また、異常検出部３７ｃは、パケット受信部３７ｂからレスポンスを受信したことを示すデータを受信すると、受信したデータから、受信したレスポンスに対応するリクエストをリクエスト８４から削除する。また、異常検出部３７ｃは、パケット受信部３７ｂからレスポンスを受信したことを示すデータを受信すると、受信したデータから、受信したレスポンスに対応するリクエストの識別子を送信パケット８２から削除する。図８は、送信パケットの一例を示す図である。例えば、レスポンスが返ってきていないリクエストの数がＮ個である場合には、図８の例に示す送信パケット８２には、パケット１管理用エントリからパケットＮ管理用エントリまでの各エントリに、Ｎ個のリクエストの識別子のそれぞれが登録される。
【００８４】
また、ポインタ８０は、送信パケット８２に登録された各識別子が示す各リクエストのうち、送信時刻が最も古いリクエストを指す。例えば、図８の例では、ポインタ８０は、パケット１管理用エントリに登録された識別子が示すリクエストを指す。
【００８５】
検出部８５は、タイマ８１の時間が、所定時間を経過したか否かを判定する。所定時間を経過した場合には、検出部８５は、ポインタ８０が指すリクエストに対応するレスポンスを所定時間以内に受信していないため、ノード２０と、アクセス対象のメモリを有するノードとの間でデータ転送の異常が発生したことを検出する。そして、検出部８５は、ポインタ８０が指すリクエストに含まれるアクセス対象のメモリの物理アドレスをＰＡ８３から取得し、取得した物理アドレスを、エラー発生アドレスレジスタ９６に書き込む。
【００８６】
トラップ発生部９７は、エラー発生アドレスレジスタ９６に物理アドレスが書き込まれると、トラップを発生する。なお、リクエスト/オーダが「データのメモリへのストア（格納）」、または「キャッシュのリプレイスによるライトバック」の場合はトラップを発生させず、上述した異常を示すデータの書き込みのみ行い、データのＣＰＵへのロード時に異常を検出することとしても良い。ここで、上述した「異常を示すデータの書き込み」とは、異常と、原因とを示す４ビット以下の値をディレクトリ３６ａの「ＵＥ」の項目に書き込むことや、メモリ２２の共有メモリの領域に、エラー状態を示すデータを書き込むことを指す。
【００８７】
このように、異常検出部３７ｃでは、１つのタイマで時間を計測するので、リクエストごとにタイマを設ける場合と比較して、レスポンスが返ってきていないリクエストの数が複数の場合には、少ない数のタイマで時間を計測することができる。
【００８８】
なお、異常検出部３７ｃの構成は、上述した構成に限られない。例えば、異常検出部３７ｃの送信パケット８２には、リクエストの識別子に加えて、リクエストの送信時刻の差（インターバル）を登録し、タイマ８１がインターバルを加味して再起動を行うようにしてもよい。
【００８９】
図９は、異常検出部の他の構成の一例を示す図である。図９の例では、送信パケット８２に、上述したパケットＫ（Ｋは自然数）管理用エントリに加え、あるリクエストが送信されてから、他のリクエストが送信されるまでの時間が登録される。ここで、リクエスト１が送信されてから１００ｎｓ後に、リクエスト２が送信され、リクエスト１が送信されてから３００ｎｓ後に、リクエスト３が送信された場合について説明する。この場合、リクエスト１〜３のそれぞれの識別子が、パケット１管理用エントリ〜パケット３管理用エントリに登録される。このとき、リクエスト１を基準とすると、インターバル１には０ｎｓ、インターバル２には、１００ｎｓ、インターバル３には、３００ｎｓが登録される。ここで、リクエスト１に対応するレスポンスをパケット受信部３７ｂが受信したため、ポインタ８０が指すリクエストがリクエスト１からリクエスト２に切り替わったとする。このとき、タイマ８１は、再起動するが、時間の初期値が０ｎｓではなく、リクエスト２に対応するインターバル１００ｎｓから時間の計測を開始する。また、ポインタ８０が指すリクエストがリクエスト２からリクエスト３に切り替わった場合には、同様に、タイマ８１は、リクエスト３に対応するインターバル３００ｎｓから時間の計測を開始する。なお、すべての送出済みリクエストに対してレスポンスを受信した場合は、次に送出するリクエストのインターバルは再び０ｎｓとなる。
【００９０】
このように、他の例の異常検出部３７ｃでは、１つのタイマ８１で時間を計測するので、より少ない数のタイマで精度良く時間を計測することができる。また、他の例の異常検出部３７ｃでは、タイマ８１が、リクエストごとにインターバルを考慮して時間を計測するので、より精度の高い時間を計測することができる。
【００９１】
なお、異常検出部３７ｃでは、ポインタ８０を設けず、リクエストごとにタイマを設けて、各タイマが、リクエストの送信されてからの時間を計測することもできる。
【００９２】
ルータ４０は、パケット制御部３７が有するパケット生成部３７ａが出力したパケットを受信した場合には、受信したリクエストをＸＢ接続部２７に出力する。また、ルータ４０は、ＸＢ接続部２７を介して、他のＣＰＵが送信したパケットやデータをパケット受信部３７ｂに出力する。また、ルータ４０は、パケット制御部３７がＩ／Ｏ装置等に対して出力したパケットをＰＣＩｅ制御部４２に出力する。また、ルータ４０は、Ｉ／Ｏ装置からのリクエスト等をＰＣＩｅ制御部４２から受信した場合には、受信したリクエスト等をパケット制御部３７に出力する。また、ルータ４０は、Ｉ／Ｏ装置からのリクエストをＰＣＩｅ制御部４２から受信した場合には、受信したリクエストをＸＢ接続部２７に出力する。また、ルータ４０は、ＸＢ接続部２７を介して、Ｉ／Ｏ装置へのレスポンスを受信した場合には、受信したレスポンスをＰＣＩｅ制御部４２ｂに出力する。
【００９３】
メモリアクセス部４１は、いわゆるＭＡＣ（Memory  Access  Controller）であり、メモリ２２に対するアクセスの制御を行う。例えば、メモリアクセス部４１は、キャッシュディレクトリ管理部３６から物理アドレスを受信した場合には、受信した物理アドレスが示すメモリ２２の領域に格納されたデータを取得し、取得したデータをキャッシュディレクトリ管理部３６に出力する。なお、メモリアクセス部４１は、メモリーミラー機能を用いて、共有領域を冗長化してもよい。
【００９４】
リクエスト生成部４２ａは、ルータ４０を介してＩ／Ｏ装置に対するアクセス要求を取得した場合には、アクセス要求の対象となるＩ／Ｏ装置に送信するリクエストを生成し、生成したリクエストをＰＣＩｅバス制御部４２ｂに出力する。また、リクエスト生成部４２ａは、Ｉ／Ｏ装置から物理アドレスと、ＣＰＵＩＤとを取得した場合には、取得した物理アドレスと、ＣＰＵＩＤとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。かかるリクエストの種類としては、Ｉ／Ｏ装置が他のＣＰＵに接続されたメモリをリードするためのリクエストが挙げられる。また、リクエスト生成部４２ａは、Ｉ／Ｏ装置から物理アドレスと、ＣＰＵＩＤと、書き込みデータとを取得した場合には、取得した物理アドレスと、ＣＰＵＩＤと、書き込みデータとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。かかるリクエストの種類としては、Ｉ／Ｏ装置が他のＣＰＵに接続されたメモリにデータをライトするためのリクエストが挙げられる。そして、リクエスト生成部４２ａは、生成したパケットをルータ４０に送信する。
【００９５】
また、リクエスト生成部４２ａは、エラー発生アドレスレジスタ９８、トラップ発生部９９を有する。
【００９６】
ＰＣＩｅバス制御部４２ｂは、リクエスト生成部４２ａが生成したリクエストを取得した場合には、ＰＣＩｅ接続部２８を介して、Ｉ／Ｏ装置にリクエストを送信する。また、ＰＣＩｅバス制御部４２ｂは、ＰＣＩｅ接続部２８を介して、Ｉ／Ｏ装置から物理アドレスと、ＣＰＵＩＤとを取得した場合には、リクエスト生成部４２ａに、取得した物理アドレスと、ＣＰＵＩＤとを送信する。また、ＰＣＩｅバス制御部４２ｂは、ＰＣＩｅ接続部２８を介して、Ｉ／Ｏ装置から物理アドレスと、ＣＰＵＩＤと、書き込みデータとを取得した場合には、リクエスト生成部４２ａに、取得した物理アドレスと、ＣＰＵＩＤと、書き込みデータとを送信する。
【００９７】
また、ＰＣＩｅバス制御部４２ｂは、Ｉ／Ｏ装置が他のＣＰＵに接続されたメモリをリードするためのリクエストに対応するレスポンスが、リクエストが送信されてから所定時間以内に受信しないため、異常が検出された場合には、次のような処理を行う。すなわち、ＰＣＩｅバス制御部４２ｂは、「ｐｏｉｓｏｎｅｄ  ＴＬＰ」パケットをＰＣＩｅ接続部２８に送信する。この場合、ＰＣＩｅ接続部２８は、「ｐｏｉｓｏｎｅｄ  ＴＬＰ」パケットを受信すると、受信した「ｐｏｉｓｏｎｅｄ  ＴＬＰ」パケットをＩ／Ｏ装置へ送信する。これにより、Ｉ／Ｏ装置では、異常が発生していることを検出することができる。また、ＰＣＩｅ接続部２８は、異常が発生していることを検出すると、デバイスドライバソフトに異常が発生したことを通知するので、リカバリ処理が行われる。リカバリ処理の一例としては、ＬＡＮに異常が発生した場合には、処理中の送受信データを一旦破棄し、ＬＡＮチップの状態を初期化し、初期化後は、通常通りにデータの送受信を行う処理が挙げられる。
【００９８】
図１０を参照して、「ｐｏｉｓｏｎｅｄ  ＴＬＰ」について説明する。図１０は、「ＴＬＰ  ｈｅａｄｅｒ」のデータ構成の一例を示す図である。「ｐｏｉｓｏｎｅｄ  ＴＬＰ」とは、「ＰＣＩ  ｅｘｐｒｅｓｓ」の仕様によって規定されているパケットである。図１０の例に示す「ＴＬＰ  ｈｅａｄｅｒ」のＥＰビットがオンである場合に、「ｐｏｉｓｏｎｅｄ  ＴＬＰ」であると認識される。
【００９９】
図１１は、「ｐｏｉｓｏｎｅｄ  ＴＬＰ」パケットを受信したＰＣＩｅ制御部の動作の具体例を説明するための図である。図１１の例は、ＰＣＩｅ制御部４２が「Ｒｏｏｔ  Ｃｏｍｐｌｅｘ」に対応し、ＰＣＩｅ接続部２８が「ＰＣＩ  ｅｘｐｒｅｓｓ」カードに対応する場合のデバイスドライバの階層構造を示す。この一例では、「ＰＣＩ  ｅｘｐｒｅｓｓ」カードとしてＳＡＳの「ＰＣＩ  ｅｘｐｒｅｓｓ」カードが搭載されている場合を示している。「ＰＣＩ  ｅｘｐｒｅｓｓ」のバス上の「ｐｏｉｓｏｎｅｄ  ＴＬＰ」の発生などのイベントの検出やバス上での対処は、「ＰＣＩ  ｅｘｐｒｅｓｓ」カードの種別に関わらず共通である。そのため、かかるイベントの検出やバス上での対処は、ＳＡＳデバイスドライバなどの個別のデバイスドライバでは行われず、「Ｒｏｏｔ  Ｃｏｍｐｌｅｘ」ドライバで行われる。
【０１００】
一方、バスで何らかのイベント、例えば、エラー系のイベントが発生した場合、エラーが発生したバス上で動作していたＳＡＳデバイスドライバ側で、ＳＡＳデバイスドライバ固有の回復処理が行われる場合が多い。ここで、ＳＡＳデバイスドライバ固有の回復処理の一例としては、処理中の送信処理の終了処理またはリトライなどが挙げられる。「ｐｏｉｓｏｎｅｄ  ＴＬＰ」が発生した場合、「Ｒｏｏｔ  Ｃｏｍｐｌｅｘ」ドライバは、エラー事象の刈り取り（詳細情報のリード、ステータスビットのクリアなど）を行った後に、バス上のＳＡＳデバイスドライバにエラーの発生を通知する。この通知により、ＳＡＳデバイスドライバは、ＳＡＳデバイスドライバ固有のリカバリ処理を開始する。なお、ＳＡＳデバイスドライバにエラーの発生を通知せず、Ｉ／Ｏ装置を使用しているアプリケーションプロセスにエラーの発生を通知し、アプリケーションプロセスからＩ／Ｏ装置の再起動処理を行うようにしてもよい。
【０１０１】
また、ＰＣＩｅバス制御部４２ｂは、Ｉ／Ｏ装置が他のＣＰＵに接続されたメモリにデータをライトするためのリクエストに対応するレスポンスが、リクエストが送信されてから所定時間以内に受信しないため、異常が検出された場合には、次のような処理を行う。すなわち、ＰＣＩｅバス制御部４２ｂは異常検出後、異常にかかわるＰＣＩｅ接続部２８から受信する「メモリにデータをライトするためのリクエスト」を廃棄する。そして、後述するように、エラー発生アドレスレジスタ９８にエラー発生アドレスを設定し、トラップ発生部９７を使用してトラップを発生させる。このトラップによりデバイスドライバソフトに異常が発生したことが通知されるので、リカバリ処理が行われる。リカバリ処理の一例としては、ＬＡＮに異常が発生した場合には、処理中の送受信データを一旦破棄し、ＬＡＮチップの状態を初期化し、初期化後は、通常通りにデータの送受信を行う処理が挙げられる。
【０１０２】
異常検出部４２ｃは、ポインタ９０と、タイマ９１と、送信パケット９２と、ＰＡ９３と、リクエスト９４と、検出部９５とを有する。ポインタ９０、タイマ９１、送信パケット９２、ＰＡ９３、リクエスト９４、検出部９５のそれぞれは、上記で説明したポインタ８０、タイマ８１、送信パケット８２、ＰＡ８３、リクエスト８４、検出部８５と同様である。また、エラー発生アドレスレジスタ９８、トラップ発生部９９は、上記で説明したエラー発生アドレスレジスタ９６、トラップ発生部９７と同様である。すなわち、異常検出部３７ｃは、パケット制御部３７によってリクエストが送信されてからレスポンスを受信する前に所定時間が経過した場合に、ノード間のデータ転送の異常を検出する。異常検出部４２ｃは、上記の異常検出部３７ｃと同様に、リクエスト生成部４２ａからルータ４０を介して、他のＣＰＵへ送信されるリードのリクエスト、ライトのリクエストについて、ノード間のデータ転送の異常を検出する。そして、異常を検出した場合には、上記の異常検出部３７ｃの検出部８５と同様に、検出部９５は、ポインタ９０が指すリクエストに含まれるアクセス対象のメモリの物理アドレスをＰＡ９３から取得し、取得した物理アドレスを、エラー発生アドレスレジスタ９８に書き込む。
【０１０３】
トラップ発生部９９は、エラー発生アドレスレジスタ９８に物理アドレスが書き込まれると、トラップを発生する。
【０１０４】
次に、図１２を用いて、ＣＰＵ２１が他のＣＰＵに対してリクエストを送信する処理の一例について説明する。図１２は、実施例１に係るＣＰＵがリクエストを送信する処理の一例を説明するための図である。例えば、図１２中（Ａ）に示すように、サービスプロセッサ２４からノードマップ３４に対して、物理アドレスが振り分けられるメモリにアクセスするＣＰＵのＣＰＵＩＤと物理アドレスとを対応付けたエントリの設定が行われる。
【０１０５】
また、演算部３１は、演算処理を実行し、図１２中（Ｂ）に示すように、アクセス対象となる論理アドレスをアドレス変換部３５に出力する。すると、アドレス変換部３５は、論理アドレスを物理アドレスに変換し、変換した物理アドレスを図１２中（Ｃ）に示すように、キャッシュディレクトリ管理部３６に出力する。
【０１０６】
ここで、キャッシュディレクトリ管理部３６は、アドレス変換部３５から物理アドレスを取得すると、図１２中（Ｄ）に示すように、ノードマップ３４を参照し、取得した物理アドレスと対応付けられたＣＰＵＩＤを取得する。そして、キャッシュディレクトリ管理部３６は、取得したＣＰＵＩＤがＣＰＵ２１のＣＰＵＩＤではない場合には、図１２中（Ｅ）に示すように、取得したＣＰＵＩＤと物理アドレスとをパケット制御部３７に出力する。
【０１０７】
このような場合には、パケット生成部３７ａは、キャッシュディレクトリ管理部３６から取得した物理アドレスとＣＰＵＩＤとを格納したパケットを生成し、図１２中（Ｆ）に示すように、生成したパケットをルータ４０に出力する。また、パケット生成部３７ａは、図１２中（Ｇ）に示すように、リクエストであるパケットを送信したことを示すデータを異常検出部３７ｃに出力する。続いて、図１２中（Ｈ）に示すように、ルータ４０は、パケット生成部３７ａから取得したパケットをＸＢ接続部２７に出力する。その後、図１２中（Ｉ）に示すように、ＸＢ接続部２７は、取得したパケットをＸＢ２に出力する。すると、ＸＢ２は、パケットに格納されたＣＰＵＩＤが示すＣＰＵへパケットを伝達することとなる。
【０１０８】
次に、図１３を用いて、ＣＰＵ２１が他のＣＰＵからパケットを受信した際に実行する処理の一例について説明する。図１３は、実施例１に係るＣＰＵがパケットを受信した際に実行する処理の一例を説明するための図である。例えば、図１３中（Ｊ）に示すようにパケット受信部３７ｂは、他のＣＰＵからＣＰＵ２１のＣＰＵＩＤとメモリ２２に振り分けられた物理アドレスとが格納されたパケットや、レスポンスのパケットを受信する。
【０１０９】
このような場合には、パケット受信部３７ｂは、受信したパケットが、レスポンスのパケットである場合には、図１３中（Ｋ）に示すように、レスポンスであるパケットを受信したことを示すデータを異常検出部３７ｃに出力する。そして、パケット受信部３７ｂは、受信したパケットから物理アドレスを取得し、図１３中（Ｌ）に示すように、取得した物理アドレスをキャッシュディレクトリ管理部３６に出力する。すると、キャッシュディレクトリ管理部３６は、物理アドレスが示す記憶領域が、共有領域であるかローカル領域であるかを判別する。
【０１１０】
そして、共有領域に対するアクセスである場合には、キャッシュディレクトリ管理部３６は、図１３中（Ｍ）に示すように、物理アドレスが示す記憶領域のデータがＬ１キャッシュ３２およびＬ２キャッシュ３３にキャッシュされているか判別する。
【０１１１】
また、キャッシュディレクトリ管理部３６は、データがキャッシュされていないと判別した場合には、図１３中（Ｎ）に示すように、物理アドレスをメモリアクセス部４１に出力する。すると、図１３中（Ｏ）に示すように、メモリアクセス部４１は、メモリ２２から物理アドレスが示す記憶領域のデータを取得し、キャッシュディレクトリ管理部３６に出力する。
【０１１２】
そして、キャッシュディレクトリ管理部３６は、Ｌ１キャッシュ３２、Ｌ２キャッシュ３３、またはメモリアクセス部４１からデータを取得した場合には、取得したデータをパケット制御部３７に出力し、リクエスト元のＣＰＵに送信するよう指示する。
【０１１３】
次に、図１４を用いて、Ｉ／Ｏ装置がＣＰＵ２１以外のＣＰＵに対してリードやライトのリクエストを送信する処理の一例について説明する。図１４は、実施例１に係るＩ／Ｏ装置がリクエストを送信する処理の一例を説明するための図である。例えば、ＰＣＩｅ接続部２８は、Ｉ／Ｏ装置から物理アドレスと、ＣＰＵＩＤとを取得すると、図１４中（Ｐ）に示すように、取得した物理アドレスと、ＣＰＵＩＤとをＰＣＩｅバス制御部４２ｂに出力する。また、ＰＣＩｅ接続部２８は、Ｉ／Ｏ装置から物理アドレスと、ＣＰＵＩＤと、書き込みデータとを取得すると、図１４中（Ｐ）に示すように、取得した物理アドレスと、ＣＰＵＩＤと、書き込みデータとをＰＣＩｅバス制御部４２ｂに出力する。
【０１１４】
そして、ＰＣＩｅバス制御部４２ｂは、ＰＣＩｅ接続部２８から物理アドレスと、ＣＰＵＩＤとを取得すると、図１４中（Ｑ）に示すように、取得した物理アドレスと、ＣＰＵＩＤとをリクエスト生成部４２ａに出力する。また、ＰＣＩｅバス制御部４２ｂは、ＰＣＩｅ接続部２８から物理アドレスと、ＣＰＵＩＤと、書き込みデータとを取得すると、図１４中（Ｑ）に示すように、取得した物理アドレスと、ＣＰＵＩＤと、書き込みデータとをリクエスト生成部４２ａに送信する。
【０１１５】
リクエスト生成部４２ａは、ＰＣＩｅバス制御部４２ｂから物理アドレスと、ＣＰＵＩＤとを取得すると、取得した物理アドレスと、ＣＰＵＩＤとを含むリードのリクエストとなるパケットを生成する。また、リクエスト生成部４２ａは、ＰＣＩｅバス制御部４２ｂから物理アドレスと、ＣＰＵＩＤと、書き込みデータとを取得すると、取得した物理アドレスと、ＣＰＵＩＤと、書き込みデータとを含むライトのリクエストとなるパケットを生成する。そして、リクエスト生成部４２ａは、図１４中（Ｒ）に示すように、生成したパケットをルータ４０に出力する。
【０１１６】
また、リクエスト生成部４２ａは、図１４中（Ｓ）に示すように、リードのリクエスト、ライトのリクエストを送信したことを示すデータを異常検出部４２ｃに出力する。続いて、図１４中（Ｔ）に示すように、ルータ４０は、リクエスト生成部４２ａから取得したリクエストをＸＢ接続部２７に出力する。その後、図１４中（Ｕ）に示すように、ＸＢ接続部２７は、取得したリクエストをＸＢ２に出力する。すると、ＸＢ２は、リクエストに格納されたＣＰＵＩＤが示すＣＰＵへパケットを伝達することとなる。
【０１１７】
次に、図１５を用いて、Ｉ／Ｏ装置がＣＰＵ２１以外のＣＰＵからレスポンスを受信する処理の一例について説明する。図１５は、実施例１に係るＩ／Ｏ装置がレスポンスを受信する処理の一例を説明するための図である。例えば、図１５中（Ｖ）に示すようにＸＢ接続部２７は、ＣＰＵ２１以外のＣＰＵからＩ／Ｏ装置へのレスポンスを受信する。
【０１１８】
ＸＢ接続部２７は、レスポンスを受信すると、図１５中（Ｗ）に示すように、受信したレスポンスをルータ４０に出力する。ルータ４０は、レスポンスを受信すると、図１５中（Ｘ）に示すように、受信したレスポンスをリクエスト生成部４２ａに出力する。リクエスト生成部４２ａは、レスポンスを受信すると、レスポンスを受信したことを示すデータを異常検出部４２ｃに出力する。また、リクエスト生成部４２ａは、図１５中（Ｚ）に示すように、レスポンスをＰＣＩｅバス制御部４２ｂに出力する。ＰＣＩｅバス制御部４２ｂは、レスポンスを受信すると、図１５中（ＡＡ）に示すように、受信したレスポンスをＰＣＩｅ接続部２８に出力する。これにより、ＰＣＩｅ接続部２８からＩ／Ｏ装置へレスポンスが送信される。
【０１１９】
次に、図１６、図１７を用いて、ノード２０と、ノード２０のアクセス対象のメモリを有するノードとの間でデータ転送の異常が発生した際に実行される処理の一例について説明する。図１６は、ノードと、当該ノードのアクセス対象のメモリを有するノードとの間でデータ転送の異常が発生した際に実行される処理の一例を説明するための図である。例えば、異常検出部３７ｃは、タイマ８１の時間が、所定時間を経過したか否かを判定する。所定時間を経過した場合には、異常検出部３７ｃは、ポインタ８０が指すリクエストに対応するレスポンスを所定時間以内に受信していないため、ノード２０と、アクセス対象のメモリを有するノードとの間でデータ転送の異常が発生したことを検出する。そして、異常検出部３７ｃは、ポインタ８０が指すリクエストに含まれるアクセス対象のメモリの物理アドレスをＰＡ８３から取得し、図１６中（ＡＢ）に示すように、取得した物理アドレスを、エラー発生アドレスレジスタ９６に書き込む。エラー発生アドレスレジスタ９６に物理アドレスが書き込まれると、図１６中（ＡＣ）に示すように、トラップ発生部９６は、トラップを発生する。
【０１２０】
図１７は、ノードと、当該ノードのアクセス対象のメモリを有するノードとの間でデータ転送の異常が発生した際に実行される処理の一例を説明するための図である。例えば、異常検出部４２ｃは、タイマ９１の時間が、所定時間を経過したか否かを判定する。所定時間を経過した場合には、異常検出部４２ｃは、ポインタ９０が指すリクエストに対応するレスポンスを所定時間以内に受信していないため、ノード２０と、アクセス対象のメモリを有するノードとの間でデータ転送の異常が発生したことを検出する。そして、異常検出部４２ｃは、ポインタ９０が指すリクエストに含まれるアクセス対象のメモリの物理アドレスをＰＡ９３から取得し、図１７中（ＡＤ）に示すように、取得した物理アドレスを、エラー発生アドレスレジスタ９８に書き込む。エラー発生アドレスレジスタ９８に物理アドレスが書き込まれると、図１７中（ＡＥ）に示すように、トラップ発生部９８は、トラップを発生する。
【０１２１】
通信部２３、サービスプロセッサ２４、ＸＢ接続部２７、ＸＢ接続部２７ａ、ＰＣＩｅ接続部２８は、電子回路である。ここで、電子回路の例として、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）などの集積回路、またはＣＰＵやＭＰＵ（Micro  Processing  Unit）などを適用することができる。また、ＣＰＵ２１〜２１ｃに代えて、ＡＳＩＣやＦＰＧＡなどの集積回路、またはＭＰＵなどを適用することができる。
【０１２２】
また、メモリ２２〜２２ａは、ＲＡＭ（Random  Access  Memory）、ＲＯＭ（Read  Only  Memory）、フラッシュメモリ  （flash  memory）などの半導体メモリ素子である。また、Ｌ１キャッシュ３２、Ｌ２キャッシュ３３は、ＳＲＡＭ（Static  Random  Access  Memory）等の高速な半導体メモリ素子である。
【０１２３】
次に、各ＣＰＵ２１〜２１ｃがキャッシュコヒーレンスを保持する処理について説明する。なお、以下の説明においては、情報処理システム１の各ＣＰＵはイリノイプロトコルを用いて、キャシュコヒーレンスを保持するものとする。
【０１２４】
また、以下の説明においては、情報処理システム１が有する各メモリは、全てのＣＰＵからキャッシュ可能な空間を有するメモリとして識別されるものとする。また、以下の説明においては、キャッシュ対象となるデータを記憶するメモリに、そのＣＰＵ内のＭＡＣを介して物理的に直接接続されているＣＰＵをホームＣＰＵとし、キャッシュを要求したＣＰＵをローカルＣＰＵと記載する。
【０１２５】
また、ホームＣＰＵに対して既にリクエストを送信し、データをキャッシュ済みであるＣＰＵをリモートＣＰＵと記載する。なお、ローカルＣＰＵとホームＣＰＵとが同一のＣＰＵとなる場合や、ローカルＣＰＵとリモートＣＰＵとが同一のＣＰＵとなる場合もある。
【０１２６】
ローカルＣＰＵは、自身のノードマップを参照し、アクセス対象となる物理アドレスがホームＣＰＵがアクセスするメモリに振り分けられていると判定する。そして、ローカルＣＰＵは、物理アドレスを格納したリクエストをホームＣＰＵに対して発行する。なお、ローカルＣＰＵが発行するリクエストには、複数の種別のリクエストが存在する。このため、ホームＣＰＵが有するキャッシュディレクトリ管理部は、取得したリクエストの種別に応じたキャッシュコヒーレンス制御を実行することとなる。
【０１２７】
例えば、ローカルＣＰＵが発行するリクエストの種別としては、共有型フェッチアクセス、排他型フェッチアクセス、キャッシュ無効化要求、キャッシュリプレース要求等がある。共有型フェッチアクセスとは、例えば、「ＭｏｖｅＩｎ  ｔｏ  Ｓｈａｒｅ」の実行要求であり、ホームＣＰＵがアクセスするメモリからデータの読出しを行う際に発行されるリクエストである。
【０１２８】
また、排他型フェッチアクセスとは、例えば、「ＭｏｖｅＩｎ  Ｅｘｃｌｕｓｉｖｅｌｙ」の実行要求であり、ホームＣＰＵがアクセスするメモリへデータストアを行う際の、キャッシュへのデータロードを行う際に発行される。また、キャッシュ無効化要求とは、例えば、「ＭｏｖｅＯｕｔ」の実行要求であり、キャッシュラインの無効化をホームＣＰＵに対して要求する際に発行される。なお、ホームＣＰＵは、キャッシュ無効化要求を受信すると、リモートＣＰＵに対してキャッシュ無効化要求を発行する場合や、キャッシュを「Ｉｎｖａｌｉｄａｔｉｏｎ」とさせるオーダーを発行する場合がある。
【０１２９】
キャッシュリプレース要求とは、例えば、「ＷｒｉｔｅＢａｃｋ」の実行要求であり、更新されたキャッシュデータ、すなわち「Ｍｏｄｉｆｉｅｄ」状態のキャッシュデータをホームＣＰＵがアクセスするメモリに書き戻す際に発行される。なお、キャッシュリプレース要求には、例えば、「ＦｌｕｓｈＢａｃｋ」の実行要求であり、更新されていないキャッシュデータ、すなわち、「Ｓｈａｒｅｄ」又は「Ｅｘｃｌｕｓｉｖｅ」状態のキャッシュの破棄を行う際に発行される。
【０１３０】
ホームＣＰＵは、上述したリクエストをローカルＣＰＵや、リモートＣＰＵから受信した場合には、リクエストを処理するために、ローカルＣＰＵやリモートＣＰＵに対して、オーダーを発行する。ここで、ホームＣＰＵは、取得したリクエストの種別に応じたキャッシュコヒーレンス制御を実行するため、複数の種別のオーダーを発行することとなる。例えば、ホームＣＰＵは、リモートＣＰＵがキャッシュしているデータをローカルＣＰＵにロードさせる「ＭｏｖｅＯｕｔ  ａｎｄ  Ｂｙｐａｓｓ  ｔｏ  Ｓｈａｒｅ」を発行する。
【０１３１】
また、例えば、ホームＣＰＵは、ローカルＣＰＵ以外のすべてのリモートＣＰＵのキャッシュを無効化し、その後、ホームＣＰＵがローカルＣＰＵにデータを送信するための「ＭｏｖｅＯｕｔ  ａｎｄ  Ｂｙｐａｓｓ  Ｅｘｃｌｕｓｉｖｅｌｙ」を発行する。また、ホームＣＰＵは、リモートＣＰＵにキャッシュの無効化を要求する「ＭｏｖｅＯｕｔ  ＷＩＴＨ  Ｉｎｖａｌｉｄａｔｉｏｎ」を発行する。なお、ホームＣＰＵが「ＭｏｖｅＯｕｔ  ＷＩＴＨ  Ｉｎｖａｌｉｄａｔｉｏｎ」を発行した場合には、全てのＣＰＵのキャッシュが、対象となるアドレスについて「Ｉｎｖａｌｉｄａｔｅ」状態となる。なお、トランザクション完了時にはローカルＣＰＵがデータをキャッシュする。
【０１３２】
また、ホームＣＰＵは、リモートＣＰＵにキャッシュラインの無効化を要求する「ＭｏｖｅＯｕｔ  ｆｏｒ  Ｆｌｕｓｈ」を発行する。なお、ホームＣＰＵが「ＭｏｖｅＯｕｔ  ｆｏｒ  Ｆｌｕｓｈ」を発行した場合には、対象となるデータは、ホームＣＰＵのメモリにのみ記憶される。また、ホームＣＰＵは、対象となるデータの状態が「Ｓｈａｒｅｄ」であるときに、リモートＣＰＵにキャッシュの破棄を要求する「Ｂｕｆｆｅｒ  Ｉｎｖａｌｉｄａｔｉｏｎ」を発行する。
【０１３３】
ホームＣＰＵは、リクエストの種別に応じて、上述したオーダーを発行し、各ＣＰＵがキャッシュしたデータのステートを遷移させる。また、ローカルＣＰＵやリモートＣＰＵは、オーダーを受信した場合には、オーダーが示す処理を実行し、自身がキャッシュしたデータのステートを遷移させる。
【０１３４】
その後、ローカルＣＰＵやリモートＣＰＵは、オーダーに対する完了応答やデータ付の完了応答をホームＣＰＵに送信する。また、ホームＣＰＵやリモートＣＰＵは、オーダー処理を実行した後に、ローカルＣＰＵに対して、データ付のリクエスト応答を送信することとなる。
【０１３５】
［処理の流れ］
次に、図１８を用いて、情報処理システム１が共有領域を制御する処理の流れについて説明する。図１８は、共有領域を制御する処理の流れを説明するためのフローチャートである。まず、情報処理システム１は、アプリケーションの要求に応じて、ノード間の共有メモリの割当処理を実行する（ステップＳ１０１）。次に、情報処理システム１は、ノード間で共有する共有メモリのアタッチ処理を実行する（ステップＳ１０２）。
【０１３６】
その後、情報処理システム１が有する各ＣＰＵによって実行されるアプリケーションが各メモリを使用する（ステップＳ１０３）。次に、情報処理システム１は、共有メモリのデタッチ処理を実行する（ステップＳ１０４）。その後、情報処理システム１は、共有メモリの解放処理を実行し（ステップＳ１０５）、処理を終了する。なお、ステップＳ１０１、およびステップＳ１０５は、その共有メモリのホームノード上のアプリケーションのみが実施するものとしても良いし、実際の処理はｎｏｐとなるものの、その共有メモリのホームノード以外のノード上のアプリケーションも実施するものとしても良い。
【０１３７】
次に、図１９を用いて、図１８中ステップＳ１０１で示した共有メモリの割当処理を実行する処理の流れについて説明する。図１９は、共有メモリの割当処理を説明するためのフローチャートである。図１９に示す例では、例えば、ＣＰＵ２１が実行するアプリケーションがＯＳに対して、ノード間の共有メモリ割当処理の実行を要求する（ステップＳ２０１）。
【０１３８】
すると、ＣＰＵ２１が実行するＯＳが共有領域用の物理アドレスの領域から要求されたサイズのメモリ割当を行う（ステップＳ２０２）。次に、ＯＳが割り当てた共有メモリの管理用ＩＤをアプリケーションに引渡し（ステップＳ２０３）、共有メモリの割当処理を終了する。
【０１３９】
次に、図２０を用いて、図１８中ステップＳ１０２で示したノード間の共有メモリアタッチ処理の流れについて説明する。図２０は、共有メモリアタッチ処理を説明するためのフローチャートである。まず、アプリケーションは、ＯＳに対して管理用ＩＤを引渡し、ノード間の共有メモリのアタッチ処理を要求する（ステップＳ３０１）。このような場合には、ＯＳは、他のノードで実行されているＯＳと通信を行い、管理用ＩＤに対応する物理アドレスを獲得する（ステップＳ３０２）。
【０１４０】
ここで、ＯＳが他のノードで実行されているＯＳと通信を行う場合には、ＬＡＮなどによる通信、サービスプロセッサ２４を介した各ノード間の通信等を用いる。また、各ノードで実行されるＯＳは、特定の共有領域を、ノード間通信に用いる領域として設定し、設定した領域に対する情報の格納や読み取りを行う事で、通信を行うこととしても良い。
【０１４１】
次に、ＯＳは、物理アドレスに対応する論理アドレスを決定し、割当を行う（ステップＳ３０３）。例えば、ＣＰＵ２１で実行されるＯＳは、物理アドレスと論理アドレスとのＴＬＢ３５ａをアドレス変換部３５に設定する。
【０１４２】
なお、各ＣＰＵ２１〜２１ｃが用いる論理アドレスは、重複する範囲であっても良く、また、ＣＰＵごとに異なる範囲でもよい。また、各ＣＰＵ２１〜２１ｃが用いる論理アドレスは、アプリケーションがＯＳに指定できるようにしてもよい。その後、ＯＳは、論理アドレスの値をアプリケーションに引渡し（ステップＳ３０４）、処理を終了する。
【０１４３】
次に、図２１を用いて、図１８中ステップＳ１０３で示したアプリケーションがノード間の共有メモリを使用する処理の流れについて説明する。図２１は、アプリケーションが共有メモリを使用する処理を説明するためのフローチャートである。例えば、ＣＰＵ２１が実行するアプリケーションは、論理アドレスを発行し、論理アドレスが示す記憶領域へのアクセスを行う（ステップＳ４０１）。
【０１４４】
すると、ＣＰＵ２１は、ＴＬＢミスが発生したか否かを判別する（ステップＳ４０２）。そして、ＣＰＵ２１は、ＴＬＢミスが発生した場合は（ステップＳ４０２肯定）、トラップ処理を実行し、ＴＬＢに論理アドレスと物理アドレスとの組のエントリを設定する（ステップＳ４０３）。
【０１４５】
次に、アプリケーションは、再度論理アドレスを発行し、ＴＬＢによる物理アドレスへの変換を経て、正常に共有メモリに対するアクセスを実行し（ステップＳ４０４）、処理を終了する。一方、ＴＬＢミスが発生しなかった場合は（ステップＳ４０２否定）、正常に共有メモリに対するアクセスが実行され（ステップＳ４０５）、処理を終了する。
【０１４６】
次に、図２２を用いて、図１８中ステップＳ１０４で示したノード間の共有メモリデタッチ処理の流れについて説明する。図２２は、ノード間の共有メモリデタッチ処理を説明するためのフローチャートである。例えば、ＣＰＵ２１が実行するアプリケーションは、ＯＳに対して、ノード間共有メモリの論理アドレス、または管理用ＩＤを指定して、デタッチ処理を要求する（ステップＳ５０１）。
【０１４７】
すると、ＣＰＵ２１が実行するＯＳは、キャッシュのフラッシュを行う（ステップＳ５０２）。すなわち、ＯＳは、共有メモリの割り当て解除後、再度共有メモリとして割当てを行った場合に、共有メモリとして割当てが行われていない際に共有メモリの実メモリにアクセスするＣＰＵがリブートすると、キャッシュと実メモリの状態が食い違う恐れがある。このため、ＯＳは、キャッシュのフラッシュを行い、キャッシュと実メモリの状態とが食い違う状態を防止する。
【０１４８】
そして、ＯＳは、ノード間共有メモリ、すなわち、アプリケーションが利用していた範囲の論理アドレスの割当を解除し、解除した論理アドレスに関連するＴＬＢ３５ａのエントリを削除する（ステップＳ５０３）。なお、これ以降、本ノード上で、デタッチが完了しているメモリアドレスについてＴＬＢミスが発生しても（ステップＳ４０２肯定）、ＯＳはデタッチが完了している論理アドレスに対応する物理アドレスをＴＬＢ３５ａに設定しない。よって、ステップＳ４０４は正常に終了せず、アクセスエラーとなる。デタッチ完了後、ステップＳ３０２と反対に、ＯＳがノード間で通信し、本アプリケーションがこの共有メモリのＰＡに対してアクセスを完了したことを通知する（ステップＳ５０４）。もし、この共有メモリがホームノード上で解放済みで、かつこのアプリケーションがこの共有メモリの最後の利用者であった場合、ホームノードに解放処理を依頼し（ステップＳ５０５）、処理を終了する。
【０１４９】
次に、図２３を用いて、図１８中ステップＳ１０５で示したノード間共有メモリの解放処理の流れについて説明する。図２３は、ノード間共有メモリの解放処理を説明するためのフローチャートである。例えば、ＣＰＵ２１が実行するアプリケーションは、ＯＳに対してノード間共有メモリの解放処理を要求する（ステップＳ６０１）。すると、ＯＳは、指定された共有領域の使用者がすべてデタッチしていた場合は、割当てを解放し（ステップＳ６０２）、処理を終了する。もしデタッチが完了していなければ、割り当ての解放処理は行わず、処理を完了する（実際の割り当ての完了処理はＳ５０５で行われる）。
【０１５０】
次に、図２４を用いて、ＣＰＵ２１が他のＣＰＵに対して、メモリアクセスのリクエストを送信する処理の流れについて説明する。図２４は、リクエストを発行する処理の流れを説明するためのフローチャートである。例えば、ＣＰＵ２１の演算部３１は、論理アドレスを発行する（ステップＳ７０１）。
【０１５１】
すると、アドレス変換部３５において、論理アドレスから物理アドレスへの変換が行われる（ステップＳ７０２）。次に、キャッシュディレクトリ管理部３６が、物理アドレスを取得し、キャッシュディレクトリ管理を実行する（ステップＳ７０３）。すなわち、キャッシュディレクトリ管理部３６は、取得した物理アドレスが示す記憶領域についてのキャッシュステートを遷移させる。
【０１５２】
次に、キャッシュディレクトリ管理部３６は、ノードマップ３４を参照し、取得した物理アドレスが他ノードのメモリに振り分けられた物理アドレスであるか否かを判定する（ステップＳ７０４）。そして、キャッシュディレクトリ管理部３６は、取得した物理アドレスが他ノードのメモリに振り分けられた物理アドレスではないと判定した場合には（ステップＳ７０４否定）、取得した物理アドレスを用いてメモリアクセスを実行する（ステップＳ７０５）。そして、処理を終了する。
【０１５３】
一方、キャッシュディレクトリ管理部３６は、取得した物理アドレスが他ノードのメモリに振り分けられた物理アドレスである場合には（ステップＳ７０４肯定）、ノードマップ３４から物理アドレスと対応付けられたＣＰＵＩＤを取得する（ステップＳ７０６）。そして、パケット送信部が、ＣＰＵＩＤと物理アドレスとを格納したパケット、すなわち、メモリアクセスのリクエストを生成し、ＸＢ２に送出し（ステップＳ７０７）、処理を終了する。
【０１５４】
次に、図２５を用いて、ＣＰＵ２１が他のＣＰＵからメモリアクセスのリクエストを受信した際に実行する処理の流れについて説明する。図２５は、リクエストを受信した際に実行する処理の流れを説明するためのフローチャートである。なお、図２５に示す例では、ＣＰＵ２１が、他のＣＰＵから「ＭｏｖｅＩｎ  ｔｏ  Ｓｈａｒｅ」や「ＭｏｖｅＩｎ  Ｅｘｃｌｕｓｉｖｅｌｙ」を受信した際に実行する処理の流れについて説明する。例えば、ＣＰＵ２１は、他のＣＰＵからＸＢ２を介してリクエストを受信する（ステップＳ８０１）。
【０１５５】
このような場合には、ＣＰＵ２１は、ノードマップ３４を用いて、リクエストの対象となる物理アドレスがローカル領域であるか否かを判定する（ステップＳ８０２）。そして、ＣＰＵ２１は、リクエストの対象となる物理アドレスがローカル領域である場合には（ステップＳ８０２肯定）、リクエスト元のＣＰＵに否定応答を返信し（ステップＳ８０３）、処理を終了する。
【０１５６】
また、ＣＰＵ２１は、リクエストの対象となる物理アドレスがローカル領域でない場合には（ステップＳ８０２否定）、コヒーレンスを保持するキャッシュディレクトリ管理を実行する（ステップＳ８０４）。また、ＣＰＵ２１は、物理アドレスが示す記憶領域のステータスを判定する（ステップＳ８０５）。
【０１５７】
そして、ＣＰＵ２１は、判定したステータスに応じたオーダーを他のＣＰＵに対して発行し（ステップＳ８０６）、ステータスを遷移させる（ステップＳ８０７）。その後、ＣＰＵ２１は、物理アドレスが示す記憶領域のデータをリクエスト元のＣＰＵに送信する応答を行い（ステップＳ８０８）、処理を終了する。
【０１５８】
次に、図２６を用いて、ＣＰＵ２１が応答を受信した際に実行する処理の流れについて説明する。図２６は、ＣＰＵが応答を受信した際に実行する処理の流れを説明するためのフローチャートである。例えば、ＣＰＵ２１は、応答を受信する（ステップＳ９０１）。このような場合には、ＣＰＵ２１は、応答の内容が正常な応答であるか否かを判定する（ステップＳ９０２）。
【０１５９】
そして、ＣＰＵ２１は、応答の内容が正常である場合、すなわち、リクエスト対象となるデータを受信した場合には（ステップＳ９０２肯定）、データを用いた正常な処理を実行し（ステップＳ９０３）、処理を終了する。一方、ＣＰＵ２１は、否定応答を受信した場合は（ステップＳ９０２否定）、否定応答の理由がアクセスエラーであるか否かを判定する（ステップＳ９０４）。
【０１６０】
そして、ＣＰＵ２１は、否定応答の理由がアクセスエラーではない場合には（ステップＳ９０４否定）、通常のエラー処理を実行し（ステップＳ９０５）、処理を終了する。一方、ＣＰＵ２１は、否定応答の理由がアクセスエラーではない場合には（ステップＳ９０４肯定）、エラーが発生した物理アドレスをエラーレジスタに設定して、トラップ処理を実行し（ステップＳ９０６）、処理を終了する。
【０１６１】
次に、図２７を用いて、ＣＰＵ２１がリクエストを送信する際に実行する処理の流れについて説明する。図２７は、ＣＰＵがリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。例えば、ＣＰＵ２１は、リクエストに含まれるアクセス先の物理アドレスをＰＡ８３に格納し、リクエストの種類をリクエスト８４に格納する（ステップＳ１００１）。そして、ＣＰＵ２１は、リクエストを他のノードのＣＰＵに送信する（ステップＳ１００２）。続いて、ＣＰＵ２１は、タイマ８１を起動させる（ステップＳ１００３）。
【０１６２】
その後、ＣＰＵ２１は、リクエストを送信してから所定時間経過する前、すなわち、タイムアウト前に、リクエストに対する応答を受信したか否かを判定する（ステップＳ１００４）。タイムアウト前に、応答を受信した場合（ステップＳ１００４肯定）には、ＣＰＵ２１は、タイマ８１を停止する（ステップＳ１００５）。そして、ＣＰＵ２１は、応答を処理し（ステップＳ１００６）、処理を終了する。
【０１６３】
一方、タイムアウト前に、リクエストに対する応答を受信していない場合（ステップＳ１００４否定）には、ＣＰＵ２１は、次のような処理を行う。すなわち、ＣＰＵ２１は、当該リクエストに対応するＰＡ８３に格納された物理アドレスを特定し、特定した物理アドレスをエラー発生アドレスレジスタ９６に設定し、トラップを発生させる（ステップＳ１００７）。次に、ＣＰＵ２１は、特定した物理アドレスが示す記憶領域を有するメモリに接続されたＣＰＵにとって、ＣＰＵ２１がホームＣＰＵであり、かつ、リクエストに、メモリ２１へダーティのキャッシュデータをライトバックする指示が含まれているか否かを判定する（ステップＳ１００８）。
【０１６４】
ＣＰＵ２１がホームＣＰＵであり、かつ、リクエストに、メモリ２１へダーティのキャッシュデータをライトバックする指示が含まれている場合（ステップＳ１００８肯定）には、ＣＰＵ２１は、次のような処理を行う。すなわち、ＣＰＵ２１は、メモリ２２の共有メモリにライトバックされるキャッシュデータが、ライトバックされなかった異常を示す値を生成し、生成した値をディレクトリ３６ａの所定の領域に書き込む。または、ＣＰＵ２１は、ダウンしたノードによってキャッシュデータがライトバックされるメモリ２２の共有メモリの領域に、エラー状態を示すデータを生成し、生成したデータを書き込む（ステップＳ１００９）。そして、処理を終了する。また、ＣＰＵ２１がホームＣＰＵでないか、または、リクエストに、メモリ２１へダーティのキャッシュデータをライトバックする指示が含まれていない場合（ステップＳ１００８否定）にも、処理を終了する。
【０１６５】
次に、図２８を用いて、ＰＣＩｅ制御部４２がリードのリクエストを送信する際に実行する処理の流れについて説明する。図２８は、ＰＣＩｅ制御部がリードのリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。例えば、ＰＣＩｅ制御部４２は、リクエストに含まれるアクセス先の物理アドレスをＰＡ８３に格納し、リクエストの種類をリクエスト８４に格納する（ステップＳ１１０１）。そして、ＰＣＩｅ制御部４２は、リクエストを他のノードのＣＰＵに送信する（ステップＳ１１０２）。続いて、ＰＣＩｅ制御部４２は、タイマ９１を起動させる（ステップＳ１１０３）。
【０１６６】
その後、ＰＣＩｅ制御部４２は、タイムアウト前に、リクエストに対する応答を受信したか否かを判定する（ステップＳ１１０４）。タイムアウト前に、応答を受信した場合（ステップＳ１１０４肯定）には、ＰＣＩｅ制御部４２は、タイマ９１を停止する（ステップＳ１１０５）。そして、ＰＣＩｅ制御部４２は、応答を処理し（ステップＳ１１０６）、処理を終了する。
【０１６７】
一方、タイムアウト前に、リクエストに対する応答を受信していない場合（ステップＳ１１０４否定）には、ＰＣＩｅ制御部４２は、次のような処理を行う。すなわち、ＰＣＩｅ制御部４２は、当該リクエストに対応するＰＡ８３に格納された物理アドレスを特定し、特定した物理アドレスをエラー発生アドレスレジスタ９８に設定し、トラップを発生させる（ステップＳ１１０７）。次に、ＰＣＩｅ制御部４２は、「ｐｏｉｓｏｎｅｄ  ＴＬＰ」パケットを生成し、生成した「ｐｏｉｓｏｎｅｄ  ＴＬＰ」パケットをＰＣＩｅ接続部２８に送信し（ステップＳ１１０８）、処理を終了する。
【０１６８】
次に、図２９を用いて、ＰＣＩｅ制御部４２がライトのリクエストを送信する際に実行する処理の流れについて説明する。図２９は、ＰＣＩｅ制御部がライトのリクエストを送信する際に実行する処理の流れを説明するためのフローチャートである。例えば、ＰＣＩｅ制御部４２は、リクエストに含まれるアクセス先の物理アドレスをＰＡ８３に格納し、リクエストの種類をリクエスト８４に格納する（ステップＳ１２０１）。そして、ＰＣＩｅ制御部４２は、リクエストを他のノードのＣＰＵに送信する（ステップＳ１２０２）。続いて、ＰＣＩｅ制御部４２は、タイマ９１を起動させる（ステップＳ１２０３）。
【０１６９】
その後、ＰＣＩｅ制御部４２は、タイムアウト前に、リクエストに対する応答を受信したか否かを判定する（ステップＳ１２０４）。タイムアウト前に、応答を受信した場合（ステップＳ１２０４肯定）には、ＰＣＩｅ制御部４２は、タイマ９１を停止する（ステップＳ１２０５）。そして、ＰＣＩｅ制御部４２は、応答を処理し（ステップＳ１２０６）、処理を終了する。
【０１７０】
一方、タイムアウト前に、リクエストに対する応答を受信していない場合（ステップＳ１２０４否定）には、ＰＣＩｅ制御部４２は、次のような処理を行う。すなわち、ＰＣＩｅ制御部４２は、当該リクエストに対応するＰＡ８３に格納された物理アドレスを特定し、特定した物理アドレスをエラー発生アドレスレジスタ９８に設定し、トラップを発生させ（ステップＳ１２０７）、処理を終了する。
【０１７１】
次に、図３０を用いて、トラップが発生することによってＯＳが実行するトラップ処理の流れについて説明する。図３０は、トラップが発生することによってＯＳが実行するトラップ処理の流れを説明するためのフローチャートである。例えば、トラップが発生することによって、ＣＰＵ２１が実行するＯＳは、割込みハンドラを起動させる（ステップＳ１３０１）。割込みハンドラは、トラップの種別を特定する（ステップＳ１３０２）。割込みハンドラは、トラップの種別が、ＣＰＵ２１が検出した他ノードのＣＰＵとの通信エラーで、リード処理中であることを示すか否かを判定する。トラップの種別が、ＣＰＵ２１が検出した他ノードのＣＰＵとの通信エラーで、リード処理中であることを示す場合（Ｓ１３０３肯定）には、割込みハンドラは、次のような処理を行う。すなわち、割込みハンドラは、割込みが発生したときのプログラムカウンタが示すプロセスのシグナルハンドラをシグナルの送信先とする（ステップＳ１３０４）。続いて、割込みハンドラは、シグナルの送信先にシグナルを送信し（ステップＳ１３０５）、処理を終了する。
【０１７２】
また、トラップの種別が、ＣＰＵ２１が検出した他ノードのＣＰＵとの通信エラーで、リード処理中であることを示さない場合（ステップＳ１３０３否定）には、割込みハンドラは、次のような処理を行う。すなわち、割込みハンドラは、トラップの種別が、ＣＰＵ２１が検出した他ノードのＣＰＵとの通信エラーで、ライト処理中であることを示すか否かを判定する（ステップＳ１３０６）。トラップの種別が、ＣＰＵ２１が検出した他ノードのＣＰＵとの通信エラーで、ライト処理中であることを示す場合（ステップＳ１３０６肯定）には、割込みハンドラは、エラー発生アドレスレジスタ９６を読み、物理アドレスを取得する（ステップＳ１３０７）。そして、割込みハンドラは、取得した物理アドレスに対応するシグナルハンドラをハンドラテーブルから検索する（ステップＳ１３０８）。
【０１７３】
なお、ハンドラテーブルは、次のようにして作成される。まず、ＣＰＵ２１が実行するアプリケーションの要求によって、共有領域用の物理アドレスの領域から要求されたサイズのメモリ割当が行われた際に、シグナルハンドラを取得し、取得したシグナルハンドラの関数のエントリアドレスをハンドラテーブルに登録する。そして、ハンドラテーブルへのシグナルハンドラの関数のエントリアドレスの登録時に、ＯＳは、次のような処理を行う。すなわち、ＣＰＵ２１が実行するＯＳは、シグナルハンドラの関数のエントリアドレスに、共有メモリのアドレスと、プロセスの識別子とを対応付けて、ハンドラテーブルに登録する。このようにして、ハンドラテーブルは作成される。
【０１７４】
図３１は、ハンドラテーブルのデータ構造の一例を示す図である。図３１に示すハンドラテーブルは、「共有メモリアドレス」の項目と、「ｐｉｄ」の項目と、「シグナルハンドラの関数のエントリアドレス」の項目とを有する。「共有メモリアドレス」の項目には、「シグナルハンドラの関数のエントリアドレス」の項目にエントリアドレスが登録されたシグナルハンドラに対応する共有メモリのアドレスが登録される。また、「ｐｉｄ」の項目には、「シグナルハンドラの関数のエントリアドレス」の項目にエントリアドレスが登録されたシグナルハンドラに対応するプロセスの識別子が登録される。「シグナルハンドラの関数のエントリアドレス」の項目には、シグナルハンドラの関数のエントリアドレスが登録される。
【０１７５】
図３０に戻り、検索の結果、割込みハンドラは、シグナルハンドラを得ることができたか否かを判定する（ステップＳ１３０９）。シグナルハンドラを得ることができた場合（ステップＳ１３０９肯定）には、割込みハンドラは、得たシグナルハンドラをシグナル送信先とし（ステップＳ１３１０）、ステップＳ１３０５へ進む。一方、シグナルハンドラを得ることができなかった場合（ステップＳ１３０９否定）には、割込みハンドラは、ステップＳ１３０７で取得した物理アドレスが示す共有領域の共有メモリを使用している全プロセスを中断させ（ステップＳ１３１１）、処理を終了する。
【０１７６】
また、トラップの種別が、ＣＰＵ２１が検出した他ノードのＣＰＵとの通信エラーで、ライト処理中であることを示す場合（ステップＳ１３０６否定）には、割込みハンドラは、次のような判定を行うことができる。すなわち、割込みハンドラは、トラップの種別が、ＰＣＩｅ制御部４２が検出した他ノードのＣＰＵとの通信エラーであると判定することができる。そこで、割込みハンドラは、ＰＣＩｅ制御部４２の割込み処理ルーチンを起動する（ステップＳ１３１２）。そして、ＣＰＵ２１が実行する割込み処理では、ＰＣＩｅ制御部４２のエラー発生アドレスレジスタ９８が読まれ、物理アドレスが取得される（ステップＳ１３１３）。
【０１７７】
次に、割込みハンドラは、取得した物理アドレスが示す記憶領域が、共有メモリの共有領域であるか否かを判定する（ステップＳ１３１４）。取得した物理アドレスが示す記憶領域が、共有メモリの共有領域である場合（ステップＳ１３１４肯定）には、ステップＳ１３０８に戻る。一方、取得した物理アドレスが示す記憶領域が、共有メモリの共有領域でない場合（ステップＳ１３１４否定）には、所定の対応する処理を行って（ステップＳ１３１５）、処理を終了する。
【０１７８】
次に、図３２を用いて、シグナルが通知されたシグナルハンドラが実行する処理の流れについて説明する。図３２は、シグナルが通知されたシグナルハンドラが実行する処理の流れを説明するためのフローチャートである。例えば、割込みハンドラは、シグナルをシグナルハンドラに通知して、シグナルハンドラを起動させる（ステップＳ１４０１）。起動されたシグナルハンドラは、シグナルハンドラに通知された物理アドレスから、異常が発生した共有メモリを特定する（ステップＳ１４０２）。シグナルハンドラは、シグナルハンドラに通知された異常が発生したノードの情報から、異常が発生したノードに存在する共有メモリをすべてデタッチする（ステップＳ１４０３）。
【０１７９】
続いて、シグナルハンドラは、異常が発生したノードと共有しているノード２０の共有メモリすべてに対してリカバリ処理を行う（ステップＳ１４０４）。そして、シグナルハンドラは、アプリケーション固有のリカバリ処理を行う（ステップＳ１４０５）。
【０１８０】
アプリケーション固有のリカバリ処理の一例について説明する。例えば、一定間隔でディスクなどの外部記憶装置上に「ｃｈｅｃｋｐｏｉｎｔ」を作成するアプリケーションをＣＰＵ２１が実行する場合には、「ｃｈｅｃｋｐｏｉｎｔ」が示すデータを読み出して、処理を再開するようなリカバリ処理が挙げられる。また、「ｃｈｅｃｋｐｏｉｎｔ」を作成しないアプリケーションをＣＰＵ２１が実行する場合には、再初期化、あるいは、再起動処理を行うようなリカバリ処理が挙げられる。
【０１８１】
また、シグナルが通知されたシグナルハンドラが実行する処理については、上述した処理に限られない。そこで、図３３を用いて、シグナルが通知されたシグナルハンドラが実行する他の処理の流れについて説明する。図３３は、シグナルが通知されたシグナルハンドラが実行する他の処理の流れを説明するためのフローチャートである。例えば、割込みハンドラは、シグナルをシグナルハンドラに通知して、シグナルハンドラを起動させる（ステップＳ１５０１）。起動されたシグナルハンドラは、シグナルハンドラに通知された物理アドレスから、異常が発生した共有メモリを特定する（ステップＳ１５０２）。シグナルハンドラは、シグナルハンドラを実行するＣＰＵ２１を有するノード２０（自ノード）が、異常が発生したノードのメモリを共有メモリとしてアタッチしていたか否かを判定する（ステップＳ１５０３）。自ノードが、異常が発生したノードのメモリを共有メモリとしてアタッチしていない場合（ステップＳ１５０３否定）には、ステップＳ１５０８へ進む。
【０１８２】
一方、自ノードが、異常が発生したノードのメモリを共有メモリとしてアタッチしていた場合（ステップＳ１５０３肯定）には、シグナルハンドラは、次のような処理を行う。すなわち、シグナルハンドラは、シグナルハンドラに通知された異常が発生したノードの情報から、異常が発生したノードに存在する共有メモリをすべてデタッチする（ステップＳ１５０４）。
【０１８３】
続いて、シグナルハンドラは、異常が発生したノードに存在する共有メモリのアドレスをＬ１キャッシュ、Ｌ２キャッシュから削除する（ステップＳ１５０５）。そして、シグナルハンドラは、異常が発生したノードに存在する共有メモリのアドレスを含むエントリをＴＬＢ３５ａから削除する（ステップＳ１５０６）。そして、シグナルハンドラは、シグナルハンドラに通知された物理アドレスを、ＴＬＢミスが発生した場合であっても、ＴＬＢ３５ａに登録を禁止する物理アドレスとする（ステップＳ１５０７）。
【０１８４】
続いて、シグナルハンドラは、自ノードのメモリを、異常が発生したノードが共有メモリとしてアタッチしていたか否かを判定する（ステップＳ１５０８）。自ノードのメモリを、異常が発生したノードが共有メモリとしてアタッチしていた場合（ステップＳ１５０８肯定）には、シグナルハンドラは、異常が発生したノードと共有しているノード２０の共有メモリすべてに対してリカバリ処理を行う（ステップＳ１５０９）。そして、シグナルハンドラは、アプリケーション固有のリカバリ処理を行い（ステップＳ１５１０）、処理を終了する。また、自ノードのメモリを、異常が発生したノードが共有メモリとしてアタッチしていない場合（ステップＳ１５０８否定）にも、処理を終了する。
【０１８５】
［実施例１の効果］
上述したように、情報処理システム１は、一部を共有メモリ領域として設定可能なメモリ２２〜２２ｃを各々が備える複数のノードと、複数のノード間を接続するＸＢ２とを有する。複数のノードの各々は、複数のノード間のデータ転送の異常または他のノードの異常を検出する異常検出部３７ｃ、４２ｃを有する。また、複数のノードの各々は、異常検出部３７ｃ、４２ｃにより検出された異常に基づいて「ｐｏｉｓｏｎｅｄ  ＴＬＰ」パケットや、ディレクトリ３６ａの「ＵＥ」の項目に登録する異常を示す値を生成する。また、複数のノードの各々は、データ転送の要求発行元のノード内のプロセッサに対して割込みを発生する。また、複数のノードの各々のＣＰＵが実行するＯＳは、割込みを受信すると、リカバリ処理を行う。
【０１８６】
すなわち、複数のノードのうち少なくとも１つのノードは、異常検出部を有する。この異常検出部は、当該１つのノード又は他のノードが備える記憶装置に含まれる、当該１つのノード及び当該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路における異常を検出する。また、異常検出部は、当該１つのノード又は当該他のノードが備える記憶装置に含まれる、当該１つのノード及び当該他のノードで共有可能な共有メモリ領域を利用したデータ転送のデータ転送経路に含まれ得るいずれかのノードにおける異常を検出する。また、複数のノードのうち少なくとも１つのノードは、異常検出部により検出された異常に基づいてエラー情報を生成するとともに、自ノード内のプロセッサに対する割り込みを発生するエラー情報生成部を有する。また、複数のノードのうち少なくとも１つのノードは、割り込みに応じてエラー情報に基づいて、リカバリ処理を実行する。
【０１８７】
このように、情報処理システム１では、データ転送中に通信相手のノードがダウンした場合であっても、割込みが通知されたＣＰＵ２１で実行されるＯＳによって、ダウンしたノードによって共有されていた自ノードの共有メモリに対してリカバリ処理が行われる。そのため、通信相手のノードがダウンして相手ノードが共有メモリのデータをキャッシュしていた場合でも、自ノードはダウンしなくてすむ。よって、情報処理システム１によれば、データ転送中にノード間で通信異常が発生した場合であっても、従来技術のように、全ノードがダウンしなくてすむ。したがって、情報処理システム１によれば、ノード間のデータ転送に関わる異常が発生した場合に、エラーの影響範囲を抑えることができる。
【０１８８】
また、情報処理システム１は、ポインタ８０、９０によって、時間を計測する対象のリクエストを切り替えることで、１つのタイマ８１、９１だけで、リクエストが送信されてからのタイムアウトを検出することができる。
【０１８９】
また、情報処理システム１は、受信した物理アドレスに基づいて、アクセス対象が共有領域であるかローカル領域であるかを判別するので、ローカル領域に格納するカーネルデータやユーザデータのセキュリティレベルを高く保つことができる。また、情報処理システム１は、全てのメモリをキャッシュ可能とするので、メモリアクセスにおけるレイテンシを容易に隠蔽することができる。
【０１９０】
また、ＣＰＵ２１は、他のＣＰＵがアクセスするメモリの共有領域に対して、メモリ２２にアクセスする場合と同様の方法でアクセスする。すなわち、ＣＰＵ２１が有する演算部３１は、アクセス対象となる記憶領域がメモリ２２上に存在する場合にも、他のメモリ上に存在する場合にも、論理アドレスを出力するだけでよい。
【０１９１】
このため、ＣＰＵ２１は、Ｉ／Ｏの排他制御等の処理やプログラミング等を実行せずとも、容易に共有領域にアクセスできるため、メモリアクセス性能を向上させることができる。また、ＣＰＵ２１は、実行するプログラムやＯＳに改変を行わずとも、共有メモリを適切に利用することができる結果、プリフェッチ処理の実行を従来と同様に行う事ができるため、メモリアクセスの性能を向上させることができる。
【０１９２】
また、ＣＰＵ２１は、他のＣＰＵからのメモリアクセスの対象がローカル領域へのアクセスであると判定した場合には、否定応答を返信する。このため、情報処理システム１は、共有領域以外へのアクセスを防止する結果、エラーを防ぐことができる。
【０１９３】
また、キャッシュディレクトリ管理部３６は、ノードマップ３４を用いて、物理アドレスをノードマップ３４に対応付けて記憶されたＣＰＵＩＤに変換する。このため、ＣＰＵ２１は、アクセス対象となる物理アドレスが振り分けられたメモリにアクセスするＣＰＵを識別することができる。
【０１９４】
また、ＣＰＵ２１は、メモリ２２に記憶されたデータをキャッシュしたＣＰＵを管理するディレクトリを用いて、キャッシュコヒーレンスの制御を行う。このため、情報処理システム１は、情報処理システム１が有するＣＰＵの数が増加した場合にも、ＸＢ２のトラフィックを増加させることなく、効率的にキャッシュコヒーレンスを保持することができる。
【０１９５】
具体的には、情報処理システム１においては、各ＣＰＵ間の通信が、リモートＣＰＵとホームＣＰＵ間、または、リモートＣＰＵとホームＣＰＵと更新したデータをキャッシュするローカルＣＰＵ間に限定される。このため、情報処理システム１は、効率的にキャッシュコヒーレンスを保持することができる。
【実施例２】
【０１９６】
これまで本発明の実施例について説明したが実施例は、上述した実施例以外にも様々な異なる形態にて実施されてよいものである。そこで、以下では実施例２として本発明に含まれる他の実施例を説明する。
【０１９７】
（１）ノードの異常を検出する方法について、
上述した実施例１では、情報処理システム１が、リクエストのタイムアウトを検出することで、ノードの異常を検出する場合について例示したが、開示のシステムは、これに限定されない。例えば、開示のシステムは、所定の時間間隔で、互いに接続されたサービスプロセッサ間でサービスプロセッサの状況を確認することにより、ノードの異常を検出することもできる。また、開示のシステムは、ＬＡＮ経由でのノード間での「ａｌｉｖｅ  ｃｈｅｃｋ」を、所定の時間間隔で行うことにより、ノードの異常を検出することができる。これにより、リクエストが送信されるタイミングとは、非同期で、ノードの異常を検出することができる。
【０１９８】
図３４は、ノードの異常を検出する方法の一例を説明するための情報処理システムの模式的な図である。図３４の例は、ビルディングボックスを「ＢＢ」と表記した場合を示す。図３４の例では、各ＢＢのＣＰＵは、異常検出回路７２、自ノード番号情報７３、ノードダウン通知部６１、割込発生回路７５、ノードダウン受信部６２、ノードダウン情報レジスタ７４を有する。
【０１９９】
異常検出回路７２は、自ノードの異常を検出する。自ノード番号情報７３は、自ノードの識別番号を示す情報である。ノードダウン通知部６１は、異常検出回路７２で自ノードの異常が検出された場合には、異常の種類、および、自ノード番号情報７３が示す自ノードの識別番号をノードダウン通知パケットに含めてＸＢに送信する。なお、異常の種類の一例としては、ノードダウン、ハング、どのＣＰＵで異常が発生したかを示す情報が挙げられる。また、自ノード番号情報７３が示す情報は、ノードを識別可能な情報であれば何でもよい。例えば、ノードと、ノードに搭載されているＣＰＵとの関係が予め定義されている場合には、ＣＰＵＩＤからノード番号が分かるので、自ノード番号情報７３が示す情報は、ＣＰＵＩＤでもよい。
【０２００】
ノードダウン受信部６２は、ＸＢから送信されたノードダウン通知パケットを受信すると、ノードダウン通知パケットに含まれる異常の種類、および、自ノードの識別番号をノードダウン情報レジスタ７４に設定する。ノードダウン情報レジスタ７４に異常の種類、および、自ノードの識別番号が設定されると、この設定された情報を用いて、ソフトウェアが異常の対処を行うことができる。また、ノードダウン受信部６２は、ノードダウン通知パケットを受信すると、割込発生回路７５に割込みを発生させるための制御信号を出力する。割込発生回路７５は、ノードダウン受信部６２から制御信号を受信すると、実施例１と同様に、割込みを発生させる。そのため、この割込みにより、割込みが発生してからの処理については、実施例１と同様の処理が行われる。
【０２０１】
図３４の例では、各ＢＢのＡＳＩＣは、異常検出回路７０、自ノード番号情報７１、ノードダウン通知部６０を有する。
【０２０２】
異常検出回路７０は、自ノードの異常を検出する。自ノード番号情報７１は、自ノードの識別番号を示す情報である。ノードダウン通知部６０は、異常検出回路７０で自ノードの異常が検出された場合には、異常の種類、および、自ノード番号情報７１が示す自ノードの識別番号をノードダウン通知パケットに含めてＸＢに送信する。
【０２０３】
ノードダウン通知部６０、６１は、複数のノードダウン通知パケットをＸＢに送信して、複数のＣＰＵにノードダウン通知パケットを送信することができる。また、ノードダウン通知部６０、６１は、１つのノードダウン通知パケットをＸＢに送信して、ＸＢが複数のＣＰＵにノードダウン通知パケットを送信することもできる。また、ノードダウン通知部６０、６１は、ノードごとに１つのＣＰＵに、ノードダウン通知パケットを送信することもできる。
【０２０４】
図３５を用いて、実施例１の異常検出方法とは異なる方法を用いた場合の処理の流れについて説明する。図３５は、実施例１の異常検出方法とは異なる方法を用いた場合の処理の流れを説明するためのフローチャートである。例えば、ＣＰＵ２１は、実施例２において上述した異常検出方法のいずれかを用いて、ノードの異常が検出されたか否かを判定する（ステップＳ１６０１）。ノードの異常が検出されない場合（ステップＳ１６０１否定）には、ＣＰＵ２１は、再び、ステップＳ１６０１での判定を行う。一方、ノードの異常が検出された場合（ステップＳ１６０１肯定）には、ＣＰＵ２１は、異常が検出されたノードが、リモートノードであるか否かを判定する（ステップＳ１６０２）。
【０２０５】
異常が検出されたノードが、リモートノードである場合（ステップＳ１６０２肯定）には、ＣＰＵ２１が実行するＯＳが、次のような処理を行う。すなわち、ＯＳが、自ノード２０のディレクトリ３６ａについて、異常が発生したノードの情報が残っている場合には、ディレクトリ３６ａの整合性をとり（ステップＳ１６０３）、処理を終了する。ここで、ディレクトリの整合性のとりかたの一例を説明する。例えば、ＣＰＵ２１は、ダウンしたノードがデータをキャッシュしているが、キャッシュの状態は、「ｃｌｅａｎ」である場合には、次のような処理を行う。すなわち、ＣＰＵ２１は、その「ｃｌｅａｎ」であるキャッシュのディレクトリ３６ａの情報を「ダウンしたノードがキャッシュを持っていない」状態に変更するリカバリ処理を行う。また、ＣＰＵ２１は、ダウンしたノードがデータをキャッシュしており、キャッシュの状態は、「ｄｉｒｔｙ」である場合には、次のような処理を行う。すなわち、ＣＰＵ２１は、「ｄｉｒｔｙ」であるキャッシュラインをエラー状態に変更するリカバリ処理を行う。
【０２０６】
一方、異常が検出されたノードが、リモートノードでない場合、すなわち、ホームノードである場合（ステップＳ１６０２否定）には、ＣＰＵ２１が実行するＯＳが、次のような処理を行う。すなわち、ＯＳが、自ノードのキャッシュについて、異常が発生したノードの情報が残っている場合には、キャッシュのノードの情報を削除する（ステップＳ１６０４）。そして、ＯＳが、異常が発生したノードの物理アドレスが、自ノードのＴＬＢ３５ａに登録されている場合には、異常が発生したノードの物理アドレスを含むエントリをすべて削除し（ステップＳ１６０５）、処理を終了する。
【０２０７】
次に、情報処理システム１が、クラスタ動作を行うアプリケーションである場合には、クラスタソフトウェアにおいて、クラスタ管理マネージャがノードダウンを検出できる。そこで、クラスタ管理マネージャが異常を検出した場合の処理の流れについて、図３６を用いて説明する。図３６は、クラスタ管理マネージャが異常を検出した場合の処理の流れを説明するためのフローチャートである。例えば、クラスタ管理マネージャが、ノードの異常を検出したか否かを判定する（ステップＳ１７０１）。ノードの異常を検出しない場合（ステップＳ１７０１否定）には、クラスタ管理マネージャは、再び、ステップＳ１７０１の処理を行う。
【０２０８】
一方、ノードの異常を検出した場合（ステップＳ１７０１肯定）には、クラスタ管理マネージャが、自ノードで動作中のアプリケーションに、ノードダウンによる再構成処理の開始を依頼する（ステップＳ１７０２）。続いて、アプリケーションは、異常が発生したノードに存在する共有メモリの解放をＯＳに依頼する（ステップＳ１７０３）。その後、ＯＳは、解放した共有メモリのデータを削除し、ＴＬＢのエントリを削除する（ステップＳ１７０４）。アプリケーションは、固有のリカバリ処理を行い（ステップＳ１７０５）、処理を終了する。
【０２０９】
（２）ビルディングブロックについて
上述した情報処理システム１は、４つのＣＰＵを有するビルディングブロック１０〜１０ｅを有していた。しかし、実施例はこれに限定されるものではなく、ビルディングブロック１０〜１０ｅは、任意の数のＣＰＵ及び各ＣＰＵがアクセスするメモリを有することができる。また、ＣＰＵとメモリは、１対１で対応している必要はなく、メモリに直接アクセスするＣＰＵは全体の一部であってもよい。
【０２１０】
（３）ＣＰＵが送信するパケットについて
上述したＣＰＵ２１は、ＣＰＵＩＤとＰＡとを有するパケットをメモリアクセスのリクエストとして送信した。しかし、実施例は、これに限定されるものではない。すなわち、ＣＰＵ２１は、アクセス対象となるメモリにアクセスするＣＰＵを一意に識別できるのであれば、任意の情報を格納したパケットを出力してよい。
【０２１１】
また例えば、ＣＰＵ２１は、ＣＰＵＩＤからＶＣ（Virtual  Connection）ＩＤに変換し、ＶＣＩＤを格納することとしてもよい。また、ＣＰＵ２１は、パケットに、データ長を示すレングス等の情報を格納することとしてもよい。
【０２１２】
（４）ＣＰＵが発行するオーダー（命令）について
上述したように、各ＣＰＵ２１〜２１ｃは、リクエストやオーダーを発行して、キャッシュのコヒーレンスを保持した。しかし、上述したリクエストやオーダーは、あくまで一例であり、例えばＣＰＵ２１〜２１ｃは、ＣＡＳ（Ｃｏｍｐａｒｅ  ＡｎｄＳｗａｐ）命令を発行してもよい。
【０２１３】
このように、ＣＰＵ２１〜２１ｃがＣＡＳ命令を発行した場合には、排他制御のコンテンションが複数のＣＰＵ間で頻発しても、各ＣＰＵのキャッシュ上で処理が行われる。この結果、ＣＰＵ２１〜２１ｃは、メモリアクセスの発生による遅延を防止するとともに、各ＣＰＵ間のドランザクションが混雑するのを防ぐことができる。
【０２１４】
（５）ハイパーバイザを経由した制御について
上述した情報処理システム１では、ＯＳによってハードウェアであるアドレス変換部３５にアクセスを行う例について説明した。しかし、実施例はこれに限定されるものではなく、たとえは、仮想マシンを動作させるハイパーバイザ（ＨＰＶ：Hypervisor）がアドレス変換部３５にアクセスを行っても良い。
【０２１５】
すなわち、ハイパーバイザが動作するノードにおいては、ＯＳは、キャッシュやＭＭＵなどのＣＰＵ２１〜２１ｃのハードウェア資源に対して直接の操作を行わず、操作をハイパーバイザに依頼することとなる。このように、各ＣＰＵ２１〜２１ｃは、ハイパーバイザを介した制御を受付ける場合には、仮想アドレスを実アドレス（ＲＡ：Real  Address）に変換し、その後、実アドレスを物理アドレスに変換することとなる。
【０２１６】
また、ハイパーバイザが動作するノードにおいては、割り込み処理は、ＯＳには直接割り込まず、ＨＰＶに対して割り込みを行う。このような場合には、ハイパーバイザが、ＯＳの割り込み処理ハンドラを読出すことで割り込みを行う。なお、上述したハイパーバイザが実行する処理は、仮想マシンを動作させるために実行される公知な処理である。
【０２１７】
（６）パーティションを用いた処理について
上述した情報処理システム１では、各ＣＰＵ２１〜２１ｃは、１つのノードマップを用いてメモリアクセスを送信していた。しかし、実施例はこれに限定されるものではない。例えば、各ビルディングブロック１０〜１０ｅは、複数のノード群として動作し、各ノード群毎に、同一のファームウェア（ハイパーバイザ）を動作させる１つの論理パーティションを構成しても良い。
【０２１８】
このような場合には、各ＣＰＵ２１〜２１ｃは、アクセス先のＣＰＵを示すノードマップと、同一論理パーティション内のＣＰＵを示すノードマップとを有する。このように、各ＣＰＵ２１〜２１ｃは、同一論理パーティション内に含まれるＣＰＵを示すノードマップを有することで、エラー発生通知、ダウン要求、リセット要求パケット等の、論理パーティションを超えて転送すべきではない特殊パケットの転送範囲を識別することができる。
【０２１９】
以下、同一論理パーティション内に含まれるＣＰＵを示すノードマップを有するＣＰＵについて説明する。図３７は、情報処理システムの一例を説明するための図である。図３７に示すように、ビルディングブロック１０、１０ａは、論理パーティション＃Ａを動作させ、ビルディングブロック１０ｂ〜１０ｄは、論理パーティション＃Ｂを動作させる。
【０２２０】
ここで、論理パーティション＃Ａでは、複数のドメイン＃Ａ〜＃Ｃと、ファームウェア＃Ａが動作する。また、論理パーティション＃Ｂでは、複数のドメイン＃Ｄ〜＃Ｇとファームウェア＃Ｂが動作する。なお、ファームウェア＃Ａおよびファームウェア＃Ｂとは、例えばハイパーバイザである。また、ドメイン＃Ａでは、アプリケーションとＯＳとが動作しており、他のドメイン＃Ｂ〜＃Ｇもドメイン＃Ａと同様に、アプリケーションとＯＳとが動作する。
【０２２１】
つまり、各ドメイン＃Ａ〜＃Ｇは、それぞれ独立してアプリケーションとＯＳが動作する仮想マシンである。ここで、ビルディングブロック１０が有する各ＣＰＵ２１〜２１ｃは、パーティション＃Ａに含まれる各ＣＰＵに対して上述した特殊パケットを送信してもよいが、パーティション＃Ｂに含まれる各ＣＰＵに対しては特殊パケットを送信すべきではない。
【０２２２】
このため、各ビルディングブロック１０〜１０ｄのＣＰＵは、同一の論理パーティションに含まれるＣＰＵのＣＰＵＩＤを示すノードマップを有する。例えば、ＣＰＵ２１は、物理アドレスと、物理アドレスが示す記憶領域を有するメモリと接続されたＣＰＵのＣＰＵＩＤとを対応付けて記憶するノードマップ３４を有する。また、ＣＰＵ２１は、ＣＰＵ２１と同一のパーティション、すなわち、パーティション＃Ａに含まれるＣＰＵのＣＰＵＩＤを記憶するノードマップ３４ａを有する。なお、ノードマップ３４ａは、ノードマップ３４と同様に、サービスプロセッサ２４によって設定されるものとする。
【０２２３】
以下、図面を用いて、同一の論理パーティションに含まれるＣＰＵのＣＰＵＩＤを示すノードマップの一例について説明する。図３８は、パーティションの一例を説明するための図である。例えば、図３８に示す例では、パーティション＃Ａは、ビルディングブロック＃０を有する。また、ビルディングブロック＃０は、ＣＰＵ＃０とアドレス域「＃０」が割当てられたメモリとを有する。
【０２２４】
また、パーティション＃Ｂは、ビルディングブロック＃１とビルディングブロック＃２とを有する。また、ビルディングブロック＃１は、ＣＰＵ＃４、ＣＰＵ＃５、アドレス域「＃１」が割当てられたメモリ、アドレス域「＃２」が割当てられたメモリを有する。なお、アドレス域「＃１」が割当てられたメモリには、ＣＰＵ＃４がアクセスし、アドレス域「＃２」が割当てられたメモリには、ＣＰＵ＃５がアクセスする。また、ビルディングブロック＃２は、ＣＰＵ＃８とアドレス域「＃３」が割当てられたメモリを有する。
【０２２５】
次に、図３９Ａ〜３９Ｃを用いて、図３８に示すＣＰＵ＃０が有するノードマップと、ＣＰＵ＃４が有するノードマップとについて説明する。まず、図３９Ａおよび図３９Ｂを用いて、パーティション＃ＡのＣＰＵが記憶するノードマップについて説明する。なお、図３９Ａは、パーティション＃ＡのＣＰＵが記憶するノードマップの一例を説明するための図である。また、図３９Ｂは、パーティション＃Ａを示すノードマップの一例を説明するための図である。
【０２２６】
なお、以下の説明では、ノードＩＤ「０」は、ビルディングブロック＃０を示し、ノードＩＤ「１」は、ビルディングブロック＃１を示す、ノードＩＤ「２」は、ビルディングブロック＃２を示す。また、ＣＰＵＩＤ「０」は、ＣＰＵ＃０のＣＰＵＩＤであり、ＣＰＵＩＤ「４」は、ＣＰＵ＃４のＣＰＵＩＤであり、ＣＰＵＩＤ「５」は、ＣＰＵ＃５のＣＰＵＩＤであり、ＣＰＵＩＤ「８」は、ＣＰＵ＃８のＣＰＵＩＤであるものとする。
【０２２７】
例えば、図３９Ａに示す例では、ノードマップ３４は、アドレス域「＃０」が、ビルディングブロック＃０に存在し、ＣＰＵ＃０がアクセスを行う旨を示す。また、ノードマップ３４は、アドレス域「＃１」が、ビルディングブロック＃１に存在し、ＣＰＵ＃４がアクセスを行う旨を示す。また、ノードマップ３４は、アドレス域「＃２」が、ビルディングブロック＃１に存在し、ＣＰＵ＃５がアクセスを行う旨を示す。また、ノードマップ３４は、アドレス域「＃３」がビルディングブロック＃２に存在し、ＣＰＵ＃８がアクセスを行う旨を示す。
【０２２８】
また、図３９Ｂには、パーティション＃Ａを示すノードマップを示した。図３９Ｂに示すように、パーティション＃Ａを示すノードマップは、各エントリに、バリッドと、ノードＩＤとＣＰＵＩＤとを有する。例えば、図３９Ｂに示す例では、ノードマップは、パーティション＃Ａにビルディングブロック＃０のＣＰＵ＃０が含まれる旨を示す。
【０２２９】
例えば、図３８に示す例では、ＣＰＵ＃０は、図３９Ａおよび図３９Ｂに示すノードマップを有する。そして、ＣＰＵ＃０は、メモリアクセスを行う場合には、図３９Ａに示すノードマップを用いて、アクセス先のＣＰＵを識別する。一方、ＣＰＵ＃０は、同一パーティション内のＣＰＵのみに特殊パケットを送信する場合には、図３９Ｂに示すノードマップを用いて、送信先のＣＰＵを識別する。すなわち、ＣＰＵ＃０は、図３９Ｂに例示するノードマップが示すパーティション＃Ａ内のＣＰＵに対して、特殊パケットを送信する。
【０２３０】
一方、ＣＰＵ＃４は、メモリアクセスを行うために、図３９Ａに示すノードマップと、図３９Ｃに示すノードマップとを有する。ここで、図３９Ｃは、パーティション＃Ｂを示すノードマップの一例を説明するための図である。図３９Ｃに示す例では、パーティション＃Ｂを示すノードマップは、パーティション＃Ｂに、ビルディングブロック＃１のＣＰＵ＃４およびＣＰＵ＃５、ビルディングブロック＃２のＣＰＵ３８が存在することを示す。ＣＰＵ＃４は、図３９Ｃに例示するノードマップが示すパーティション＃Ｂ内のＣＰＵに対して、特殊パケットを送信する。
【０２３１】
このように、ＣＰＵ＃１およびＣＰＵ＃４は、アドレス域とＣＰＵＩＤとを対応付けたノードマップと、パーティションを示すノードマップとを記憶する。そして、ＣＰＵ＃１およびＣＰＵ＃４は、アドレス域とＣＰＵＩＤとを対応付けたノードマップを用いて、他のノードが有するメモリに対して直接メモリアクセスを行う。また、ＣＰＵ＃１は、パーティション＃Ａを示すノードマップを用いて、特殊パケットの送信を行う。また、ＣＰＵ＃４は、パーティション＃Ｂを示すノードマップを用いて、特殊パケットの送信を行う。
【０２３２】
このように、各ＣＰＵは、自身を含むパーティションごとに、異なる値を有するノードマップを有してもよい。また、各ＣＰＵは、自身を含むパーティションごとに異なる値を有するノードマップを有する場合は、特殊パケットをパーティションを超えた送信を行うことを防ぐことができる。
【０２３３】
なお、各ＣＰＵは、上記の実施例と同様、スタートアドレスとアドレスマスク、又は、スタートアドレスとレングスでアクセス対象となるアドレス域を示しても良い。すなわち、ＣＰＵ＃１とＣＰＵ＃４とは、スタートアドレスとアドレスマスク、又は、スタートアドレスとレングスとを用いて、アクセス対象となるアドレス域を示すノードマップを用いて、アクセス対象となるノードを識別する。また、ＣＰＵ＃１とＣＰＵ＃４とは、それぞれ異なるパーティションを示すノードマップを用いて、特殊パケットの送信を行う。
【０２３４】
（７）サービスプロセッサを経由した制御について
上述した情報処理システム１では、サービスプロセッサ２４によってハードウェアであるノードマップ３４にアクセスを行う例について説明した。しかし、実施例はこれに限定されるものではなく、サービスプロセッサ２４以外がノードマップ３４にアクセスするよう構成しても良い。たとえば、ＣＰＵ２１〜２１ｃ上の一つあるいはすべてのＣＰＵで動作している基本ファームウェアＢＩＯＳ(Basic  Input/Output  System)あるいはＨＰＶなどがノードマップ３４にアクセスを行えるよう構成しても良い。
【符号の説明】
【０２３５】
１    情報処理システム
２    ＸＢ
１０〜１０ｅ  ビルディングブロック
２０    ノード
２１〜２１ｃ  ＣＰＵ
２２〜２２ｃ  メモリ
２３、２６  通信部
２４    サービスプロセッサ
２５    制御部
２７、２７ａ  ＸＢ接続部
２８    ＰＣＩｅ接続部
３０    演算処理部
３１    演算部
３２    Ｌ１キャッシュ
３３    Ｌ２キャッシュ
３４    ノードマップ
３５    アドレス変換部
３６    キャッシュディレクトリ管理部
３７    パケット制御部
３７ａ  パケット生成部
３７ｂ  パケット受信部
３７ｃ  異常検出部
４０    ルータ
４１    メモリアクセス部
４２    ＰＣＩｅ制御部
４２ａ  リクエスト生成部
４２ｂ  ＰＣＩｅバス制御部
４２ｃ  異常検出部
【図１】
0005590022.tif 000002
【図２】
0005590022.tif 000003
【図３】
0005590022.tif 000004
【図４】
0005590022.tif 000005
【図５】
0005590022.tif 000006
【図６】
0005590022.tif 000007
【図７】
0005590022.tif 000008
【図８】
0005590022.tif 000009
【図９】
0005590022.tif 000010
【図１０】
0005590022.tif 000011
【図１１】
0005590022.tif 000012
【図１２】
0005590022.tif 000013
【図１３】
0005590022.tif 000014
【図１４】
0005590022.tif 000015
【図１５】
0005590022.tif 000016
【図１６】
0005590022.tif 000017
【図１７】
0005590022.tif 000018
【図１８】
0005590022.tif 000019
【図１９】
0005590022.tif 000020
【図２０】
0005590022.tif 000021
【図２１】
0005590022.tif 000022
【図２２】
0005590022.tif 000023
【図２３】
0005590022.tif 000024
【図２４】
0005590022.tif 000025
【図２５】
0005590022.tif 000026
【図２６】
0005590022.tif 000027
【図２７】
0005590022.tif 000028
【図２８】
0005590022.tif 000029
【図２９】
0005590022.tif 000030
【図３０】
0005590022.tif 000031
【図３１】
0005590022.tif 000032
【図３２】
0005590022.tif 000033
【図３３】
0005590022.tif 000034
【図３４】
0005590022.tif 000035
【図３５】
0005590022.tif 000036
【図３６】
0005590022.tif 000037
【図３７】
0005590022.tif 000038
【図３８】
0005590022.tif 000039
【図３９Ａ】
0005590022.tif 000040
【図３９Ｂ】
0005590022.tif 000041
【図３９Ｃ】
0005590022.tif 000042