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